当 ASP.net Mobile Controls 碰到“中国特色”的 CMWAP / UNIWAP
一直觉得 ASP.net Mobile Controls 很有用,它可以根据客户端的 UserAgent 自动判断客户端浏览器的能力,自动选择最适合的方式(WML 1.1,XHTML Basic, PC 用的 HTML, 日本 Docomo 和 Willcom 特有的 CHTML 等等)输出内容。
国内说起手机上网,一般称呼是说 WAP。其实目前市场中的很多手机早已不仅仅只支持 WML 1.1 这样的早期格式(如果你试过就知道,WML 居然无法设定字体颜色),新款手机大都开始支持 WAP 2.0 也就是支持 XHTML Basic 格式的内容,不少智能手机也开始支持直接浏览 PC 站点(当然手机屏幕小,浏览 PC 站点其实多半是“应急”,并不见得舒服)。
前一阵看到这么一条新闻说,天下网推出国内首家 WAP 2.0(XHTML)手机站点。其实,把 WAP 1.x (WML 1.1) 和 WAP 2.0 (XHTML) 分开来制作和维护,会很不方便,如果再加上 PC 版那就更多事情要做了。如果使用微软的技术,使用 ASP.net Mobile Controls 来制作手机版站点,就可以很便利的解决这一问题。
因为 ASP.net Mobile Controls 主要是基于 UserAgent 来判断客户端浏览器能力的,所以,如果使用 CMNET 这样的方式上网,是没有什么问题的,绝大多数终端都可以顺利的找到适合自己的格式(WML 1.1 或者 XHTML Basic)。可如果碰到“中国特色”的 CMWAP、UNIWAP 就要瘸腿了。
其实 CMWAP、UNIWAP 之所以“中国特色”,我的看法跟很多人不大一样。我觉得不能仅因为移动或联通人为地把手机上网分成两种方式,就说这是“中国特色”,这种情况在其他国家也有先例。比如日本 Softbank 的常用上网方式就分成三种: Yahoo!Mobile(这个相当于我们的 CMWAP、UNIWAP 方式),PC Site Browser (这个是指通过一个转换软件浏览 PC 站点的服务),PC Site Direct (这个相当于我们的 CMNET 无限制),和我们类似,这三种上网方式的价格也相差很多。
我觉得 CMWAP、UNIWAP “中国特色”是从技术角度看,因为它人为地屏蔽了客户端浏览器发出的 UserAgent!(当然它还屏蔽了很多其他的东西) 缺了 UserAgent ,强大的 ASP.net Mobile Controls 就算“瘸腿”了。
但是尽管瘸腿,ASP.net Mobile Controls 解决方案仍然具有易于制作和维护的特点(因为它制作时不需要特意区分 WML 和 XHTML Basic 等)。针对 CMWAP、UNIWAP 的特点,我推荐一个 .browser 文件:
<browsers> <browser id="ChineseWap" parentID="Default"> <identification> <userAgent match="^\s*$" /> </identification> <capabilities> <capability name="preferredRenderingMime" value="text/html" /> <capability name="preferredRenderingType" value="xhtml-mp" /> </capabilities> <controlAdapters markupTextWriterType="System.Web.UI.XhtmlTextWriter" /> </browser> <browser id="ChineseWapOldModel" parentID="ChineseWap"> <identification> <header name="Host" match="^wap" /> </identification> <capabilities> <capability name="preferredImageMime" value="image/vnd.wap.wbmp" /> <capability name="preferredRenderingMime" value="text/vnd.wap.wml" /> <capability name="preferredRenderingType" value="wml11" /> </capabilities> </browser> </browsers>
第一个 browser 标签“ChineseWap”的意思是将 XHTML Basic 形式作为 CMWAP、UNIWAP 用户(UserAgent 为空白)的默认值。第二个 browser 标签“ChineseWapOldModel” 的意思是,如果 CMWAP、UNIWAP 用户访问的是 wap.xxxx.com/.....aspx 这种形式的 URL 时,默认输出将是 WML1.1。
优点及注意事项:
(1) 或许你已经看出来了,我的方案实际上是通过域名来区分 WAP 1.x 版和 XHTML 版的,在 UserAgent 为空的情况下,访问wap.xxxx.com 是 WAP 1.x 输出,访问主站域名是 XHTML 输出。
(2) 若 UserAgent 不为空,则无论访问哪个域名,都按 UserAgent 去自动匹配适合的形式。比如在 PC 上访问 wap.xxxx.com 返回的仍然是 HTML 而不是 WML。或者通过 CMNET 上网访问 wap.xxxx.com 时仍然会根据 UserAgent 匹配适合的版本。兼容性较好。
(3) 事前应该告诉你的用户:如果使用 CMWAP 、UNIWAP 方式浏览本站时,请根据您的手机选择适合的版本:如果您的手机仅支持 WAP 1.x 则请访问 wap.xxxx.com 域名。如果您不确定,可以先试一下主站是否能访问,访问不了再选 wap.xxxx.com 域名。
忘了说了一点:将这个 .browser 文件保存在 ~/App_Browsers 文件夹下就可以了。