代码之家  ›  专栏  ›  技术社区  ›  Yngve B-Nilsen

在.NET WCF服务中接收纯XML

  •  1
  • Yngve B-Nilsen  · 技术社区  · 14 年前

    我正在设置一个非常简单的WCF服务,它的唯一工作是通过SOAP接收XML消息并将消息发送到内部服务。假设我创造的是 警卫哨所 这样的 (例如,实际名称已被替换)

    初始信息:

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

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

    端点设置:

    <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包装的消息,它的操作设置为urn:guardPostReceive,因此消息的实际路由是正确的。

    然而 -当收到消息时,由于此错误,它实际上没有被推入方法中:

    OperationFormatter遇到无效的消息正文。应找到名为“inputxml”且命名空间为“”的节点类型“element” http://tempuri.org/ '.找到名为“extns:externalNodeName”和命名空间的节点类型“element” http://foo.com/bar.org/someservice/schema/1

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

    我在WCF遇到过ShowStopper吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Alex    14 年前

    您可以定义一个协定来接收整个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);
    }
    

    在操作的实际实现中,您试图完成什么?

        2
  •  0
  •   Ladislav Mrnka    14 年前

    如果将参数定义为字符串,则必须传递编码的XML-如&lt;element/&gt;。如果需要传递未编码的XML,请尝试使用xmlement或xelement作为参数。