服务期望tempuri.org的命名空间

时间:2013-12-23 15:36:06

标签: c# wcf

我有一个从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所以有没有办法可以拦截它,改变它并相应地处理它?我很乐意把它包起来,但我不太清楚从哪里开始。

2 个答案:

答案 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")]