在我的应用程序中,我正在调用Web服务,并且通过使用SoapExtension和SoapExtensionAttribute,我可以拦截传入和传出的SOAP消息以进行日志记录。我使用http://msdn.microsoft.com/en-us/magazine/cc164007.aspx中的示例作为输入。 但现在我想更进一步。我有一个Windows客户端调用我的类(在一个单独的项目中),然后该类调用Web服务。我现在可以拦截SOAP消息,但是我不想将它们直接记录到文件中,而是将这些消息传递回调用Web服务的类,并返回到调用我的类的客户端。这些是我到目前为止所做的代码更改:
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传递回包含应用此属性的方法的类。关于我应该怎么做的任何线索?
答案 0 :(得分:2)
对于碰巧经过的人来说,这是解决方案:
SoapMessage对象不包含有关我的客户端的任何信息。但是,我可以将此对象转换为SoapClientMessage对象,然后我将可以访问我的Web服务。如果我现在向这个webservice添加一个方法(通过创建一个新的公共部分类),我可以访问它的属性和方法(纯粹是一个例子!):
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;
}
您可以通过创建新的公共分部类并向其添加方法,属性和任何内容来向WebServiceClass添加方法(如本示例中的MyMethod)。