Web APi Void,IIS表达内容类型,IIS无内容类型

时间:2013-10-10 19:47:31

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

好的,所以我有一个带有动作和返回类型为void的web api控制器。当我使用VS的内置iisepxress运行它并调用它时,我按预期返回204。这是标题:

Cache-Control   no-cache
Connection  close
Content-Type    text/html
Date    Thu, 10 Oct 2013 19:33:43 GMT
Expires -1
Pragma  no-cache
Server  Microsoft-IIS/8.0
X-AspNet-Version    4.0.30319
X-Powered-By    ASP.NET

当我在sbx环境中输入完全相同的代码时,我得到一个204,但是有以下标题:

Cache-Control   no-cache
Date    Thu, 10 Oct 2013 19:39:59 GMT
Expires -1
Pragma  no-cache
Server  Microsoft-IIS/7.5
X-AspNet-Version    4.0.30319
X-Identifier    17253
X-Powered-By    ASP.NET

相关的区别在于第二个中缺少contentType。

这会产生的问题是在firefox(和我认为的IE)中它默认为xml,尝试解析它并失败。

我知道如何通过在我的web api控制器中设置我的contentType来解决这个问题,但这对我来说似乎不是最佳解决方案。

那么,我要问的是IIS中的设置差异可能导致了什么?

由于

注意: 我的网址看起来像/ foo / bar / 2所以它不是mimetype。

3 个答案:

答案 0 :(得分:1)

如果您的服务使用204响应,则响应不应包含消息正文。 This is by spec。我只能假设您正在回复邮件正文中的内容。

您对API方法的回答应如下所示:

return new HttpResponseMessage { StatusCode = System.Net.HttpStatusCode.NoContent }

修改的。我注意到你提到你返回“无效”。您的方法应该使用我在上面提到的StatusCode返回HttpResponseMessage。

答案 1 :(得分:0)

这将解决问题:

    protected internal virtual IHttpActionResult NoContent()
    {
        HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.NoContent) {Content = new StringContent(string.Empty, Encoding.UTF8)};
        return this.ResponseMessage(responseMsg);
    }

但仍然没有解释为什么IIS默认添加: Content-Type text / html

甚至更好的方法是使用web.config或IIS配置删除它。

答案 2 :(得分:0)

我用这个:

返回StatusCode(HttpStatusCode.NoContent);