我有一个返回 XML
的网页,带有 xsl
样式表转换,例如:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='/css/homepage.xsl'?>
<MyData>
...
</MyData>
它正确地将转换后的 XSL 显示为 HTML。但是当我尝试查看 XML 源代码时,Internet Explorer 给我错误:
The XML source file is unavailable for viewing
但我可以为您提供一个网站,其中所需的行为可以完美运行 (Blizzards WoW Armory)(即您可以查看 xml 源):
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/_layout/pageIndex.xsl"?>
<page globalSearch="1" lang="es_mx" requestUrl="/index.xml" type="front">
<pageIndex>
<related-info/>
</pageIndex>
</page>
因此,“这种行为是设计使然”的论点被直接观察覆盖了。
我的 XML 有什么问题,无法显示源 XML?
带你走上错误的道路
这里是一些补充信息。
来自暴雪(工作)站点的 Http 响应 header :
GET http://www.wowarmory.com/ HTTP/1.1
HTTP/1.1 200 OK
...
Content-Type: text/xml;charset=UTF-8
Content-Length: 233
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/_layout/pageIndex.xsl"?><page globalSearch="1" lang="es_mx" requestUrl="/index.xml" type="front">
<pageIndex>
<related-info/>
</pageIndex>
</page>
这是来 self 的(borken)xml 的响应 header :
GET http://www.example.com/default.ashx HTTP/1.1
HTTP/1.1 200 OK
...
Content-Type: text/xml; charset=utf-8
...
Content-Length: 131974
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='/css/homepage.xsl'?>
<MyData>
...
</MyData>
另见
最佳答案
tl;dr:no-cache
已打开
长版
我偶然发现了一个有类似问题的人的博文:
使用 Fiddler 的自动调试功能(我从未使用过的功能),他缩小了响应 header 中特定条目的存在范围:
Vary: *
他不明白为什么这个标题会导致 IE 崩溃,但他能够删除它,并解决了他的问题。我的回复中没有 vary: 0
标题,但它确实给了我一个方向。
我正在阅读处理此选项的文档:HttpCachePolicy.SetOmitVaryStar Method .一件事引起了我的注意:
Note The use of the vary:* header can disable all client caching.
所以我想知道“XML 源不可用于查看”的原因是否是存在强制 IE 在完成后立即删除 XML 源的策略(即不缓存它)
跟随这个人的脚步,我挖出了 fiddler 并打开了响应后自动断点功能。事实证明,您随后可以处理响应 header 、重新排列、添加、更改、删除内容。
原始 header (失败)
HTTP/1.1 200 OK
Date: Thu, 01 Jul 2010 02:53:35 GMT
Server: Microsoft-IIS/7.0
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/xml; charset=utf-8
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Content-Length: 134772
Via: 1.1 www.example.com
<?xml version="1.0" encoding="utf-8"?>
...
我注意到我的标题有与缓存相关的条目:
Cache-Control: no-cache
Pragma: no-cache
也许如果我删除那些?我进入 fiddler 中的位置并手动删除这两行,留下:
删除缓存控制 header
HTTP/1.1 200 OK
Date: Thu, 01 Jul 2010 02:55:06 GMT
Server: Microsoft-IIS/7.0
Content-Type: text/xml; charset=utf-8
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Content-Length: 134772
Via: 1.1 www.example.com
<?xml version="1.0" encoding="utf-8"?>
...
注意:标题不是错误的,内容总是陈旧的,我希望客户端每次都刷新。
我最初的解决方案解决了这个问题,但引入了一个新的 - 因为内容是总是陈旧的。虽然我希望 ie 每次都获取,但我真的不希望它删除自己的本地副本。
ashx
中让我感到悲伤的那一行是:
//client don't cache it (it's too volatile)
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
变成:
Cache-Control: no-cache
删除该行将可缓存性保留为默认值(私有(private)),给出响应值:
Cache-Control: private
这允许客户端缓存内容,我可以在浏览器中查看源代码。
关于xml - 无法使用 IE8 查看 XML 文件的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3153762/