导致 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 信息。
我仍然不明白为什么分离调试器会产生这种行为(附加调试器后 属性 始终存在),但我至少能够解决它。
这与另一个问题 () 有关,但我想我会从不同的角度来问它,因为它可能针对与原始名称所暗示的不同的受众。
我在 .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 信息。
我仍然不明白为什么分离调试器会产生这种行为(附加调试器后 属性 始终存在),但我至少能够解决它。