首页 文章

通过ChannelFactory调用SOAP服务而不使用WSDL

提问于
浏览
3

我在不使用WSDL的情况下通过ChannelFactory调用SOAP服务 . 我将使用此服务的多个版本,我试图避免在我的项目/配置文件中有多个版本的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请求和响应回来就好了 . 但是存在一个名称空间问题,导致响应消息无法反序列化 .

Error Message :为操作'login'反序列化回复消息正文时出错 . OperationFormatter遇到无效的Message正文 . 期望找到名称为'loginResponse'且名称空间为'http://tempuri.org/'的节点类型'Element' . 找到节点类型'Element',名称为'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为前缀:?

1 回答

相关问题