gpt4 book ai didi

wcf - 使用WCF实现不需要action header的SOAP服务器

转载 作者:行者123 更新时间:2023-12-02 19:47:08 26 4
gpt4 key购买 nike

我正在尝试使用 WCF 实现一个通过 HTTP 接受 SOAP 1.2 的 Web 服务。不幸的是,我必须使用不发送 action 参数作为 HTTP header 一部分的旧客户端。这似乎导致了 WCF 的问题,它(至少默认情况下)似乎无法在没有 action 的情况下将请求路由到适当的位置。

我创建了一个基于 BasicHttpBinding 的绑定(bind),但将 MessageVersion 设置为 MessageVersion.Soap12,我认为这会消除以下要求:使用 WS-Addressing。

然后,我在 IContractBehavior 中重载了 ApplyDispatchBehaviour,将 DispatchRuntime.OperationSelector 设置为选择的 IDispatchOperationSelector 的自定义实现根据 SOAP 主体的内容进行正确的操作(基本上是 this MSDN article 中使用的方法)

默认情况下,这似乎不起作用,并且在发出请求时不会调用 SelectOperation 函数。

但是,如果我在合约中添加一个带有空操作的虚拟操作,如下所示:

[OperationContract( Action = "" )]
void DoNothing();

然后突然开始调用 SelectOperation 并且我的代码按预期工作。看来我没有成功地使 WCF 不再需要操作 header - 我刚刚停止使用操作 header 直接映射到操作。然而,由于合约是从 .wsdl 文件生成的,因此编辑它以使事情正常运行似乎是一个可怕的大黑客。

所以我的问题是:如何使用 WCF 接受没有操作 header 的 SOAP 1.2 请求?除非我弄错了,否则 SOAP 1.2 规范不需要操作 header ,所以肯定有某种方法可以使用 WCF 来实现此目的,而无需诉诸破解契约(Contract)?

最佳答案

我今天刚刚找到了这个问题的答案。事实证明,所使用的 EndpointDispatcher 有一个 ActionMessageFilter,因为它是 ContractFilter,并且它根据操作过滤消息。

ContractFilter 更新为 MatchAllMessageFilter 后,所有消息都会传递到我的 IDispatchOperationSelector,在那里可以根据SOAP 主体的内容。

我用来执行此操作的代码位于IContractBehavior.ApplyDispatchBehaviour中:

foreach(
var endpointDispatcher in
dispatchRuntime.ChannelDispatcher.Endpoints
)
{
endpointDispatcher.ContractFilter = new MatchAllMessageFilter();
}

我将来可能会更新以使用比 MatchAllMessageFilter 更合适的过滤器,但目前它正在完成这项工作。

关于wcf - 使用WCF实现不需要action header的SOAP服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com