【问题标题】:Changing response content type in asp.net Web API在 asp.net Web API 中更改响应内容类型
【发布时间】:2015-10-15 10:13:03
【问题描述】:

我有一个带有上传操作的 asp.net Web Api 控制器。这是上传操作的简化版本:

[HttpPost]
public async Task<string> Upload()
{            
    if (!Request.Content.IsMimeMultipartContent())
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

    var provider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(provider);
    var file = provider.Contents[0];

    try
    {
       // Save the file...
    }
    catch (Exception e)
    {
        return JsonConvert.SerializeObject(new
        {
            status = "error",
            message = e.Message
        });
    }

    return JsonConvert.SerializeObject(new
    {
        status = "success"
    });
}

操作的返回类型必须是字符串,因为它由仅接受序列化 JSON 的第三方上传小部件使用。

问题是当我在 IE 9 中使用它时,浏览器不接受 application/json 作为媒体类型。所以,我必须确保服务器返回plain/text。如何在不将操作的返回类型更改为 HttpResponseMessage 的情况下做到这一点?

【问题讨论】:

    标签: c# asp.net-web-api internet-explorer-9 content-type


    【解决方案1】:

    你可以这样做:

    public async Task<JsonResult> Upload()
    return Json(someData, "text/html");
    

    虽然另一个仅返回 json 的选项是通过 iFrame 发布的,但它不会尝试下载返回的 html。

    【讨论】:

    • 正如我在问题中所说,Action 必须返回字符串。我无法返回 Json。此外,对于 IE 9,文件通过 iFrame 上传。但是,这没关系。
    • 我想你错过了它在做什么。您可以返回具有不同内容类型的 json 结果。这意味着 json 结果可以以 html、纯文本等形式返回。因此,如果您不希望它以这种方式格式化并将返回类型指定为 text/plain,请不要将其序列化为 json。
    • 另外,由于您没有将任何内容传递给您的方法,请将其更改为 HttpGet,并且您在 IE9 中应该没有任何问题。
    • 我使用的是 asp.net Web API,而不是 asp.net MVC。 JsonResult 是一个 asp.net MVC 返回类型。但是,感谢您帮助我了解返回类型的工作原理。我最终使用HttpResponseMessage 并将媒体类型指定为text/html。这样,javascript 代码仍然返回一个 JSON 字符串。
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多