我有一个从BizTalk服务器接收消息的WCF服务。
BT服务器正在处理此消息,只是从FTP文件夹中获取并发送到服务上的操作,该操作定义如下:
[OperationContract(Action="http://www.mysite.com/ConvertAA",
Name="AA", IsOneWay=false)]
void SaveDataFromAA(AA receivedDoc);
但是当收到此消息时,我收到一条消息:
反序列化操作'AA'的请求消息正文时出错。 OperationFormatter遇到无效的Message正文。预计会找到名为“AA”的节点类型“Element”和名称空间“http://tempuri.org/”。找到名为“AA”的节点类型“Element”和名称空间“
现在这是因为第三方发送的xml(我对此无法控制)如下所示:
<?xml version="1.0" standalone="yes"?>
<AA>
<AAData>...</AAData>
</AA>
我的项目中已经有他们的架构,当我尝试调用SaveDataFromAA时,我得到了上面的错误。
我尝试在我的服务合同上使用空白命名空间但仍然在寻找tempuri.org - 我没有控制他们的xml所以有没有办法可以拦截它,改变它并相应地处理它?我很乐意把它包起来,但我不太清楚从哪里开始。
答案 0 :(得分:0)
我很确定您需要将AA类(receivedDoc参数)修改为类似于以下内容:
[DataContract]
public class AA
{
[DataMember]
public string AAData {get; set;}
}
或假设您的所有属性或类都不匹配:
[DataContract(Name="AA")]
public class SomeOtherName
{
[DataMember(Name="AAData")]
public string SomeOtherProperty {get; set;}
}
您可以在以下位置找到更多信息,包括如何为数据协定设置命名空间信息:
http://msdn.microsoft.com/en-us/library/ms733127(v=vs.110).aspx
数据合同等同性可能值得更详细地审查
http://msdn.microsoft.com/en-us/library/ms734767(v=vs.110).aspx
答案 1 :(得分:0)
您应该像下面一样正确地编写服务合同名称空间
[ServiceContract(Namespace = "http://service.xadapter.xsystems.com")]
,您应该在xml节点中使用相同的名称定义soap操作,或通过与xml内容相同的属性名称进行定义,如下所示
[OperationContract(Name="YourXmlNode_SoapActionName")]