【问题标题】:RESTful web service returning XML not JSON返回 XML 而非 JSON 的 RESTful Web 服务
【发布时间】:2011-12-01 15:09:59
【问题描述】:

我有这个简单的 Web 服务,现在它只是查看部件号是否为 A123456789,然后返回一个型号。这将被连接到数据库以检查零件号然后返回实际型号的逻辑所取代。但此时我只需要它返回一些虚拟 JSON 数据。但是,当我使用 Fiddler 并查看 http://localhost:PORT/Scan/Model/A123456789 的网络浏览器中的调用时,它会返回此

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Model: CVS-1679</string>

但是当我在相同 URI 的提琴手中执行 GET 时,我得到了

"Model: CVS-1679"

仅在 textview 选项卡下。

当我将 ResponseFormat 设置为 JSON 时,为什么它以 XML(在浏览器中和 Fiddler 中的文本)而不是 JSON 返回?

我的代码:

[WebGet(UriTemplate = "Model/{partno}", ResponseFormat = WebMessageFormat.Json)]
        public string Model(string partno)
        {
            if (partno == "A123456789")
            {
                string modelno = "CVS-1679";
                return "Model: " + modelno;
            }
            else
            {
                string modelno = "CVS-1601";
                return "Model: " + modelno;
            }
        }

【问题讨论】:

  • 确保在向 REST 服务发出请求时将 Content-Type 设置为 application/json

标签: c# asp.net wcf json rest


【解决方案1】:

ASP.NET webservice 默认返回 XML/SOAP 消息。如果要返回 Json 字符串,则需要使用 [ScriptService] 属性装饰 Web 服务。这会通知 IIS 该服务将由 ASP.NET AJAX 调用使用。这些属性是 System.Web.Extensions 的一部分。

您可以通过使用 ScriptMethod 属性装饰 webmethod 来定义 web 方法响应格式。

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

但是,即使通过这些属性装饰了 webservice 和 webmethod,响应仍然可以是 XML 格式。当发出请求的客户端未将请求标头内容类型设置为“application/json”时,会发生此行为。

在使用 JavaScriptSerializer 从 webmethod 序列化返回方法调用到 Json 字符串之前

使用 Fiddler 调试 WebService

使用 fiddler 来测试 webservice 非常简单。下图是如何调用返回 json 字符串的 Web 服务的示例。 请注意,请求内容类型设置为application/json。请求正文部分中提到了webservice期望的参数。

注意请求内容类型设置为application/json。

【讨论】:

    【解决方案2】:

    如果您查看获得的数据格式,它会以 Json 形式返回...

    key: value
    

    或者在你的情况下

    string Model = "CVS-1679"
    

    当您在提琴手中查看它时,您会看到从一个 MS 端点到另一个端点的原始序列化传输。 .NET 框架中的序列化和反序列化元素负责通过网络传输它,因此当您在调用端将对象返回到您的 .NET 应用程序时,您会得到一个名为 Model 的变量,该变量具有您期望的值.

    如果您尝试发送整个类,您会看到很多嵌套的 XML 标记,但是当您在代码中获取对象时,您会在对象层次结构中看到一等公民。

    它出现在浏览器中的原因是,浏览器不知道如何反序列化它,所以只显示文本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2012-02-26
      • 2023-04-05
      • 2012-06-20
      • 1970-01-01
      相关资源
      最近更新 更多