【问题标题】:Calling a SOAP service via a ChannelFactory without using the WSDL通过 ChannelFactory 调用 SOAP 服务而不使用 WSDL
【发布时间】:2011-07-20 15:02:54
【问题描述】:

我通过 ChannelFactory 调用 SOAP 服务而不使用 WSDL。我将使用该服务的多个版本,并试图避免在我的项目/配置文件中包含多个版本的 WSDL。

代码如下:

[ServiceContract()]
public interface IServiceContract
{
    [OperationContract(Name = "login")]
    string login(string username);
}

public void UserLogin()
{
    IServiceContract service = new ChannelFactory<IServiceContract>(
        new BasicHttpBinding(),
        "http://myurl.com/index.php/api/v2_soap/index/")
        .CreateChannel();

    var sessionId = service.login("username");
}

使用 Fiddler 我看到 SOAP 请求和响应恢复得很好。但是有一个命名空间问题阻止了响应消息的反序列化。

错误信息: 反序列化操作“登录”的回复消息正文时出错。 OperationFormatter 遇到无效的消息正文。预计会找到名称为“loginResponse”和命名空间“http://tempuri.org/”的节点类型“元素”。找到名为“ns1:loginResponse”和命名空间“urn:Foo”的节点类型“元素”

如果我更新我的 ServiceContract 以包含这样的命名空间:

[ServiceContract(Namespace="urn:Foo")]
public interface IServiceContract
{
    [OperationContract(Name = "login")]
    string login(string username);
}

错误消息消失了,但该方法现在返回 null 而不是实际值。我再次可以在 Fiddler 中看到 XML,我正在寻找的值在响应中,但它似乎仍然找不到元素 ns1:loginResponse。

问题是如何配置 ChannelFactory 以知道具有给定命名空间的所有元素都将以 ns1: 为前缀?

【问题讨论】:

  • 我是否正确假设该服务未在 WCF 中实现?您能否发布一个请求和响应的示例,就像您在 Fiddler 中看到的那样?

标签: .net magento soap channelfactory


【解决方案1】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
相关资源
最近更新 更多