Asp.net mvc Web API IE9 JSON数据“;是否要打开或保存此文件”;

Asp.net mvc Web API IE9 JSON数据“;是否要打开或保存此文件”;,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,首先,请理解我并不是想在IE9中查看JSON。我一直用小提琴。我有一个名为Fine uploader的第三方上传程序,它在成功上传Ajax文件时需要JSON响应消息 现在我知道IE9没有MIME来显示JSON,但我并没有试图显示JSON。我只是在ajax上传了一些文件,IE9试图打开我的ajax响应后返回一个JSON响应 既然我打算用JSON格式化我的所有Web API响应,我是否必须为每个API调用添加自定义文本/html响应内容类型,以使我的应用程序与IE9兼容?非常荒谬的事情,我无法忘记我

首先,请理解我并不是想在IE9中查看JSON。我一直用小提琴。我有一个名为Fine uploader的第三方上传程序,它在成功上传Ajax文件时需要JSON响应消息

现在我知道IE9没有MIME来显示JSON,但我并没有试图显示JSON。我只是在ajax上传了一些文件,IE9试图打开我的ajax响应后返回一个JSON响应


既然我打算用JSON格式化我的所有Web API响应,我是否必须为每个API调用添加自定义文本/html响应内容类型,以使我的应用程序与IE9兼容?非常荒谬的事情,我无法忘记我在处理IE兼容性问题上浪费了多少时间

您希望人们使用IE9使用您的API吗?通常,使用浏览器的人无论如何都无法读取JSON。我建议您使用类似Fiddler2的东西测试您的API

IE9提示您下载该文件的原因是因为它没有MIME处理程序来显示它。浏览器设计为只显示某些mime类型,如text/html、text/xml、image/png、image/jpeg等。通常需要一个特殊的插件来显示自定义类型,如application/pdf。JSON及其应用程序/JSON mime类型也不例外


如果它真的让你那么烦,那就去读一读

问题在于您的响应的内容类型:它必须是“text/plain”,而不是“application/json”。

尽管Ray的答案有效,但这会更改所有json响应的响应内容类型。理想情况下,我们不应该影响运行良好的浏览器的响应类型

有关解决此问题的简单方法(特别是在MVC中),请参阅

简言之,下面的代码实现了这一点,如果适用,可以将其包装到基本控制器/助手方法中:

if (!Request.AcceptTypes.Contains("application/json"))
    return base.Json(data, "text/plain");
else
    return base.Json(data);

我希望这能帮助别人

在WebAPI中,您可以在global.asax中触发的配置中设置全局响应。这样,所有浏览器都将WebAPI响应视为真正的JSON

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // stuff...

        config.Formatters.Add(new JsonMediaTypeFormatter());
        config.Formatters.JsonFormatter.SupportedMediaTypes
            .Add(new MediaTypeHeaderValue("application/json"));

        // Most important... +++++++++++++
        config.Formatters.JsonFormatter.SupportedMediaTypes
            .Add(new MediaTypeHeaderValue("text/html"));
        // -------------------------------

        config.EnsureInitialized();
    }
}

这就是问题所在,我不是在尝试读取/查看JSON,而是将JSON返回给名为Fine uploader的第三方文件上传程序。它需要JSON格式的消息来显示成功的上载({“success”=true})。因此,消费者是Fine Uploader,也就是一些客户端Javascript,IE9正在打开用于Fine Uploader的JSON消息。顺便说一下,这是一个Ajax调用。因此,在初始加载时,mime类型为text/htmlMicrosoft的web API将内容类型设置为application/json。我返回的是json,为什么要将内容类型设置为text/plain?为了安抚IE9?我将我的内容类型更改为text/html,我确信text/plain也可以工作。我试着投票支持你的答案,但我的声誉还不够高,谢谢你的帮助。你可以随时“接受”我的答案。如果我的建议有帮助,请这样做。就text/html与text/plain而言,后者通常是最安全的内容类型。两者都可以,除非您计划在JSON响应中返回HTML。在这种情况下,text/plain是您要使用的内容类型。