IISExpress 10不会通过HTTPS

时间:2016-02-22 05:05:32

标签: asp.net asp.net-web-api iis-express

在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不同的东西。

1 个答案:

答案 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状态行中。