我怎么能说服IE只显示application/json而不是提供下载呢?

Che*_*eso 161 ajax asp.net-mvc jquery internet-explorer asp.net-ajax

在调试使用AJAX的jQuery应用程序时,我经常需要查看服务返回给浏览器的json.所以我将把JSON数据的URL丢弃到地址栏中.

这对ASPNET很好,因为在编码错误的情况下,我可以在浏览器中看到ASPNET诊断:

替代文字

但是当服务器端代码正常工作并实际返回JSON时,IE会提示我下载它,所以我看不到响应.

替代文字

我可以让IE不这样做,换句话说,只是将它显示为纯文本?

我知道如果我将Content-Type标头设置为,我可以这样做text/plain.

但这特别是ASPNET MVC应用程序的上下文,当我在我的一个动作方法上使用JsonResult时,它自动设置响应.另外,我有点想保留适当的内容类型,而不是仅仅为了支持调试工作而改变它.

Che*_*eso 232

我找到了答案.

您可以通过更新注册表将IE8配置为在浏览器窗口中显示application/json.不需要外部工具.我没有对此进行广泛测试,但它适用于Vista上的IE8.

要使用此功能,请记住,有关更新注册表的所有常见注意事项均适用.停止IE.然后,将以下内容剪切并粘贴到文件中,名称为json-ie.reg.

Windows Registry Editor Version 5.00
;
; Tell IE to open JSON documents in the browser.  
; 25336920-03F9-11cf-8FD0-00AA00686F13 is the CLSID for the "Browse in place" .
;  

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00
Run Code Online (Sandbox Code Playgroud)

然后双击.reg文件.重启IE.在勾选返回带有Content-Type: application/jsonContent-Type: text/json如下的doc的URL时获得的新行为:

替代文字

它做了什么,为什么它的工作原理:

25336920-03F9-11cf-8FD0-00AA00686F13是"就地浏览"操作的CLSID.基本上这个注册表项告诉IE,对于具有mime类型的application/json的文档,只需查看它.这不会影响通过<script>标签或XHR等下载的任何application/json文档.

CLSID和编码密钥获得用于相同的价值观image/gif,image/jpegtext/html.

此提示来自此站点,以及Microsoft 在Internet Explorer中处理MIME类型的文章.


在FF中,您也不需要外部加载项.你可以使用view-source:伪协议.在地址栏中输入这样的URL:

view-source:http://myserver/MyUrl/That/emits/Application/json
Run Code Online (Sandbox Code Playgroud)

这个伪协议曾经在IE中得到支持,直到WinXP-sp2,当微软出于安全原因禁用它时.

  • 如果你想跳过创建注册表文件,这里有一个单行,你可以粘贴到powershell窗口:`reg add"HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json"/ t REG_SZ/d"{25336920-03F9 -11cf-8FD0-00AA00686F13}"; reg添加"HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json"/ v Encoding/t REG_DWORD/d 0x08000000` (13认同)
  • @Mosh,这是上面的nathanvda提到的,解决方案不是让网站用户可以查看JSON,它只是为了调试目的.阅读整个问题. (7认同)
  • 我犯了一个致命的错误,就是允许一个朋友借我的盒子,他就跑了这个修理.有谁知道原始设置是什么,以便我可以逆转它们? (3认同)
  • @nathanvda,没有必要向世界上最大的部分询问任何事情.在浏览器中显示JSON是AJAX页面的开发人员想要做的事情.对于普通用户,在浏览器中显示JSON是完全没有必要的. (2认同)
  • 这仍然在赢得8.1的IE11中工作.甚至不需要重启浏览器.在我的情况下,我需要`text/json`键. (2认同)

小智 15

我遇到了类似的问题.我使用的是"$.GetJSON"jQuery,一切都在Firefox和Chrome中完美运行.

但它在IE中无效.所以我试图直接访问json的URL,但在IE中,它询问我是否要下载该文件.

经过多次搜索后,我发现结果中必须有一个带有内容类型的标题,在我的例子中,内容类型是:

header("Content-type: text/html; charset=iso-8859-1");
Run Code Online (Sandbox Code Playgroud)

但是当发出请求的页面收到这个json时,在IE中,你必须指定SAME CONTENT-TYPE,在我的例子中是:

$.getJSON (
"<? site_url php echo (" ajax / tipoMenu ")?>"
{contentType: 'text / html; charset = utf-8'},
function (result) {
Run Code Online (Sandbox Code Playgroud)

拥抱

  • 在进行Ajax调用并接收json时,这在IE7中是如何工作的?我没有使用getJSON而是使用.ajax调用.我在响应和标题中使用了该内容类型,它根本没有帮助.也没有使用json2.js.有没有人成功实现这个在ie7中工作?IE7占我们用户的30%以上.悲伤但却是真实的,并且注册密钥更改不是一种选择.告诉一百万政府用户只是运行一个reg hack将无法飞行. (2认同)

Tom*_*Maj 12

上面的解决方案是缺少的东西,下面的代码应该适用于所有情况:

Windows Registry Editor Version 5.00
;
; Tell IE to open JSON documents in the browser.  
; 25336920-03F9-11cf-8FD0-00AA00686F13 is the CLSID for the "Browse in place" .
;  

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/x-json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00
Run Code Online (Sandbox Code Playgroud)

只需保存文件json.reg,然后运行以修改您的注册表.