Как добавить атрибут SoapExtension к сгенерированному прокси-серверу клиента веб-службы без изменения сгенерированного класса?

Я создал класс SoapExtension для захвата запроса мыла и ответа на определенные вызовы веб-службы. Чтобы применить это расширение SoapExtension, я должен добавить атрибут к методу в сгенерированном прокси-клиенте.

Например, я добавил к этому методу атрибут AuditSoapCapture:

    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://blahblah.com/webservices/AddressSearch", RequestNamespace = "http://blahblah.com/webservices/", ResponseNamespace = "http://blahblah.com/webservices/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [blahblah.TriadLite.Core.AuditSoapCapture]
    public System.Data.DataSet AddressSearch(string HouseNumber, string StreetName, string ZipCode) {
        object[] results = this.Invoke("AddressSearch", new object[] {
                    HouseNumber,
                    StreetName,
                    ZipCode});
        return ((System.Data.DataSet)(results[0]));
    }

Я ищу способ добавить этот атрибут к определенным методам без изменения сгенерированного клиентского прокси, так как они будут потеряны при повторной генерации. Могу ли я сделать это в другом частичном классе или интерфейсе или каким-либо другим способом?

Спасибо!


person Community    schedule 12.03.2009    source источник
comment
Попробуйте использовать инфраструктуру SchemaImporterExtension, вызов wsdl.exe с параметром /parameters (msdn.microsoft.com/en-us/ библиотека/7h3ystb6.aspx)   -  person Lu55    schedule 09.04.2012


Ответы (3)


К сожалению, вам нужно будет изменить код прокси. Другие возможности, о которых вы упомянули, не будут работать - париальный класс не перезапишет существующую функциональность, и я не знаю, как заставить интерфейс делать то, что вам нужно (усугубляется тем фактом, что нет никакого способа даже позволить генератор прокси знает, что вы собираетесь реализовать интерфейс).

Что-то, что я делал в прошлом, в ситуации, когда у вас есть доступ к источнику веб-сервиса, это написать небольшое приложение, которое будет анализировать код (как текст) в файле .asmx.cs веб-сервиса для извлеките имена всех методов, помеченных тегом [WebMethod]. Затем приложение «исправляет» References.cs, вставляя соответствующие атрибуты в прокси-методы на основе какого-либо файла настроек или чего-то подобного. Это хорошо работает, потому что соглашения об именах в прокси-сервере очень четко сопоставляются с именами методов в исходной службе.

person Ilya Tchivilev    schedule 16.03.2009

Я могу просто вставить свой SoapExtension, поместив его в Web.config. Это приведет к тому, что он будет запускаться при каждом вызове WS без атрибута клиентского прокси-метода. Затем я изменю SoapExtension для поиска имени вызываемого метода WS в списке, и если он есть в списке, то выполню остальную часть логики SoapExtension. Я полагаю, что попадание в список в этом небольшом приложении не убьет производительность.

person tinman    schedule 19.03.2009

6 лет назад это было опубликовано ... Так что не уверен, поможет ли это кому-нибудь на данный момент.

Я столкнулся с чем-то похожим при вызове старой веб-службы SOAP, у которой был динамически сгенерированный прокси-класс, который мы не хотели изменять, поскольку он был автоматически сгенерирован проектом из wsdl. Вот что мы сделали, чтобы решить эту проблему.

  • Прокси-класс, созданный wsdl.exe, является частичным классом. Мы расширили этот класс таким образом, чтобы добавить свойство с информацией, к которой мы хотели получить доступ в расширении soap. Вы можете добавить столько свойств, сколько хотите...

    partial class mysoapwebservice { public string myproperty{ get; set; } }

  • в web.config прописали расширение soap глобально на проекте

    <webServices> <soapExtensionTypes> <add type="MySoapExtension" priority="1" group="Low"/> </soapExtensionTypes> </webServices>

  • В коде, где мы создали объект веб-сервиса «mysoapwebservice», мы установили значение нужного нам свойства.

  • В расширении soap вы можете получить ссылку на вызываемую веб-службу, а также значения. Вы также можете определить вызов метода.

`

public class MySoapExtension: SoapExtension 
{
  public override void ProcessMessage(SoapMessage message)
  {
    switch (message.Stage)
        {
            case SoapMessageStage.BeforeSerialize:
                {
                    // web service client object
                    var webserviceobject= ((SoapClientMessage)message).Client;
                    // method from web service that was called
                    var calledMethod = (SoapClientMessage)message).MethodInfo;

                    // checked the client type of webserviceobject and
                    //added method / property specific logic here
                 }
         }
  }

  // other soap extension code
}
person kmcnamee    schedule 24.03.2015