SoapHttpClientProtocol.Discover Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Dynamicky vytvoří vazbu na webovou službu XML popsanou v dokumentu zjišťování na adrese Url.
public:
void Discover();
public void Discover ();
member this.Discover : unit -> unit
Public Sub Discover ()
Výjimky
Vazba definovaná ve třídě proxy nebyla nalezena v dokumentu zjišťování na adrese Url.
-nebo-
Třída proxy nemá definovanou vazbu.
Příklady
Následující příklad kódu je třída proxy vygenerovaná pomocí nástroje Wsdl.exe pro Math
webovou službu XML. Použije WebServiceBindingAttribute se na třídu proxy, která Math
nastaví název vazby na MathSoap
a její obor názvů na http://tempuri.org/
.
#using <System.Web.Services.dll>
#using <System.Xml.dll>
#using <System.dll>
using namespace System::Diagnostics;
using namespace System::Xml::Serialization;
using namespace System;
using namespace System::Web::Services::Protocols;
using namespace System::Web::Services;
namespace MyMath
{
[System::Web::Services::WebServiceBindingAttribute(Name="MathSoap",Namespace="http://tempuri.org/")]
public ref class Math: public System::Web::Services::Protocols::SoapHttpClientProtocol
{
public:
[System::Diagnostics::DebuggerStepThroughAttribute]
Math()
{
this->Url = "http://www.contoso.com/math.asmx";
}
[System::Diagnostics::DebuggerStepThroughAttribute]
[System::Web::Services::Protocols::SoapDocumentMethodAttribute("http://tempuri.org/Add",
Use=System::Web::Services::Description::SoapBindingUse::Literal,
ParameterStyle=System::Web::Services::Protocols::SoapParameterStyle::Wrapped)]
int Add( int num1, int num2 )
{
array<Object^>^temp0 = {num1,num2};
array<Object^>^results = this->Invoke( "Add", temp0 );
return *dynamic_cast<int^>(results[ 0 ]);
}
[System::Diagnostics::DebuggerStepThroughAttribute]
System::IAsyncResult^ BeginAdd( int num1, int num2, System::AsyncCallback^ callback, Object^ asyncState )
{
array<Object^>^temp1 = {num1,num2};
return this->BeginInvoke( "Add", temp1, callback, asyncState );
}
[System::Diagnostics::DebuggerStepThroughAttribute]
int EndAdd( System::IAsyncResult^ asyncResult )
{
array<Object^>^results = this->EndInvoke( asyncResult );
return *dynamic_cast<int^>(results[ 0 ]);
}
};
}
namespace MyMath {
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.Web.Services;
[System.Web.Services.WebServiceBindingAttribute(Name="MathSoap", Namespace="http://tempuri.org/")]
public class Math : System.Web.Services.Protocols.SoapHttpClientProtocol {
[System.Diagnostics.DebuggerStepThroughAttribute()]
public Math() {
this.Url = "http://www.contoso.com/math.asmx";
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Add", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public int Add(int num1, int num2) {
object[] results = this.Invoke("Add", new object[] {num1,
num2});
return ((int)(results[0]));
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
public System.IAsyncResult BeginAdd(int num1, int num2, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("Add", new object[] {num1,
num2}, callback, asyncState);
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
public int EndAdd(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((int)(results[0]));
}
}
}
Namespace MyMath
<System.Web.Services.WebServiceBindingAttribute(Name:="MathSoap", [Namespace]:="http://tempuri.org/")> _
Public Class Math
Inherits System.Web.Services.Protocols.SoapHttpClientProtocol
<System.Diagnostics.DebuggerStepThroughAttribute()> _
Public Sub New()
MyBase.New
Me.Url = "http://www.contoso.com/math.asmx"
End Sub
<System.Diagnostics.DebuggerStepThroughAttribute(), _
System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Add", Use:=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)> _
Public Function Add(ByVal num1 As Integer, ByVal num2 As Integer) As Integer
Dim results() As Object = Me.Invoke("Add", New Object() {num1, num2})
Return CType(results(0),Integer)
End Function
<System.Diagnostics.DebuggerStepThroughAttribute()> _
Public Function BeginAdd(ByVal num1 As Integer, ByVal num2 As Integer, ByVal callback As System.AsyncCallback, ByVal asyncState As Object) As System.IAsyncResult
Return Me.BeginInvoke("Add", New Object() {num1, num2}, callback, asyncState)
End Function
<System.Diagnostics.DebuggerStepThroughAttribute()> _
Public Function EndAdd(ByVal asyncResult As System.IAsyncResult) As Integer
Dim results() As Object = Me.EndInvoke(asyncResult)
Return CType(results(0),Integer)
End Function
End Class
End Namespace
Následující příklad kódu je klient webové služby, který používá předchozí třídu proxy.
EnterBtn_Click
V rámci události webového formuláře volá klient webové služby XML metoduDiscover, která se pokouší dynamicky vytvořit vazbu na adresu URL zadanou uživatelem.
Důležité
Tento příklad obsahuje textové pole, které přijímá vstup uživatele, což je potenciální bezpečnostní hrozba. Ve výchozím nastavení ASP.NET webové stránky ověřte, že uživatelský vstup neobsahuje skript nebo elementy HTML. Další informace najdete v tématu Přehled zneužití skriptů.
<%@ Page Language="C#" %>
<html>
<script language="C#" runat="server">
void EnterBtn_Click(Object Src, EventArgs E)
{
MyMath.Math math = new MyMath.Math();
// If the user types in a URL, attempt to dynamically bind to it.
if (DiscoURL.Text != String.Empty)
{
math.Url = DiscoURL.Text;
try
{ math.Discover();}
catch (Exception)
{
DiscoURL.Text = "Could not bind to MathSoap bindng at given URL. ";
}
}
// Call the Add XML Web service method.
int total = math.Add(Convert.ToInt32(Num1.Text),Convert.ToInt32(Num2.Text));
Total.Text = "Total: " + total.ToString();
}
</script>
<body>
<form action="MathClient.aspx" runat=server>
Enter the URL of a disdovery document describing the MathSoap binding.
<p>
<asp:textbox id="DiscoURL" runat=server Columns=80/>
<p><p>
Enter the two numbers you want to add and then press the Total button.
<p>
Number 1: <asp:textbox id="Num1" runat=server/> +
Number 2: <asp:textbox id="Num2" runat=server/> =
<asp:button text="Total" Onclick="EnterBtn_Click" runat=server/>
<p>
<asp:label id="Total" runat=server/>
</form>
</body>
</html>
<%@ Page Language="VB" %>
<html>
<script language="VB" runat="server">
Sub EnterBtn_Click(Src As Object, E As EventArgs)
Dim math As New Math()
Dim result As Integer
' If the user types in a URL, attempt to dynamically bind to it.
If DiscoURL.Text <> String.Empty Then
math.Url = DiscoURL.Text
Try
math.Discover()
Catch except As Exception
DiscoURL.Text = "Could not bind to MathSoap bindng at given URL."
End Try
End If
' Call to Add XML Web service method.
result = math.Add(Convert.ToInt32(Num1.Text),Convert.ToInt32(Num2.Text))
Total.Text = "Total: " & result.ToString()
End Sub 'EnterBtn_Click
</script>
<body>
<form action="MathClient.aspx" runat=server>
Enter the URL of a disdovery document describing the MathSoap binding.
<p>
<asp:textbox id="DiscoURL" runat=server Columns=80/>
<p><p>
Enter the two numbers you want to add and then press the Total button.
<p>
Number 1: <asp:textbox id="Num1" runat=server/> +
Number 2: <asp:textbox id="Num2" runat=server/> =
<asp:button text="Total" Onclick="EnterBtn_Click" runat=server/>
<p>
<asp:label id="Total" runat=server/>
</form>
</body>
</html>
Poznámky
Klient webové služby XML může dynamicky vytvořit vazbu na jinou webovou službu XML, než na která odkazuje třída proxy pomocí Discover metody . Vlastnost Url obvykle odkazuje na základní adresu webové služby XML. Před vyvoláním Discover metody však nastavte Url vlastnost na adresu URL dokumentu zjišťování. Metoda se Discover pokusí najít v dokumentu zjišťování shodu s vazbou definovanou ve třídě proxy a pak s ní dynamicky navázat. V případě úspěchu jsou následná volání metody směrována na webovou službu XML popsanou v dokumentu zjišťování.
Pokud je třída proxy sestavena pomocí nástroje Web Services Description Language (Wsdl.exe), třída proxy definuje vazbu implementovanou metodami webové služby XML, které vyvolá pomocí WebServiceBindingAttribute. Když webová služba XML implementuje více vazeb, Wsdl.exe vytvoří třídu proxy pro každou vazbu. U každé třídy proxy serveru se WebServiceBindingAttribute používá třída , která definuje název vazby a její obor názvů. Dokument zjišťování, na který Url nastavíte vlastnost , musí obsahovat odkaz na webovou službu XML, která implementuje stejný název vazby a obor názvů, jinak dojde k výjimce.