我已经谷歌了解了这个废话,我就在绳子的尽头。我的服务合同定义如下:
[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://myfirstnamespace.mycompany.com时,myServiceRequest位于http://mysecondnamespace.mycompany.com下。为什么?如何让这个参数显示在我想要的命名空间中?
我还要注意,我必须将此服务开发为现有的客户端规范。它是即将过时的服务的替代品,因此我无法更改客户端以接受任何不同的服务。