DiscoveryClientProtocol Class

Provides support for programmatically invoking XML Web services discovery.

Namespace:  System.Web.Services.Discovery
Assembly:  System.Web.Services (in System.Web.Services.dll)

public class DiscoveryClientProtocol : HttpWebClientProtocol

XML Web service discovery is the process of locating, or discovering, one or more related documents that describe available XML Web services. It is through XML Web services discovery that XML Web service clients learn about the available XML Web services at a given URL and how to use them. XML Web services discovery works from the premise that you have already obtained the URL to a discovery document, possibly through a directory service, such as, however, you do not have the details about the XML Web services offered. Through XML Web services discovery, you can discover the details about the XML Web services listed in a DiscoveryDocument at a specific URL.

An XML Web service client starts XML Web services discovery by supplying a URL to either the Discover or DiscoverAny methods. Typically, this URL refers to a discovery document, which in turn refers to documents that describe one or more XML Web services, which are added to the References property. At that point, only that document is downloaded and verified to point to valid information about XML Web services. However, the references contained in that document are not verified at this stage. Instead they are added to the References property. To verify that the references are valid, invoke the ResolveAll or ResolveOneLevel methods, which add valid referenced documents to the Documents property. Last, if a client wants to save the discovery results to disk, invoke the WriteAll method.

If programmatic access to XML Web services discovery is not needed, the Windows Software Development Kit (SDK) ships the Web Services Discovery tool (Disco.exe) for discovering XML Web services within a command prompt. For more details, see [<topic://cpgrfwebservicesdiscoverytooldiscoexe>].

The following code example is a Web Form demonstrating how to use the DiscoveryClientProtocol class together with the other classes in the System.Web.Services.Discovery namespace to programmatically invoke XML Web services discovery. The code example demonstrates using the Discover, DiscoverAny, Discover, ResolveAll, ResolveOneLevel, ReadAll and WriteAll methods.

Security noteSecurity Note:

This example has a text box that accepts user input, which is a potential security threat. By default, ASP.NET Web pages validate that user input does not include script or HTML elements. For more information, see Script Exploits Overview.

<%@ Page Language="C#" Debug="true" %>

<%@ Import Namespace="System.Web.Services.Discovery" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Data" %>

   protected void Discover_Click(object Source, EventArgs e)
	// Specify the URL to discover.
	string sourceUrl = DiscoURL.Text;
	// Specify the URL to save discovery results to or read from.
	string outputDirectory = DiscoDir.Text;

        DiscoveryClientProtocol client = new DiscoveryClientProtocol();
	// Use default credentials to access the URL being discovered.
        client.Credentials = CredentialCache.DefaultCredentials;

        try {
       	  DiscoveryDocument doc;
	  // Check to see if whether the user wanted to read in existing discovery results. 
   	  if (DiscoverMode.Value == "ReadAll") 
	     DiscoveryClientResultCollection results = client.ReadAll(Path.Combine(DiscoDir.Text,"results.discomap"));
			SaveMode.Value = "NoSave";						
	    // Check to see if whether the user wants the capability to discover any kind of discoverable document. 
	    if (DiscoverMode.Value == "DiscoverAny") 
	      doc = client.DiscoverAny(sourceUrl);
	    // Discover only discovery documents, which might contain references to other types of discoverable documents.
	      doc = client.Discover(sourceUrl);
	    // Check to see whether the user wants to resolve all possible references from the supplied URL. 
 	    if (ResolveMode.Value == "ResolveAll")
		// Check to see whether the user wants to resolve references nested more than one level deep. 
	      	if (ResolveMode.Value == "ResolveOneLevel")  
		   Status.Text = String.Empty;
        catch ( Exception e2) 
          Status.Text = e2.Message;
	// If documents were discovered, display the results in a data grid. 
        if (client.Documents.Count > 0)

	// If the user also asked to have the results saved to the Web server, do so. 
        if (SaveMode.Value == "Save") 
          DiscoveryClientResultCollection results = client.WriteAll(outputDirectory, "results.discomap");
 	  Status.Text = "The following file holds the links to each of the discovery results: <b>" + 
	                                Path.Combine(outputDirectory,"results.discomap") + "</b>";


      protected void PopulateGrid(DiscoveryClientProtocol client) 
         DataTable dt = new DataTable();
         DataRow dr;

         dt.Columns.Add(new DataColumn("Discovery Document"));
         dt.Columns.Add(new DataColumn("References"));
         dt.Columns.Add(new DataColumn("Type"));

         foreach (DictionaryEntry entry in client.Documents) 
                dr = dt.NewRow();
  		dr[0] = (string) entry.Key;
		dr[2] = entry.Value.GetType();
		if (entry.Value is DiscoveryDocument)
	  	  DiscoveryDocument discoDoc = (DiscoveryDocument) entry.Value;
		  foreach (DiscoveryReference discoref in discoDoc.References)
		    dr = dt.NewRow();
		    dr[1] = discoref.Url;
		    dr[2] = discoref.GetType();
        DataView dv = new DataView(dt);
	DiscoveryResultsGrid.DataSource = (ICollection) dv;

	<H3> <p align="center"> Discovery Class Sample </p> </H3>
	 Enter the URL to discover:
        <asp:textbox id=DiscoURL Columns=60 runat="SERVER" /><p>

       Discovery Mode:
       <select id="DiscoverMode" size=1 runat="SERVER">
	     <option Value="DiscoverAny">Discover any of the discovery types</option>
             <option Value="Discover">Discover just discovery documents</option>
             <option Value="ReadAll">Read in saved discovery results</option>
	</select> <p>

       Resolve References Mode:
       <select id="ResolveMode" size=1 runat="SERVER">
             <option Value="ResolveAll">Resolve all references</option>
             <option Value="ResolveOneLevel">Resolve references only in discovery documents within the supplied URL</option>
             <option Value="ResolveNone">Do not resolve references</option>
	</select> <p>
       Save Results Mode:
	<select id="SaveMode" size=1 runat="SERVER">
	     <option Value="NoSave">Do not save any of the discovery documents found locally</option>
             <option Value="Save">Save the discovery documents found locally</option>
      	</select> <p>
        Enter the directory to Read/Save the Discovery results:
        <asp:textbox id=DiscoDir runat="SERVER" /> <p>

	<p align="center"> <asp:Button id=Discover Text="Discover!" onClick="Discover_Click" runat="SERVER"/> </p><p>

        <asp:label id="Status" runat="SERVER" /><p>
     <asp:DataGrid id="DiscoveryResultsGrid"

         <HeaderStyle BackColor="DarkBlue" ForeColor="White">

         <AlternatingItemStyle BackColor="LightYellow">


Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0