我正在使用加密时间戳来保护我的 Web 服务器中的 WCF 服务与“中间层”中的另一个服务之间的通信。在调用服务(此交换中的客户端)中,我使用一个 DLL,其类继承 System.ServiceModel.Configuration.BehaviorExtensionElement 以提供实现 System.ServiceModel.Description.IEndpointBehavior 和 System.ServiceModel.Dispatcher.IClientMessageInspector 的功能。这是通过 web.config 文件与部分粘合在一起的
<extensions>
<behaviorExtensions>
<add name="MessageInspectorBehavior" type="MessageInspectorDLL.MessageInspectorBehaviorExtensionElement, MessageInspectorDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<endpointBehaviors>
<behavior name="MessageInspectorEndpointBehavior">
<MessageInspectorBehavior />
</behavior>
</endpointBehaviors>
然后将这些与中级 WCF 连接到类似这样的条目
<client>
<endpoint address="http://blah.cloudapp.net:8080/BlahService.svc"
behaviorConfiguration="MessageInspectorEndpointBehavior" binding="customBinding"
bindingConfiguration="CustomBinding_BlahService"
contract="BlahServiceReference.BlahService"
name="CustomBinding_BlahService" />
在中间层有一个类似的故事,System.ServiceModel.Dispatcher.IClientMessageInspector 解密时间戳并处理请求或抛出带有错误消息“Invalid stamp”的 System.ServiceModel.FaultException。
这遵循http://msdn.microsoft.com/en-us/library/ms733747.aspx和http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf的代码示例-message-inspector.aspx
现在我已经更改了中间层 WCF。一些更改很简单(例如更正方法名称“retrive”->“retrieve”中的拼写错误),而一些更改添加了更多实质性功能,我想更新客户端中的服务recerences。在 VS2010 中,我右键单击需要更新的服务引用并选择“更新服务引用”。VS2010连接中间层WCF(“正在下载服务信息”)然后抛出错误
由于以下问题,无法更新服务引用的配置:无法加载为扩展“MessageInspectorBehavior”注册的类型“MessageInspectorDLL.MessageInspectorExtensionElement、MessageInspectorDLL、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null”。(C:\TFS\Blah\Blah\web.config 第 80 行)
怎么了?是否需要为更新服务引用设置一些东西才能正确使用消息检查器 DLL?
尽管 DLL 或 web.config 可能存在看起来不太可能的错误,因为客户端将连接到 Azure 上的先前中间层,并且具有相同的加密时间戳检查。