让IIS Express支持Json文件

问题由来

  同事在做一个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

原文地址:https://www.cnblogs.com/zYier/p/iis-express-support-json-file.html