Передача информации в объект, к которому применен атрибут SoapExtensionAttribute - PullRequest
2 голосов
/ 04 ноября 2010

В моем приложении я вызываю веб-службу и, используя SoapExtension и SoapExtensionAttribute, могу перехватывать входящие и исходящие сообщения SOAP для целей регистрации.Я использовал пример в http://msdn.microsoft.com/en-us/magazine/cc164007.aspx в качестве ввода.Но теперь я хочу пойти еще дальше.У меня есть клиент Windows, который вызывает мой класс (в отдельном проекте), а затем класс вызывает веб-сервис.Теперь я могу перехватывать сообщения SOAP, но вместо того, чтобы напрямую записывать их в файл, я хочу передать эти сообщения обратно моему классу, который вызывает веб-службу, а также клиенту, который вызывает мой класс.Это изменения кода, которые я сделал до сих пор:

        private String ExtractFromStream(Stream target)
    {
        if (target != null)
            return (new StreamReader(target)).ReadToEnd();

        return "";
    }

    public void WriteOutput(SoapMessage message)
    {
        newStream.Position = 0;
        string soapOutput = ExtractFromStream(newStream);

        newStream.Position = 0;
        Copy(newStream, oldStream);
    }

    public void WriteInput(SoapMessage message)
    {
        Copy(oldStream, newStream);

        newStream.Position = 0;
        string soapInput= ExtractFromStream(newStream);
        newStream.Position = 0;
    }

Теперь я хочу передать soapInput и soapOutput обратно в класс, содержащий метод, к которому применяется этот атрибут.Любые подсказки о том, как я должен это сделать?

1 Ответ

2 голосов
/ 10 ноября 2010

Для тех, кто проходит мимо, вот решение:

Объект SoapMessage не содержит никакой информации о моем клиенте.Однако я могу привести этот объект к объекту SoapClientMessage, и тогда у меня будет доступ к моему веб-сервису.Если я теперь добавлю метод к этому веб-сервису (создав новый публичный частичный класс), я смогу получить доступ к его свойствам и методам, как это (просто пример!):

 private String ExtractFromStream(Stream target)
    {
        if (target != null)
            return (new StreamReader(target)).ReadToEnd();

        return "";
    }



    public void WriteOutput(SoapMessage message)
    {
        newStream.Position = 0;

        string soapOutput = ExtractFromStream(newStream);
        SoapClientMessage soapClient = (SoapClientMessage)message;
        WebServiceClass webservice = (WebServiceClass)soapClient.Client;
        webservice.MyMethod(soapOutput); //Use your own method here!


        newStream.Position = 0;
        Copy(newStream, oldStream);
    }

    public void WriteInput(SoapMessage message)
    {
        Copy(oldStream, newStream);           
        newStream.Position = 0;

        string soapInput= ExtractFromStream(newStream);
        SoapClientMessage soapClient = (SoapClientMessage)message;
        WebServiceClass webservice = (WebServiceClass)soapClient.Client;
        webservice.MyMethod(soapInput);
        newStream.Position = 0;
    }

Вы можете добавить методы (например,MyMethod в этом примере) для вашего WebServiceClass, создав новый публичный частичный класс и добавив в него методы, свойства и все, что вам нравится.

...