【问题标题】:Why is the entire HttpResponseMessage serialized?为什么要序列化整个 HttpResponseMessage?
【发布时间】:2015-09-19 07:55:28
【问题描述】:

为什么要实现这个 Web API

[HttpGet("hello")]
public HttpResponseMessage Hello()
{
    var res = new HttpResponseMessage(HttpStatusCode.OK);
    res.Content = new StringContent("hello", Encoding.UTF8, "text/plain");
    return res;
}

返回

{
  "Version":{
    "Major":1,
    "Minor":1,
    "Build":-1,
    "Revision":-1,
    "MajorRevision":-1,
    "MinorRevision":-1
  },
  "Content":{
    "Headers":[{
      "Key":"Content-Type",
      "Value":["text/plain; charset=utf-8"]
    }]
  },
  "StatusCode":200,
  "ReasonPhrase":"OK",
  "Headers":[],
  "RequestMessage":null,
  "IsSuccessStatusCode":true
}

而不是

hello

?

如何让 Web API 返回如下 HTTP 响应?

200 OK
Content-Type: text/plain

hello

我最终想要做的是返回带有各种状态码的 JSON 和其他格式,所以下面的代码对我没有帮助。

[HttpGet("hello")]
public string Hello()
{
    return "hello";
}

(我是 ASP.NET 和其他 Microsoft 技术的新手。)

【问题讨论】:

  • 我遇到了类似的问题。我正在返回 HTML,设置正确的内容类型,然后返回一个序列化的 HttpResponseMessage。我创建了一个全新的 WebApi 4.6.1 项目,一对一复制代码,运行测试,结果得到一个 HTML 页面。我想知道它是否与中间件(OWIN)在它消失之前更改内容类型有关。

标签: c# asp.net asp.net-web-api


【解决方案1】:

我最近也发生了同样的事情。原因是,出于某种原因,有两个对 System.Net.Http.dll 程序集的引用:一个来自 GAC,一个来自我的项目的本地副本。

这会导致一个有趣的情况,即您发送的 HttpResponseMessage 类型与 ASP.NET 期望的 HttpResponseMessage 类型不同,这就是为什么在处理消息时,它只是将其序列化为 JSON。

我为此找到的解决方案是从 NuGet 安装 System.Net.Http 包,并确保在 Web.config 上正确生成绑定重定向,以便仅使用一份依赖项。

【讨论】:

    【解决方案2】:

    有趣的是,如果我在 ASP.NET 4 上尝试您的代码

    public HttpResponseMessage Hello()
    {
        var res = new HttpResponseMessage(HttpStatusCode.OK);
        res.Content = new StringContent("hello", Encoding.UTF8, "text/plain");
        return res;
    }
    

    我得到了回应,这是我所期望的。


    标题:

    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Length: 5
    Content-Type: text/plain; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/8.0
    X-AspNet-Version: 4.0.30319
    ...
    X-Powered-By: ASP.NET
    Date: ...
    

    身体

    hello
    

    根据情况,您可以依赖客户端指定它可以接受的内容,也可以指定服务器始终抛出 json。

    我通常有自定义的请求/响应对象,我会返回给客户端。比如

    public CustomResponse Get()
    {
        CustomResponse response = new CustomResponse();
    
        // some work
        response.TestProperty1 = "Test Value 1";
        response.TestProperty2 = "Test value 2";
    
        return response;
    }
    

    现在,如果您的 API 会尊重您的客户接受的内容。因此,如果客户端设置请求标头“接受:应用程序/xml”,那么它会返回 xml 或 json 如果它的 json。请参阅下面的提琴手请求的屏幕截图。

    根据记忆,我认为您也可以在服务器上指定,也可以说总是发送 json。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      ASP.net Web Api 使用名为 Content Negotiation 的东西,客户端指定要返回的内容。

      在您的情况下,您可以指定要返回 text/plain,并且内置的内容协商应该提供您想要的。

      您尚未指定如何发出请求 - 在浏览器中手动(哪个浏览器)/通过 jquery $.ajax / .net 客户端代码/等等 - 以及您发出请求的方式决定了您如何添加 @987654323 @该请求的标头,例如:

      GET http://[url] HTTP/1.1
      Accept: text/plain
      

      可以覆盖内容协商并始终返回特定类型(例如 JSON),关于如何执行此操作有很多关于 SO 的问题 - 主要是因为他们想要 JSON 但获取 xml 并且不知道如何请求 JSON .如果您正在创建一个可重用的 Web API,那么您应该让客户端来请求他们想要的东西,这就是它以这种方式构建到框架中的原因。

      【讨论】:

        【解决方案4】:

        (自答)嗯……原因可能是我选择了

        ASP.NET 5 Preview Templates
        

        而不是

        ASP.NET 4.5.2 Templates
        

        当我尝试创建 Web API 时。

        我猜这可能是 ASP.NET 5 预览版的一个错误,或者 ASP.NET 5 引入了另一种取代 HttpResponseMessage 的新机制。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-17
          • 2012-06-12
          • 2011-02-28
          • 2015-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多