【问题标题】:altering envelope's namespace while sending SOAP request from a client created by svcutil在从 svcutil 创建的客户端发送 SOAP 请求时更改信封的命名空间
【发布时间】:2019-12-24 21:21:57
【问题描述】:

我有几个 SOAP Web 服务,它们具有相同的界面,但具有不同的 URL 和命名空间。

URL 1 http://badservice.com/one 有一个命名空间“one-ns”
URL 2 http://badservice.com/two 有一个命名空间“two-ns”

当我通过 svcutil 从 http://badservice.com/one?wsdl 生成 Web 服务客户端时,我只能将它用于 http://badservice.com/one。一旦我尝试向http://badservice.com/two SOAP 服务发送请求,就会说

namespace mismatch require http://nanopetdbs.driver.maestro.ibtech.com found http://ozkaraslanpetroldbs.driver.maestro.ibtech.com

我可以在最坏的情况下为每个 Web 服务 URL 生成客户端。

在这种情况下,我需要一个防止代码重复的想法。我曾尝试在发送请求时更改命名空间,但无法成功。

我需要在运行时更改信封突出显示的位置。

【问题讨论】:

标签: c# wcf soap


【解决方案1】:

不,我们不能在运行时指定这些值。在SOAP通信期间,该字段将用于寻址要调用的方法。
这是 Fiddle 捕获的通信电报。

SOAPAction 字段将指定要调用的方法。
如果这些值可以在运行时更改,寻址方法就会变得混乱。这就是带有命名空间和名称属性的服务契约的含义。

[ServiceContract(Namespace ="http://mycommany.com")]
public interface IService
{
    [OperationContract(Name ="Mymethod")]
    Int32 Add(Int32 Num1, Int32 Num2);
}

除了 BasicHttpbinding,还有一些其他的绑定,比如使用 ws-addressing 的 wshttpbinding。他们使用Action SOAP header 中的这些属性(命名空间、名称)来指定寻址方法。

综上所述,正是这些属性决定了运行时的寻址方式,所以我们不能在运行时修改这些属性(命名空间,名称)。
如果有什么我可以帮忙的,请随时告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多