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