【问题标题】:.Net Web Service content-type.Net Web 服务内容类型
【发布时间】:2010-02-11 17:17:44
【问题描述】:

我需要创建一个应该接收 xml 并返回 xml 的 .Net Web 服务(WCF 是不可能的)。我最初是这样设置函数的:

[WebMethod]
public string myFunc(string xmlRequest)
{

如何将 HTTP POST 内容类型更改为 text/xml?另外,我将 xml 响应作为字符串返回,但在 Web 服务帮助页面中它说响应将是:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.mysite.com/myFunc">string</string>

我需要以某种方式删除那个根 &lt;string&gt; 元素。

此 Web 服务被另一家公司调用,该公司可能未使用 .Net 将 XML 作为 text/xml 发布到我的端点。

【问题讨论】:

    标签: .net xml web-services content-type


    【解决方案1】:

    我有一个开源 Web 服务框架(在 .NET 和 Mono 上运行),它极大地简化了创建 Web 服务所需的工作。它会自动配置为为您的所有 Web 服务提供 XML(+REST)、JSON(+REST)、SOAP 1.1/1.2 端点:

    可通过以下方式获得:

    http://www.servicestack.net/

    还有一个现场 javascript 和 silverlight 演示可用(在 CentOS/Nginx 上运行): http://www.servicestack.net/ServiceStack.Examples.Clients/Default.htm

    还有一个在线教程介绍了创建和使用 Web 服务的过程(适用于 MonoTouch,但适用于任何地方):

    http://www.servicestack.net/monotouch/remote-info/

    【讨论】:

      【解决方案2】:

      要删除字符串,您必须将返回参数 xml 设置为:

      public **System.Xml.XmlDocument** MyFunc(string xmlRequest)
      

      这会使响应变成;

      HTTP/1.1 200 OK
      
      Content-Type: text/xml; charset=utf-8
      
      Content-Length: length
      
      
      <?xml version="1.0" encoding="utf-8"?>
      xml
      

      【讨论】:

        【解决方案3】:

        有效的 XML 文档必须包含根元素。除非存在 string 元素,否则它不是 XML。否则,它将是纯文本响应。

        【讨论】:

          【解决方案4】:

          等一下,您是否希望将数据作为 XML 发布,但将其作为 XML 字符串接收回来?如果我没有误解你在说什么,那肯定是你在做的事情,老实说,这感觉很不对。

          在web服务中不能把字符串解析成XML文档,其他公司处理不了单节点的XML文档的原因是什么?他们不能从那个单个节点获取字符串值,然后自己解析字符串 XML 吗?

          【讨论】:

            【解决方案5】:

            &lt;string&gt; 元素按原样显示,因为您的方法被定义为返回一个字符串。在幕后,.NET 实际上只是获取您的方法返回的任何对象,并将其序列化。序列化字符串表示为&lt;string&gt;actual string contents&lt;/string&gt;。

            您想要做的是以某种方式返回一个序列化为您想要的消息的对象,或者假设您的字符串实际上包含 XML,将其直接写入响应流。

            我从未真正从 [WebMethod] 中尝试过,但它可能会像这样工作:

            [WebMethod]
            public void myFunc(string xmlRequest)
            {
                var myXml = @"<?xml version="1.0" encoding="utf-8"?><myRoot><myElement /></myRoot>";
                Response.ContentType = "text/xml";
                Response.Write(myXml);
                Response.Flush();
                Response.Close();
            }
            

            顺便说一句,WCF 实际上做同样的事情。如果定义 WCF 服务操作:

            [OperationContract]
            public string myFunc()
            {
                return "hi";
            }
            

            返回的 XML(实际上进一步包装在 SOAP 中)是 &lt;string&gt;hi&lt;/string&gt; 就像您在此处使用经典 Web 服务一样。在 WCF 中“解包”该 XML 有点痛苦。您必须创建一个自定义消息编写器 IIRC。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-11-17
              • 1970-01-01
              • 2012-09-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多