我正在建立一个非常简单的WCF服务,只有工作是通过SOAP接收XML消息并将消息发送到内部服务。假设我正在创建的是 guardpost 。 (例如,实际名称已被替换)
初始信息:
我无法更改呼叫我的外部服务。据我所知,这是一个用java构建的Soap11客户端。
在此示例中,所有名称都已更改为虚拟名称。
端点-设置:
<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吗?
答案 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作为参数。