Windows Azure 微软公有云体验,三 IIS中文编码解决方案

Windows Azure 微软公有云已经登陆中国有一段时间了,现在是处于试用阶段,Windows Azure的使用将会给管理信息系统的开发、运行、维护带来什么样的新体验呢?

Windows Azure平台中有网站、虚拟机、云服务、SQL数据库、存储、服务总线、网络、管理服务、活动目录等模块。

Windows Azure 微软公有云体验(一)已经对网站做了简单介绍,说到Windows Azure网站模块类似于服务器中的IIS,但是在某些方面跟我们平时使用的会有些区别的,下面谈谈Windows Azure网站模块的IIS中文编码带来的一些问题及解决方案。

饮水思源,转载勿删:www.evkchina.com

我们做了多次测试发现,发布到Windows Azure网站的编码方式为中文时会出现乱码问题,包括两方面:

1.在Get请求有中文参数时,使用IE11时提示502错误(使用F12调试模式中的edge、ie10、ie9、ie8和ie7同样出现此错误)

Windows Azure 微软公有云体验,三 IIS中文编码解决方案

2.对于下载文件名乱码的测试结果如下,

浏览器Debug中文IIS7微软云网站http_user_agent(浏览器版本号)
IE11正常正常正常mozilla/5.0 (windows nt 6.1; wow64; trident/7.0; rv:11.0) like gecko
IE10正常正常正常mozilla/5.0 (compatible; msie 10.0; windows nt 6.2; wow64; trident/6.0)
IE9正常正常正常mozilla/5.0 (compatible; msie 9.0; windows nt 6.1; trident/5.0)
搜狗高速正常正常正常mozilla/5.0 (windows nt 6.1; wow64; trident/7.0; rv:11.0; se 2.x metasr 1.0) like gecko
搜狗兼容正常正常正常mozilla/5.0 (windows nt 6.1; wow64; trident/7.0; rv:11.0; se 2.x metasr 1.0) like gecko
FireFox正常正常正常mozilla/5.0 (windows nt 6.1; wow64; rv:25.0) gecko/20100101 firefox/25.0
Google正常正常正常mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/31.0.1650.63 safari/537.36
Opera正常正常正常mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/31.0.1650.57 safari/537.36 opr/18.0.1284.49
safari 5正常正常乱码mozilla/5.0 (windows nt 6.1; wow64) applewebkit/534.52.7 (khtml, like gecko) version/5.1.2 safari/534.52.7
safari 7正常正常乱码Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) Version/7.0 Safari/537.71
chrome正常正常正常Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1711.3 Safari/537.36
FireFox正常正常正常Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:20.0) Gecko/20100101 Firefox/20.0

safari出现错误,文件名为乱码但是能够正常下载打开

Windows Azure 微软公有云体验,三 IIS中文编码解决方案

首先,是Windows Azure的环境因素,发布到[Windows Azure网站]的所有网站都是在后台的Windows服务器上托管的,Windows操作系统和IIS都是国际统一的,英文环境。因此发布的网站最好显式地设定网站或者文件的编码方式,建议使用UTF-8编码格式。

针对Get请求有中文参数的情况,可尝试显式的指定Charset,如:xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

然后,把中文参数给Encode一下

其次,针对下载文件乱码的情况,建议修改Web.config

将globalization节点修改为<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="GB2312" culture="zh-CN" uiCulture="zh-CN" />后,发布至Windows Azure网站,除了让人揪心的火狐,IE和其他浏览器均正常通过。

3.火狐浏览器下载文件名乱码的解决方法

经过测试,火狐浏览器下载文件时,文件名使用MIME编码方式,可避免文件名出现乱码。

MIME 是“多用途网际邮件扩充协议”的缩写,使用这种编码的原因是因为 Internet 上的很多网关不能正确传输8 bit 内码的字符,比如汉字等。编码的原理就是把 8 bit 的内容转换成 7 bit 的形式以能正确传输。MIME 定义了两种编码方法Base64与QP(Quote-Printable) :

Base 64 编码把三个Byte的数据用 4 个Byte表示,这样,这四个Byte 中,每个 Byte 实际用到的都只有 6 bit。Base 64的缩写为“B”。

QP(Quote-Printable) 编码,是把一个 8 bit 的字符用两位16进制数值表示,然后在前面加“=”。QP(Quote-Printable) 编码的缩写为“Q”

下面是从服务器下载文件的实例:

string cPath = System.Web.HttpContext.Current.Server.MapPath("/我的文件.PNG");

string fileName = "我的文件.PNG"; //输出的文件

string UserAgent = context.Request.ServerVariables["http_user_agent"].ToLower();

//判断浏览器

if (UserAgent.IndexOf("firefox") < 0)

{

//不是火狐浏览器

fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);

}

else

{

//是火狐浏览器,采用 MIME 编码

fileName = "=?GB2312?B?" + Convert.ToBase64String(Encoding.Default.GetBytes(fileName)) + "?=";

}

FileStream fileStream = new FileStream(cPath, FileMode.Open, FileAccess.Read, FileShare.Read);

byte[] bytes = new byte[fileStream.Length];

fileStream.Read(bytes, 0, bytes.Length);

fileStream.Close();

context.Response.AddHeader("content-type", "application/x-msdownload");

context.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");

context.Response.AddHeader("Content-Length", count.ToString());

context.Response.BinaryWrite(bytes);

context.Response.Flush();

context.Response.End();

北京易维清源代码生成软件已完全支持与微软Azure云平台的对接,生成的源代码对各浏览器的兼容性问题已经全部解决。接下来会有更多Windows Azure 微软公有云的体验总结博文,感谢对易北京维清的关注。