3

我通过 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: 为前缀?

4

1 回答 1

0

我不认为有一个纯粹的配置选项来实现你想要的......但是有一个选项 - 你可以使用IClientMessageInspector

这使您可以更改传出和传入的消息,例如,您可以更改/检查所需的任何内容...

http://msdn.microsoft.com/en-us/library/aa717047.aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector.aspx
http://social. technet.microsoft.com/wiki/contents/articles/how-to-inspect-wcf-message-headers-using-iclientmessageinspector.aspx
http://weblogs.asp.net/paolopia/archive/2007/08/23/writing -a-wcf-message-inspector.aspx
http://www.codeproject.com/KB/WCF/ExtendingWCF_PartI.aspx

于 2011-07-30T19:13:46.870 回答