Как переопределить генерацию Wsdl в веб-сервисах .Net - PullRequest
2 голосов
/ 04 августа 2010

Я хотел бы создать WebService в .Net, который предоставляет несколько WebMethods

Мне нужна версия WebService для каждой новой реализации (WebMethod или New Property в Business Object), например:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
    [WebMethod]
    [WebServiceVersion("1.0")]
    public string HelloWorld()
    {
        return "Hello World";
    }

    [WebMethod]
    [WebServiceVersion("1.1")]
    public string NewMethodInVersion1_1()
    {
        return "Hello World";
    }
}

С UrlRewriting или HttpHandler:

Только для HelloWorld WebMethod: http://localhost/Service/1.0/Service.asmx

HelloWorld WebMethod и NewMethodInVersion1_1: http://localhost/Service/1.1/Service.asmx

Как я могу динамически создать wsdl дляконкретная версия используется клиентом?

Ответы [ 3 ]

1 голос
/ 04 августа 2010

Я временно решил свою проблему, обслуживая другой файл wsdl с HttpModule

public class WsdlModule : IHttpModule
{
    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        HttpContext context = app.Context;
        HttpRequest request = context.Request;
        HttpResponse response = context.Response;

        string url = request.Url.AbsoluteUri.ToLower();

        if (url.Contains("wsdl"))
        {
            response.WriteFile(context.Server.MapPath("wsdl/1.0/Service.wsdl"));
            response.End();
        }
    }
}

если возможно, я предпочитаю динамически генерировать файл wsdl

1 голос
/ 11 августа 2010

Решение:

  1. Создайте один каталог для каждой версии веб-службы: / 1 /;/ 2 /;/ 3 / ...
  2. Каждая версия веб-сервиса наследуется от предыдущей версии: / 2 / Сервис: _1.Service;/ 3 / Service: _2.Service ...
  3. Реализация XmlSchemaProvider для объекта, напрямую возвращаемого вашим WebMethod с настраиваемой сериализацией с использованием интерфейса IXmlSerializable
  4. Предоставление свойств с использованием WebServiceVersionAttribute (например, TheСвойство Account доступно только для версии веб-службы, большей или равной 2)
  5. Использование HttpModule для перехвата версии веб-службы (с регулярным выражением: new Regex("/([0-9])+/(.)*"))
  6. Метод WriteXml интерфейса IXmlSerializableпроверяет WebServiceVersionAttribute для фильтрации результатов Xml (чтобы не сериализовать свойства более крупной версии)

Самая большая сложность заключается в реализации XmlSchemaProvider ...

0 голосов
/ 04 августа 2010

Если бы вы сделали это, вы бы не опубликовали два отдельных веб-приложения / веб-сайт?

Было бы безопаснее, чем когда два клиента указывают на один веб-сервис, и есть риск, что они вызовут неправильный метод.

Затем вы просто укажете на соответствующее веб-приложение / веб-сайт.и получите WSDL.

...