我已经用谷歌搜索了这个垃圾,我已经走到了尽头。我有一个这样定义的服务合同:
[ServiceContract(Namespace="http://myfirstnamespace.mycompany.com")]
public interface IMyServices
{
[OperationContract]
[XmlSerializerFormat]
myServiceResponse MyOperation(myServiceRequest myServiceRequest);
}
对于我的请求定义,我有这个:
[DataContract(Namespace="http://mysecondnamespace.mycompany.com")]
public partial class myServiceRequest
{
private string field1Field;
private string field2Field;
[DataMember]
public string field1 {
get {
return this.field1Field;
}
set {
this.field1Field = value;
}
}
[DataMember]
public string field2 {
get {
return this.field2Field;
}
set {
this.field2Field = value;
}
}
}
请注意命名空间的区别。不幸的是,实际代码在另一台计算机上处于锁定状态,所以我只能尽力证明这个问题。似乎 DataContract 上的命名空间被忽略了。我的 WCF 测试客户端将生成一个示例请求,如下所示:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.openuri.org/</Action>
</s:Header>
<s:Body>
<MyOperation xmlns="http://myfirstnamespace.mycompany.com/">
<myServiceRequest xmlns:d4p1="http://mysecondnamespace.mycompany.com">
<d4p1:field1 />
<d4p1:field2 />
</myServiceRequest>
</MyOperation>
</s:Body>
</s:Envelope>
请注意,当我在 DataContract 属性中指定http://mysecondnamespace.mycompany.com时,myServiceRequest 位于http://myfirstnamespace.mycompany.com下。为什么?如何让这个参数显示在我想要的命名空间中?
我还想指出,我必须将此服务开发为现有的客户端规范。它是即将过时的服务的替代品,因此我无法更改客户端以接受任何不同的服务。