使用WCF实现不使用';不需要动作头

使用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中重载

我正在尝试使用WCF实现一个通过HTTP接受SOAP1.2的web服务。不幸的是,我必须使用传统客户端,这些客户端不将
操作
参数作为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
,以实现这一点?