在IISExpress 10和VS2015上使用HTTPS时,web api控制器不会发回HttpResponseMessage的ReasonPhrase。如果我通过HTTP连接它可以正常工作,但HTTPS只是清除了原因。当部署到azure时,这不会发生(https按预期工作),它只发生在我的本地计算机上。
您可以通过使用web api支持框架4.5.2创建一个新的mvc应用程序来重现这一点。创建一个新的web api控制器(它将使用mvc控制器和HttpStatusCodeResult执行相同的操作)并添加一个post命令,例如:
public HttpResponseMessage Post()
{
var ret = new HttpResponseMessage((HttpStatusCode)270) { ReasonPhrase = "Test reason phrase", Content = new StringContent("test content") };
return ret;
}
我用邮递员来测试它。通过http,状态将是
270 Test reason phrase
通过HTTPS它只是
270 OK
您可以设置断点,并且无论请求来自何处,都可以正确设置ret,因此IIS中的某些内容会覆盖HTTPS上的ReasonPhrase。
我尝试将web.config中的httpErrors设置为errorMode和existingResponse的几乎所有组合。我的machine.config(适用于任何版本的.net)未在任何地方设置为零售。 .vs中的application.config将httpErrors设置为overrideModeDefault =“Allow”。
我无法想到或找不到任何其他建议来修改设置。这只是iisexpress的错误/限制吗?还是有一些我不知道的魔法设置?
更新
我用Windows 10和VS2015制作了一个虚拟机进行测试。结果相同。我还在VM上启用了IIS(正常的IIS)并发布到它。同样的结果也是如此。
我还将状态代码更改为570只是为了好玩,并给出相同的结果,“570 OK”,我发现这很有趣,因为5xx不被认为是成功代码,所以我会期待与OK不同的东西。
答案 0 :(得分:1)
我遇到了同样的问题,看起来这是因为IIS 10.0使用HTTP / 2和浏览器,这不允许使用ReasonPhrase字段。
https://tools.ietf.org/html/rfc7540#section-8.1.2.4
8.1.2.4。响应伪标头字段
对于HTTP / 2响应,单个“:status”伪标头字段是 定义了携带HTTP状态代码字段(参见[RFC7231], 第6节)。这个伪头字段必须包含在所有中 对策;否则,反应不正确(第8.1.2.6节)。
HTTP / 2没有定义携带版本或原因短语的方法 它包含在HTTP / 1.1状态行中。