拦截WCF客户端中的消息

时间:2009-08-01 20:08:52

标签: c# wcf soap wcf-client

有没有人有过Web Service Extensions的经验?我花时间尝试从MS示例中创建Web服务扩展。

我有一个.net 3.5 Web服务客户端,通过添加对WSDL的引用而构建,通过VS IDE“Project> Add Service Reference”。这构建了我的Web服务客户端,一切正常。

我需要拦截我的Web服务客户端的请求和响应正文。我发现了许多对Web服务扩展的引用,但是我已经厌倦了攻击,并且无法启动我的扩展。

我在这里使用了MS示例“如何实现SOAP扩展”(http://msdn.microsoft.com/en-us/library/7w06t139.aspx),它为请求/响应流构建了一个记录器。

相关的MS文章“Soap Message Modification”(http://msdn.microsoft.com/en-us/library/esw638yk(VS.85).aspx)展示了如何为Web客户端启用SOAP扩展:

  

实施SOAP扩展

     

在客户端或服务器应用程序上运行SOAP扩展有两种方法。首先,您可以配置应用程序以运行扩展。要将SOAP扩展配置为针对所有Web服务(尤其是vroot)上的所有Web方法运行,请编辑Web.config文件中的<soapExtensionTypes>元素部分。以下代码显示type属性值必须位于一行,并包含扩展的完全限定名称,以及签名程序集的version,culture和public key标记。

     

&LT;结构&gt;
  &LT;&的System.Web GT;
      &LT; WEBSERVICES&GT;
        &LT; soapExtensionTypes&GT;
          &lt; add type =“Contoso.MySoapExtension,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”   priority =“1”group =“0”/&gt;
          &LT; / soapExtensionTypes&GT;
      &LT; / WEBSERVICES&GT;
    &LT; /system.web>
  &LT; /结构&gt;

我已将traceextension编译到自己的类库中,并在Web服务项目的web.config中引用它,如下所示:

  

&lt; add type =“TraceExtension,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = ef8757fac167b8d8”priority =“1”group =“High”/&gt;

没有快乐。没有记录任何内容,也没有命中断点。

然后我删除了引用的类,并将源代码放入Web服务项目中。

我试图像这样添加对它的引用(我的命名空间是ServcieTest001):

  

&lt; add type =“ServiceTest001.TraceExtension”group =“High”priority =“1”/&gt;

我使用以下主题作为指南,使我能够扩展“getting-raw-soap-data-from-a-web-reference-client-running-in-asp-net”(http://stackoverflow.com/questions/300674/getting-raw-soap-data-from-a-web-reference-client-running-in-asp-net) 。

仍然没有快乐。然后我从上面的线程中复制了代码,当我发出SOAP请求时仍然无法触发扩展。

有人能指出我正在运行的可下载的Web服务扩展演示项目,所以我可以将其拆解并找出我所缺少的内容吗?

3 个答案:

答案 0 :(得分:12)

John是对的,您可以使用实现IClientMessageInspector的自定义客户端行为拦截客户端上的消息。请参阅MSDN上的How To: Inspect or Modify Messages on the Client

关于它的唯一“棘手”是,如果您计划修改消息 body ,那么您将需要首先创建原始消息的副本。有关详细信息,请参阅Using the Message Class

答案 1 :(得分:0)

你有可能想休息一下。

您永远不想使用WSE。 WSE已经过时了。

您不希望使用ASMX Web服务 - Microsoft现在认为它们是“遗留”技术,并且不会修复错误。顺便说一下,WSE是基于ASMX的,那是什么让它成为了呢?


您只想使用Windows Communication Foundation。 MSDN上的WCF开发中心位于http://msdn.microsoft.com/wcf/

玩得开心,远离讨厌,古老,过时的东西。

答案 2 :(得分:0)

是的 - 我太累了。

认为 Web服务扩展使用“Web引用”(.net 2),而不是“服务引用”(.net 3)。

所以我想改变我的问题 - 如何拦截连接到遗留Web服务的.net 3“服务引用”的请求和响应?