问题由来
同事在做一个web系统的二级联动时将联动数据保存在一个Json文件中,当他将代码提交后,到我机子上运行时总是报该文件404错误,反复检查路径以及权限并没有问题。将问题反馈给他时,他表示在他机子上的本地IIS上运行并没有什么问题。。。等等,本地IIS,而我是运行在IIS Express中,显然由于本地IIS和IIS Express的配置差异导致的对Json文件处理方式不同导致的。
解决问题
我并没有马上去搜索本地IIS和IIS Express的差异,而是先翻了下他的代码:
1 $.getJSON("../Content/file/resource.json", function (data) 2 { 3 //balablaablabn 4 })
使用的$.getJson(),(这个不常用,还是找下具体用法吧)。w3school的解释是通过 HTTP GET 请求载入 JSON 数据。语法:jQuery.getJSON(url,data,success(data,status,xhr)),相当于
$.ajax({
url: url,
data: data,
success: callback,
dataType: json
});
OK,返回数据类型为json的ajax请求,并没有对文件格式有特殊要求,既然这样,那我将其json文件修改成js文件应该就可以。
实践证明将其resource.json文件改成resource.js即可,就不需关注IIS和IIS Express两兄弟有什么不同了。
将我的修改想法告诉了同事,没想到此君表示,既然是IIS Express为什么要改他的代码,这个json文件存储的只是json数据,坚决不同意修改文件类型。-_-! -_-!
问题再解决
好吧,看来只有找找”两兄弟“的问题了,寻找解决方案......
不一会同事通过内部通讯工具发来一个链接,链接是园子的一篇关于这个问题解决方案的文章。(对于这位“固执”而又积极寻找解决方案的同事我只能说一个字:屌 !)
既然前辈们都已踩过坑了,那就好办。根据前辈的解决方案是IIS Express没有配置Json文件的处理程序,只要增加对应配置即可,IIS Express 对应配置文件夹为:
“%UserProfile%DocumentsIISExpressconfig“
这个文件夹有3个文件:applicationhost.config、aspnet.config、redirection.config。这里配置的文件是applicationhost.config。打开文件,找到配置节location>system.webServer>handlers,就是它了,在handlers下增加一个对于json文件的配置:
<handlers accessPolicy="Read, Script"> <!-- 添加对Json文件的支持 --> <add name="Json" path="*.json" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%asp.dll" resourceType="File" /> </handlers>
保存配置文件,重启IIS Express,成功!
问题到此基本算是解决了,但是不安分的我到是对applicationhost.config这个配置文件有了兴趣。好吧,这个文件里面配置内容还是很丰富的,而且里面许多配置都能子啊IIS管理里工具里面见到(他们本来就是兄弟好嘛>_<!!!)。然后又去微软社区看了下关于IIS Express的介绍,大致系统了解了下IIS Express。
我发现在location同一级的system.webServer节点下有个"staticContent"节点,节点里是mime类型列表,这个不是静态内容列表么,IIS对静态对允许的静态内容不是直接下载的么,那JSON文件也应该像JS文件一样直接下载的。在对于js类型文件后面增加一个对于json文件的配置:
<staticContent lockAttributes="isDocFooterFileName"> <!--新增的--> <mimeMap fileExtension=".json" mimeType="application/javascript" /> <!--已有的--> <mimeMap fileExtension=".js" mimeType="application/javascript" /> </staticContent>
再验证下这种方式是否有效,嘿嘿i额,居然成功了,那就说明此方法有效。
总结
总结一下,对于这个问题,目前我已找到三种解决方法:
1)将json文件修改为js文件;
2)修改IIS Express配置文件,在配置节location>system.webServer>handlers下添加对json文件的处理节点:
<add name="Json" path="*.json" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%asp.dll" resourceType="File" />;
3)修改IIS Express配置文件,在配置节system.webServer>staticContent下添加json类型文件作为静态文件处理:
<mimeMap fileExtension=".json" mimeType="application/javascript" />
参考
1)http://www.cnblogs.com/lvduanbing/p/3325921.html
2)http://www.iis.net/learn/extensions/introduction-to-iis-express