我在不使用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请求和响应回来了。但是存在一个名称空间问题,导致响应消息无法反序列化。
错误消息: 对操作'login'反序列化回复消息体时出错。 OperationFormatter遇到无效的Message正文。预计会找到名为“loginResponse”的节点类型“Element”和名称空间“http://tempuri.org/”。找到名为'ns1:loginResponse'的节点类型'Element'和名称空间'urn:Foo'
如果我更新我的ServiceContract以包含如下所示的命名空间:
[ServiceContract(Namespace="urn:Foo")]
public interface IServiceContract
{
[OperationContract(Name = "login")]
string login(string username);
}
错误消息消失但该方法现在返回null而不是实际值。再一次,我可以看到Fiddler中的XML,我正在寻找的值是在响应中,但看起来它仍然无法找到元素ns1:loginResponse。
问题是我如何配置ChannelFactory以知道具有给定命名空间的所有元素都将以ns1为前缀:?
答案 0 :(得分: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