【问题标题】:WCF RESTFul service - Pass XML as string to serviceWCF RESTFul 服务 - 将 XML 作为字符串传递给服务
【发布时间】:2011-08-07 20:34:34
【问题描述】:

我需要能够将 XML 作为字符串传递给 RESTFul WCF 服务,但是我很难做到这一点。有人可以让我知道我该怎么做吗?它必须作为字符串发送,我不能将其包装在数据合同等中。下面的服务合同示例

[OperationContract]
[WebInvoke(Method = "POST",
            UriTemplate = "lookup",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Xml)]
Stream LookupPostcode(string requestXml);

在此先感谢

【问题讨论】:

    标签: xml wcf rest


    【解决方案1】:

    这完全是题外话,但试图将 WCF 转变为 RESTful 将是一场持久战,您最终会投降。 WCF 的面向消息的 RPC 和基于 SOAP 的 configure-everything-in-XML 特性使得编写简单的 REST 服务变得如此困难。

    如果您对项目没有深入了解,请尝试研究其他替代方案并为此放弃 WCF。

    【讨论】:

    • 在 WCF 3.5 和 WCF 4 中就是这种情况,但这里的新 WCF Web API wcf.codeplex.com 是完全不同的故事。它具有您需要的所有灵活性,并且非常符合 HTTP。
    • @Darrel 我自己从来没有使用过 WCF 4,但是 public JsonValue GetAll() 和围绕它的大量臃肿代码让我丧命。
    • 如果简单就是你想要的,那么我有你所需要的:-) bizcoder.com/index.php/2011/04/16/…
    • @Darrel 现在是这样,但我仍然不相信。 WCF 的 REST 方法有各种固有的架构缺陷,至少对我来说是不合适的。但是你的代码真的很好。
    • 我当然理解你的怀疑,但是新的 WebAPI 东西已经在来自不同背景的一些重型 REST 人员的指导下进行了严格的重新架构和完成。这不是美容增强。
    【解决方案2】:

    尝试使用XElementStream 作为方法参数。

    [OperationContract] 
    [WebInvoke(Method = "POST",
               UriTemplate = "lookup",
               BodyStyle = WebMessageBodyStyle.Bare,
               ResponseFormat = WebMessageFormat.Xml)] 
    Stream LookupPostcode(Stream requestXml); 
    

    ...

    [OperationContract] 
    [WebInvoke(Method = "POST",
               UriTemplate = "lookup",
               BodyStyle = WebMessageBodyStyle.Bare,
               ResponseFormat = WebMessageFormat.Xml)] 
    Stream LookupPostcode(XElement requestXml); 
    

    ...不确定您要在该方法内部做什么,否则我可能会提供更多帮助。

    【讨论】:

    • 您是否能够让 Stream 参数在 WCF 3.5 中工作,还是只能在 WCF 4 中工作?我永远无法在 3.5 中使用它。
    • 我一直在 .Net 3.5 中使用它。我相信你必须从缓冲中改变绑定模式。
    • 酷。我认为您指的是 TranferMode = Streamed。我一直认为这只适用于流媒体,不适用于常规参数。
    【解决方案3】:

    这是一个重大的 hack,但您可以像这样将 XML 包装在 <string> 标记中。

     XmlDocument body = new XmlDocument();
     body.Load(...);
    
     postData = @"<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'><![CDATA[" + body.OuterXml + "]]></string>";
    

    【讨论】:

      【解决方案4】:

      将 xml 包装在 CDATA 标记中会阻止解析器将其视为 xml:

      myString = "<![CDATA[<thexml/>]]>"
      

      【讨论】:

        猜你喜欢
        • 2010-10-07
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        • 2015-06-03
        • 2011-10-10
        • 1970-01-01
        相关资源
        最近更新 更多