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

Я создал класс 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]));
    }

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

Спасибо!

Ответы [ 4 ]

1 голос
/ 24 марта 2015

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

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

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

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

  • в web.config мы зарегистрировали глобальное расширение мыла для проекта

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

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

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

`

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
}
1 голос
/ 19 марта 2009

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

1 голос
/ 16 марта 2009

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

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

0 голосов
/ 14 октября 2011
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class CriptoExtensionAttribute : SoapExtensionAttribute

[CriptoExtension]
public partial class MainService{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...