导致 WCF IDispatchMessageInspector 停止命中的 VS 调试器

VS debugger causing WCF IDispatchMessageInspector to stop getting hit

这与另一个问题 () 有关,但我想我会从不同的角度来问它,因为它可能针对与原始名称所暗示的不同的受众。

我在 .NET 4.5.1 和 Silverlight 5 中有一个相当复杂的解决方案 运行,各种 WCF 和 ASMX Web 服务,当我 运行 和 "Start debugging" 都是美好的。但是,如果我在没有调试的情况下启动它,我似乎丢失了一个自定义 IDispatchMessageInspector,我通过自定义端点将其应用到 WCF 服务。

这个消息检查器提取了一个自定义的 http header 值,我将其插入到发送到服务的消息中,最终这个值最终出现在数据库中。我有一些日志来确认此消息检查器是否受到攻击。

当我通过 VS2013 调试时一切正常,我看到 header 被拉出并将值写入数据库,我正在转储这个事实的日志。但是,如果我分离调试器,日志就不会再从消息检查器中出来(尽管我在服务中看到了所有其他日志),并且 header 值不再被拉出并插入到数据库。不过,我确实知道该服务受到了攻击,因为来自该服务本身的其余数据仍正确写入了数据库,并且我看到了相应的日志。

如果我附加回同一个 w3wp.exe 实例,这些值将再次开始出现。

我很难相信这与调试有关,但这是两种情况下的唯一区别。

我真的坚持这一点,所以任何指导将不胜感激!

我的服务配置如下:

<system.serviceModel>
    <extensions>
      <behaviorExtensions>
        <add name="customBehaviour" type="Services.Common.CustomBehaviourExtensionElement, Services.Common"/>
      </behaviorExtensions>
    </extensions>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="customBehaviour">
          <customBehaviour/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
<services>
  <service behaviorConfiguration="MyServiceBehavior" name="MyService">
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="NoSecurity" contract="Services.Interfaces.Net.IMyService" behaviorConfiguration="customBehaviour"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>
<bindings>
  <basicHttpBinding>
    <binding name="NoSecurity" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
    </binding>
</basicHttpBinding>

看来实际上是发送方的 IClientMessageInspector 有问题。由于某种原因,在附加调试器后,request.Properties collection 不包含 HttpRequestMessageProperty ("httpRequest"),因此我的自定义 header 无处可放,失败了。 IDispathMessageInspector 在接收端受到攻击,它只是没有从 header.

中读取任何内容

我的解决方案是在 IClientMessageInspector 中添加 属性 如果没有找到,然后添加我的 header 信息。

我仍然不明白为什么分离调试器会产生这种行为(附加调试器后 属性 始终存在),但我至少能够解决它。