-1

也许我混淆了一些东西,但我找不到任何关于接收 SOAP 消息的 wcf 服务的重载操作的问题或文档。

目标:我有 3 条 SOAP 消息进入我的 wcf 服务,在同一端点上具有相同的操作名。这是固定的,我无法更改。

我希望以下 wcf 接口可以工作:

    [OperationContract(Action = "urn:oasis:names:tc:SPML:2:0:req/active", Name = "addRequest")]
    void Add(data data);

    [OperationContract(Action = "urn:oasis:names:tc:SPML:2:0:req/active", Name = "modifyRequest")]
    void Modify(psoID psoID, modification modification);

    [OperationContract(Action = "urn:oasis:names:tc:SPML:2:0:req/active", Name = "deleteRequest")]
    void Delete(psoID psoID);

问题:如果我只有一个这样的操作合同,我的服务可以工作,但是如果我有多个操作合同,则会弹出以下错误:`

500System.ServiceModel.ServiceActivationException

我相信它不能有多个具有相同操作名称的操作合同。我也相信这应该是可能的,因为我正在替换一个可以处理具有相同操作名的所有 3 条消息的肥皂服务。(wcf和soap不应该那么远吗?)

我添加了操作名称以解决问题,但没有运气。

任何帮助都将不胜感激。谢谢!

4

1 回答 1

1

Action 属性表示客户端请求的地址,该地址将被发送到服务器,并确定服务器端要调用的方法。这是 Fiddler 捕获的客户端请求。

POST http://10.157.13.69:21011/HTTP/1.1 Content-Type: text /
xml;charset=utf-8
SOAPAction: "urn:oasis:names:tc:SPML:2:0:req/active"
主机: 10.157.13.69:21011
内容长度:162
预期:100-继续
接受编码:gzip,放气
连接:保持活动

SOAPAction HTTP 标头是操作的操作名称。Name 属性决定了客户端实际方法的名称。

ServiceReference1.ServiceClient client = new ServiceClient();
                client.addRequest(23);

因此,除非我们将 WCF Web 服务从 SOAP Web 服务更改为 Rest API,否则无法实现此功能,因为 SOAP Web 服务寻址方式依赖于 Action 字段。
即,我们需要使用 Webhttpbinding 将服务更改为 Restful API。

[OperationContract(Action = "urn:oasis:names:tc:SPML:2:0:req/active", Name = "addRequest")]
[WebGet]
void Add(int data);

如果有什么我可以帮忙的,请随时告诉我。

于 2019-11-04T09:57:30.150 回答