且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在C#的Web服务中包含自己的wsdl

更新时间:2023-09-14 11:16:34

为避免在Web服务中的两个不同URL(即* .asmx?wsdl URL和自定义URL)上具有两个不同WSDL的混淆应用程序中,您可以编写一个HttpModule来拦截对* .asmx?wsdl URL的请求,并返回您的自定义WSDL.

To avoid the confusion of having two different WSDLs available on two different URLs (i.e., the *.asmx?wsdl URL and a custom URL) in your web service application, you could write an HttpModule that intercepts the request to the *.asmx?wsdl URL and returns your custom WSDL instead.

这是一个示例,该示例经过改编并简化了一些我之前编写的代码,这些代码使自定义WSDL可在标准* .asmx?wsdl URL上使用.

Here's an example, adapted and simplified from some code I previously wrote that makes a custom WSDL available at the standard *.asmx?wsdl URL.

using System;
using System.IO;
using System.Web;
using System.Web.Services.Configuration;

namespace DemoWebService
{
 public class CustomWsdlModule :
  IHttpModule
 {
  public void
  Init(HttpApplication application)
  {
   // hook up to BeginRequest event on application object
   application.BeginRequest += new EventHandler(this.onApplicationBeginRequest);
  }

  public void
  Dispose()
  {
  }

  private void
  onApplicationBeginRequest(object source, EventArgs ea)
  {
   HttpApplication application = (HttpApplication)source;
   HttpRequest request = application.Request;
   HttpResponse response = application.Response;

   // check if request is for WSDL file
   if ( request.Url.PathAndQuery.EndsWith(".asmx?wsdl", StringComparison.InvariantCultureIgnoreCase) )
   {
    // if Documentation protocol is not allowed, throw exception
    if ( (WebServicesSection.Current.EnabledProtocols & WebServiceProtocols.Documentation) == 0 )
    {
     throw new System.InvalidOperationException("Request format is unrecognized.");
    }

    // get path to physical .asmx file
    String asmxPath = request.MapPath(request.Url.AbsolutePath);

    // build path to .wsdl file; should be same as .asmx file, but with .wsdl extension
    String wsdlPath = Path.ChangeExtension(asmxPath, ".wsdl");

    // check if WSDL file exists
    if ( File.Exists(wsdlPath) )
    {
     // read WSDL file
     using ( StreamReader reader = new StreamReader(wsdlPath) )
     {
      string wsdlFileContents = reader.ReadToEnd();

      // write WSDL to response and end response without normal processing
      response.ContentType = "text/xml";
      response.Write(wsdlFileContents);
      response.End();
     }
    }
   }
  }
 }
}

此简化代码假定您的自定义WSDL与扩展名为.wsdl的.asmx文件位于同一文件夹中. HttpModule需要通过web.config文件挂接到您的Web服务应用程序中:

This simplified code assumes that your custom WSDL is in the same folder as your .asmx file with a .wsdl extension. The HttpModule needs to be hooked into your web service application via the web.config file:

<?xml version="1.0"?>
<configuration>
    <!-- ... -->
    <system.web>
  <!-- ... -->
  <httpModules>
   <add
    type="DemoWebService.CustomWsdlModule"
    name="CustomWsdlModule"/>
   <!-- ... -->
  </httpModules>
  <!-- ... -->
    </system.web>
    <!-- ... -->
</configuration>