使用WCF实现不使用';不需要动作头
我正在尝试使用WCF实现一个通过HTTP接受SOAP1.2的web服务。不幸的是,我必须使用传统客户端,这些客户端不将使用WCF实现不使用';不需要动作头,wcf,web-services,soap,header,wcf-binding,Wcf,Web Services,Soap,Header,Wcf Binding,我正在尝试使用WCF实现一个通过HTTP接受SOAP1.2的web服务。不幸的是,我必须使用传统客户端,这些客户端不将操作参数作为HTTP头的一部分发送。这似乎导致WCF出现问题,WCF(至少在默认情况下)似乎无法在没有操作的情况下将请求路由到适当的位置 我已经创建了一个基于BasicHttpBinding的绑定,但是将MessageVersion设置为MessageVersion.Soap12,我认为这将消除使用WS-Addressing的要求 然后我在IContractBehavior中重载
操作
参数作为HTTP头的一部分发送。这似乎导致WCF出现问题,WCF(至少在默认情况下)似乎无法在没有操作的情况下将请求路由到适当的位置
我已经创建了一个基于BasicHttpBinding
的绑定,但是将MessageVersion
设置为MessageVersion.Soap12
,我认为这将消除使用WS-Addressing的要求
然后我在IContractBehavior
中重载ApplyDispatchBehavior
以将DispatchRuntime.OperationSelector
设置为IDispatchOperationSelector
的自定义实现,该实现基于SOAP主体的内容选择正确的操作(基本上是中使用的方法)
默认情况下,这似乎不起作用,并且在发出请求时不会调用SelectOperation
功能
但是,如果我在合同中添加了一个带有空操作的虚拟操作,如下所示:
[OperationContract( Action = "" )]
void DoNothing();
然后突然SelectOperation
开始被调用,我的代码按预期工作。似乎我一直没有成功地使WCF不再需要操作头-我刚刚停止了用于直接映射到操作的操作头。然而,由于契约是从一个.wsdl文件生成的,因此为了使事情正常运行而对其进行编辑似乎是一个可怕的大难题
所以我的问题是:如果没有使用WCF的操作头,我如何接受SOAP1.2请求?除非我弄错了,SOAP1.2规范不需要操作头,所以肯定有一些方法可以用WCF实现这一点,而不必破坏合同?我今天刚刚设法找到了这个问题的答案。事实证明,正在使用的EndpointDispatcher
有一个ActionMessageFilter
,它是ContractFilter
,这是根据动作过滤掉消息
在我将ContractFilter
更新为MatchAllMessageFilter
之后,所有消息都被传递到我的IDispatchOperationSelector
,在那里可以根据SOAP正文的内容进行选择
我用于执行此操作的代码位于IContractBehavior.ApplyDispatchBehavior
:
foreach(
var endpointDispatcher in
dispatchRuntime.ChannelDispatcher.Endpoints
)
{
endpointDispatcher.ContractFilter = new MatchAllMessageFilter();
}
将来我可能会更新以使用比MatchAllMessageFilter
更合适的过滤器,但现在它正在做这项工作。您可以使用Action=“*”然后单个操作将捕获所有请求-我认为这并不理想?@Chris不幸的是,同样,这是黑客攻击生成的文件,我宁愿避免。除非在从wsdl文件生成接口时,我可以将某些选项传递给svcutil.exe
,以实现这一点?