asp.net 开发 wap 必备:更好的匹配手机设备-.NET 教程,Asp.Net 开发
虽然微软说 asp.net 能够匹配各种手机设备,但是手机型号众多,微软收集的手机资料有
限,所以导致 asp.net 对很多手机匹配错误,本来可以支持 html 的却生成 html,本来只
支持 wml 的,缺生成了 html 导致手机无法浏览;我们不能等待微软偶尔发布一个设备更
新包---更新有限的手机设备资料,这里我们自己都可以做:
asp.net 识别设备型号是靠 machine.config 或者 web.config 对 http 协议
http_user_agent 设备标示来匹配的,具体的你可以打开 machine.config 里面打开
节来看看。
下面是“强制特定手机生成 wml” 详细的代码,在 web.config 里的
节添加以下代码:
preferredrenderingtype = "wml11"
preferredrenderingmime = "text/vnd.wap.wml"
preferredimagemime ="image/vnd.wap.wbmp"
代码说明:
这里强制生成 wml
preferredrenderingtype = "wml11"
preferredrenderingmime = "text/vnd.wap.wml"
preferredimagemime ="image/vnd.wap.wbmp"
最重要就是
这里是在匹配设备,可以参考正则表达式语法,sec-sghx458 代表三星 x458,
motorola-t33 代表摩托 e360
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
配置了 IIS,,建立了一个 asp.net mobile 工程,又加上了关于 WML MIME 的映射条目,满以为可以测试
了,于是启动 M3Gate,但是失败了,地到的信息为:
“UTF-8 格式不支持”类的错误,于是检查 web.config.的
修改为
再一次启动 IE,测试通过,但是 M3Gate 再一次报错:大致意思为:
对于 Text/Html 格式不支持。
思考,为什么 M3Gate 得到 html 格式的响应而不是 wml 呢?翻阅资料,结合 asp.net 的 WAP 框架知道,原
来,对于设备,需要指定设备的类型,明确通过配置文件告诉框架如何解释 asp.net 的执行结果,这种执行
可能解释成 HTML 也可能解释为 WML,取决于设备是否匹配。那设备匹配是如何实现的呢?主要是通过
machine.cong 文件的或者 web.config 文件的
节,通过 HTTP_USER_AGENT 获取设备标示,只是框架获得设备的一些参数,从而在框
架的配置下得到合适的 wml 文件。
M3Gate 不是标准的 mobile 设备,所以框架不认识,缺省状况下按照 html 设备输出,导致上述错误。
解决办法:让框架知道 M3Gate 是一个设备。
于是,查找 machine.config ,取出其中的一段,复制到 web.config
type = "Ericsson R380"
version = ${browserMajorVersion}.${browserMinorVersion}
majorVersion = ${browserMajorVersion}
minorVersion = ${browserMinorVersion}
preferredRenderingType = "wml11"
preferredRenderingMime = "text/vnd.wap.wml"
preferredImageMime = "image/vnd.wap.wbmp"
inputType = "virtualKeyboard"
canInitiateVoiceCall = "true"
mobileDeviceManufacturer = "Ericsson"
mobileDeviceModel = "R380"
screenPixelsWidth = "310"
screenPixelsHeight = "100"
screenCharactersHeight = "7"
screenBitDepth = "1"
isColor = "false"
maximumRenderedPageSize = "3000"
isMobileDevice="true"
除了其中的 “M3Gate“其他的都是拷贝过来的,测试运行,OK.
那我怎么知道是 M3Gate/0.6 呢?我是建立了一个日志文件,在 page_load 事件中就进行纪录,通过文件的
纪录获取得到我测试用的 M3Gate 的 User_aAgent。代码如洗:
private void _logHTTPHeader()
{
FileStream fs=new FileStream ("F:\\WUTemp\\Log.log",FileMode.OpenOrCreate ,FileAccess.Write );
StreamWriter ws=new StreamWriter(fs);
ws.WriteLine(DateTime.Now.ToShortTimeString () + Request.UserAgent +" "+Request.UserAgent );
ws.Flush();
ws.Close ();
}
平时下班等女朋友总是要等很长时间,想看书又没有带,只有玩手机游戏;GPRS 上网,好象很多内容都
是要付费的,就只有下载铃声,什么图片的,没劲!最好能用手机看看小说,网络上好象没有免费的 WAP
小说,办公室的小妹妹也想用手机看小说,看来只有自己做一个了。
都说 JAVA 是开发 WAP 的利器,不过 WAP 需要这个“码”转到那个“码”,真是麻烦,算了,看一下能
不能用 C#做一个 WAP 小站。
想来也很简单的,WAP 就是用 UTF8 编码嘛,好象还有什么 WML 之类的,WML 在网上查查资料,就和
XML 差不多,平时用 XML 也蛮多的,WML 也就简单了,C#直接可以设 RESPONSE 的编码的,看来有戏
了,先写一个“Hello 老婆“吧,
//设置 ContentType 类型
Response.ContentType="text/vnd.wap.wml";
//设置编码
Response.ContentEncoding=System.Text.Encoding.UTF8;
//以下是根据 WML 协议写的内容部份
WapContent="\r\n";
WapContent+="
\r\n";
WapContent+="\r\n";
WapContent+="\r\n";
WapContent+=" hello 老婆
\r\n";
WapContent+="\r\n";
WapContent+="\r\n";
WapContent+="\r\n";
WapContent+="\r\n";
Response.Write(WapContent);
用手机试一下,OK
现在写小说的 WAP 程序。
先从网上下一篇小说,存在目录下,1.txt
不过小说太大了,必须先要有一个目录,按 2K 分页吧,好家伙,有 200 页,算了,来一个直接选页数的 G
O 吧:
WapContent+="
";
WapContent+="
\n";
WapContent+="\n";
WapContent+="\n";
WapContent+="就看这页!
\n";
WapContent+="\n";
所有的代码:
private void Page_Load(object sender, System.EventArgs e)
{
string WapContent;
string mC;
//在调试时用 GB2312 模拟器
Response.ContentType="text/vnd.wap.wml";
// Response.ContentType="text/vnd.wap.wml;charset=UTF-8";
Response.ContentEncoding=System.Text.Encoding.UTF8;// Unicode ;// "UTF8";
// Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
int n=0;
if(Request["Page"]==null)
{
//显示目录
WapContent="\r\n";
// WapContent="\r\n";
WapContent+="
\r\n";
WapContent+="\r\n";
System.IO.FileInfo oFM=new System.IO.FileInfo(Request.PhysicalPath);
System.IO.StreamReader oReaderD=new System.IO.StreamReader(oFM.DirectoryName +"\\"+ "1.txt",System.
Text.Encoding.Default);
//每次读 3000 字
mC=oReaderD.ReadToEnd() ;
oReaderD.Close();
WapContent+="\r\n";
int k=mC.Length/3000;
WapContent+=" 目录
\r\n";
WapContent+=" 共:"+k.ToString()+"页
\r\n";
WapContent+=" ";
WapContent+="\n";
WapContent+="\n";
WapContent+="\n";
WapContent+="就看这页!
\n";
WapContent+="\n";
WapContent+="
\r\n";
WapContent+=" \r\n";
WapContent+=" \r\n";
WapContent+="\r\n";
WapContent+="\r\n";
WapContent+="\r\n";
WapContent+="\r\n";
Response.Write(WapContent);
return;
}
else
n=System.Convert.ToInt32(Request["Page"]);
WapContent="\r\n";
WapContent+="\r\n";
WapContent+="\r\n";
System.IO.FileInfo oF=new System.IO.FileInfo(Request.PhysicalPath);
System.IO.StreamReader oReader=new System.IO.StreamReader(oF.DirectoryName +"\\"+ "1.txt",System.Tex
t.Encoding.Default);
//每次讯读 3000 字
mC=oReader.ReadToEnd() ;
oReader.Close();
if(mC.Length>4000)
{
mC=mC.Substring((n)*3000,3000);
mC=mC.Replace("\r\n","
");
ArtMore=true;
}
//每屏 3000 字
WapContent+="\r\n";