【问题标题】:How to parse soap+xml message that is passed into my wcf service operation?如何解析传递给我的 wcf 服务操作的soap+xml 消息?
【发布时间】:2011-05-20 16:56:26
【问题描述】:

我从客户端收到以下 Soap 请求,基本上我必须提取名称,然后发回“Hello Test”

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"   
xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body>
    <ns1:Customer>
    <ns1:Name>Test</ns1:Name>
    </ns1:Customer>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如果我有一个像这样定义的类 Customer:

public class Customer
{
    public string Name {get;set;}
}

我不确定如何将soap 请求传递给我的wcf 服务操作,该操作将接收从xsd 生成的客户请求对象?

在我的 wcf 服务操作接收到 soap 请求后,我不确定如何从中获取 Name 属性并将响应发送回客户端,例如“Hello Test”

注意:客户端不会发送 Customer 对象,他们会发送一个 xml 请求,我必须将其解析为 Customer 对象。我希望这可以解决问题。

在将 XDocument 传递给我的 wcf 服务操作时,我是否必须这样做:

private static void ParsSoapDocument(XDocument soapDocument)
{
   //Parse XDocument for elements/attributes

}

【问题讨论】:

    标签: c# wcf soap


    【解决方案1】:

    你不应该解析任何东西,这是 WCF 为你处理的。

    可能会根据您是否使用已包装/未包装的消息而有所不同,但基本情况是,对于您描述的来自客户端的肥皂消息,您的服务接口如下(假设您的响应是 string ):

    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        public string Customer(string Name);
    }
    

    更有可能的是,您实际上是在尝试执行一项接收客户的操作。例如,要检查客户是否存在,您可能需要:

    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        public bool CheckCustomerExists(Customer Customer);
    }
    

    您在服务端的Customer 类需要定义为DataContract

    [DataContract]
    public class Customer
    {
        public string Name{get;set;}
    }
    

    这将使soap请求如下所示:

    <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"> <SOAP-ENV:Body>
        <ns1:CheckCustomerExists>
        <ns1:Customer>
        <ns1:Name>Test</ns1:Name>
        </ns1:Customer>
        </ns1:CheckCustomerExists> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
    

    【讨论】:

    • 伊森,谢谢。我有客户向我发送请求,所以我不控制请求,我只控制收到请求时的操作,例如将客户添加到数据库中。你知道我如何在 .net 中查看肥皂请求/响应(例如 - 使用 Console.WriteLine(...))
    • @john 我提到在两个地方使用MessageContract,所以不确定你问的是哪一个。首先,我提到如果操作采用 Customer 对象而不是简单数据类型,则需要使用 MessageContract。我想您也可以使用DataContract,但我通常使用消息(它会到达第二个MessageContract 参考)。其次,如果操作可以控制消息的设计并且消息是否相当复杂,我建议使用请求/响应。
    • @Xaisoft - 要查看通过网络发送的 SOAP,您可以使用 Fiddler。您还可以使用 SoapUI 调用服务,该服务将显示原始响应。这些都是可以添加到您的武器库中的好(和免费)工具。还有日志功能,可以通过 WCF 服务配置编辑器轻松打开/关闭,但如果您是初学者(或专家......),输出可能有点难以使用。
    • @Ethan: MessageContract 仅在您有多个正文和/或标题部分时才需要。否则,应该使用DataContract
    • @John - 你是对的。 DataContract 就是所需要的。至于我的结束评论,如果服务操作变得复杂,我仍然提倡基于消息的方法,但是可以使用 DataContract 定义消息,除非需要对 SOAP 结构进行更大的控制(例如,将字段提升到标头)。尽管考虑到我回答了操作问题,但我仍然认为 -1 有点苛刻 :) 教我添加额外信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多