Как мне включить мой собственный wsdl в мой веб-сервис в C # - PullRequest
5 голосов
/ 01 сентября 2009

У меня есть файл .wsdl, который должен реализовывать мой веб-сервис (старый стиль asmx). Об этом позаботятся. Когда я публикую веб-сервис, вы можете вызвать его с параметром? Wsdl, чтобы получить сгенерированный wsdl.

Как включить мой файл .wsdl, чтобы он возвращался вместо сгенерированного?

Можно ли сделать с атрибутом в моем классе веб-службы?

Ответы [ 3 ]

2 голосов
/ 05 сентября 2009

Чтобы избежать путаницы с двумя разными WSDL, доступными по двум разным URL-адресам (т. Е. URL-адресу * .asmx? Wsdl и пользовательскому URL-адресу) в приложении веб-службы, вы можете написать HttpModule, который перехватывает запрос к * URL-адрес .asmx? wsdl и возвращает вместо него пользовательский WSDL.

РЕДАКТИРОВАТЬ: Вот пример, адаптированный и упрощенный из некоторого кода, который я ранее написал, который делает пользовательский WSDL доступным по стандартному * .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 находится в той же папке, что и ваш файл .asmx с расширением .wsdl. Модуль HttpModule необходимо подключить к приложению веб-службы через файл web.config:

<?xml version="1.0"?>
<configuration>
    <!-- ... -->
    <system.web>
  <!-- ... -->
  <httpModules>
   <add
    type="DemoWebService.CustomWsdlModule"
    name="CustomWsdlModule"/>
   <!-- ... -->
  </httpModules>
  <!-- ... -->
    </system.web>
    <!-- ... -->
</configuration>
2 голосов
/ 01 сентября 2009

Это дано остаться с "старым стилем" ASMX? Или вы могли бы перейти на WCF? Это действительно самое последнее предложение веб-сервиса от Microsoft, и если вы делаете что-то новое и используете .NET 3.0 или выше - зачем тратить время на «старые» технологии?

В WCF вы можете определенно определить статический физический файл WSDL, который будет использоваться клиентами, подключающимися к вашей конечной точке метаданных (вашему URL-адресу "...? Wsdl"). Не уверен, что вы можете сделать это и в ASMX.

ОК, в ASMX / .NET 2.0 вы, конечно, всегда можете поместить фактический файл WSDL в корень вашего веб-сайта, а затем просто сослаться на него так:

http://yourwebserver/YourVirtDir/MyService.wsdl 

Я не знаю, есть ли способ "перенаправить"

http://yourwebserver/YourVirtDir/MyService.asmx?wsdl 

позвоните, чтобы перейти на этот фиксированный URL. Я уверен, что кто-то еще узнает!

Марк

0 голосов
/ 02 сентября 2009

Вы можете сгенерировать файл WSDL и DISCO, указав на ваш веб-сервис инструмент disco.exe , который поставляется с .NET Framework.

 disco.exe http://webserver/MyWebService.asmx

Создаются следующие файлы:

 results.discomap
 MyWebService.disco
 MyWebService.wsdl
...