我在不使用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 回答
我不认为有一个纯配置选项来实现你想要的...但有一个选项 - 你可以使用
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