为什么整个HttpResponseMessage序列化?

时间:2015-09-19 07:55:28

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

为什么要使用此Web API

{
  "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

而不是

200 OK
Content-Type: text/plain

hello

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

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

我最终要做的是返回JSON和其他具有各种状态代码的格式,因此以下代码无法帮助我作为答案。

{{1}}

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

4 个答案:

答案 0 :(得分:0)

有趣,如果我在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会尊重客户接受的内容。因此,如果客户端设置请求标题&#34;接受:application / xml&#34;然后如果它的json,它将返回xml或json。请参阅下面的fiddler请求的屏幕截图。

从内存中,我认为你也可以在服务器上指定总是发送json。

Client Accepts JSON

Client Accepts XML

希望这有帮助!

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

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

ASP.NET 5 Preview Templates

而不是

ASP.NET 4.5.2 Templates

当我尝试创建Web API时。

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

答案 3 :(得分:0)

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

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

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