在.NET WCF服务中接收纯XML

时间:2010-08-18 06:34:30

标签: .net xml soap wcf

我正在建立一个非常简单的WCF服务,只有工作是通过SOAP接收XML消息并将消息发送到内部服务。假设我正在创建的是 guardpost 。 (例如,实际名称已被替换)

初始信息:

  1. 我无法更改呼叫我的外部服务。据我所知,这是一个用java构建的Soap11客户端。

  2. 在此示例中,所有名称都已更改为虚拟名称。

  3. 端点-设置:

    <service behaviorConfiguration="GuardpostBehavior" name="Guardpost.ContractImplementation">
        <endpoint address=""  binding="basicHttpBinding" contract="Guardpost.IContract" bindingConfiguration="basic">
         <identity>
          <dns value="localhost"/>
         </identity>
        </endpoint>
       </service>
    

    绑定配置:

    <basicHttpBinding>
      <binding name="basic" textEncoding="utf-8" messageEncoding="Text">
        <security mode="Transport" />
      </binding>
    </basicHttpBinding>
    

    (由于https,我需要传输安全性)

    我的合同如下:

    [ServiceContract]
    public interface IContract
    {
      [OperationContract(Action="urn:#GuardpostReceive")]
      void GuardpostReceive(string inputXml);
    }
    

    现在我收到的是一个Soap-wrapped消息,其Action设置为urn:#GuardpostReceive,因此消息的实际路由正确完成。

    然而 - 收到邮件时,由于此错误,实际上并未将其推送到方法中:

      

    OperationFormatter遇到了无效的邮件正文。预计会找到名为“inputXml”和名称空间“http://tempuri.org/”的节点类型“Element”。找到名为“extns:ExternalNodeName”的节点类型“Element”和名称空间“http://foo.com/bar.org/someservice/schema/1

    问题似乎是我的WCF服务无法提取Soap消息的主体并简单地将其作为普通XML传递,但这就是我需要它做的事情。

    我在WCF中遇到过showstopper吗?

2 个答案:

答案 0 :(得分:2)

您可以定义合同以接收整个SOAP消息并完全跳过路由:

[ServiceContract]
public interface IUniversalRequestReply
{
    [OperationContract(Action = "*", ReplyAction = "*")]
    Message ProcessMessage(Message msg);
}

[ServiceContract]
public interface IUniversalOneWay
{
    [OperationContract(Action = "*", IsOneWay=true)]
    void ProcessMessage(Message msg);
}

但我认为你无法做到这样的事情:

[ServiceContract]
public interface IContract
{
  [OperationContract(Action="urn:#GuardpostReceive")]
  void GuardpostReceive(Message inputXml);
}

您在实际执行操作时想要完成什么?

答案 1 :(得分:0)

如果将参数定义为String,则必须传递编码的XML - 例如&amp; lt; element /&amp; gt;。如果需要传递未编码的XML,请尝试使用XmlElement或XElement作为参数。