项目:xx 之 手工派单
项目介绍: xx 有两个派单形式,一是自动派单,二是手工派单.自动派单已经有程序实现,因此,需要用c#实现手工派单模块,由于xx的派单流程是 从综合告警(c/s)传 整个告警对象的某些设置的属性 到emos(电子运维)系统(b/s),因此,在该模块中,用到了webbrowser控件.
程序处理流程介绍:
在程序中,首先读取一个配置文件的结点,查找到告警对象的某个属性,然后获取属性值(用反射),拼一个htm页面.该页面代码如下:
string s=
< html xmlns = ' http://www.w3.org/1999/xhtml ' >
< meta http - equiv = ' Content-Type ' content = ' text/html;charset=gb2312 ' >
< head >< title > 表单设置 </ title >
</ head >
< body id = ' CForwardDlg ' BGCOLOR = ' LIGHTGREY ' onload = ' onload(); ' >
< form method = ' post ' action = ' http://localhost/test.asp ' id = ' ID_AlarmForm ' name = ' ID_AlarmForm ' >
< input type = ' hidden ' name = ' oriAlarmId ' id = ' ID_oriAlarmId ' value = ' 2007-8-21 21:36:42 ' />
< input type = ' hidden ' name = ' alarmTitle ' id = ' ID_alarmTitle ' value = ' HLR北京 ' />
< input type = ' hidden ' name = ' alarmCreateTime ' id = ' ID_alarmCreateTime ' value = ' www ' />
< input type = ' hidden ' name = ' neType ' id = ' ID_neType ' value = ' beijing ' />
< input type = ' hidden ' name = ' neName ' id = ' ID_neName ' value = ' hubeisheng ' />
< input type = ' hidden ' name = ' alarmLevel ' id = ' ID_alarmLevel ' value = ' wuhanshi ' />
< input type = ' hidden ' name = ' alarmType ' id = ' ID_alarmType ' value = ' 12222 ' />
</ form >
< script language = ' javascript ' type = ' text/javascript ' >
function onload()
{
var tt = document.getElementById( ' ID_AlarmForm ' );
if (tt != undefined)
{
tt.submit();
}
}
</ script >
</ body >
</ html >
然后,post接收页面:
< head >
< title > 工单手工前转 </ title >
< META HTTP - EQUIV = " Content-Type " CONTENT = " text/html; charset=gb2312 " />
< script language = " JavaScript " >
<!--
function onload()
{
document.ID_AlarmForm.submit();
}
-->
</ script >
</ head >
< BODY BGCOLOR = LIGHTGREY >
< div id = " DB " >
</ div >
< pre >
userName : <% = request( " userName " ) %>
systemName : <% = request( " systemName " ) %>
serSupplier : <% = request( " serSupplier " ) %>
serCaller : <% = request( " serCaller " ) %>
callTime : <% = request( " callTime " ) %>
alarmID : <% = request( " alarmID " ) %>
orialarmId : <% = request( " oriAlarmId " ) %>
alarmTitle : <% = request( " alarmTitle " ) %>
alarmCreateTime : <% = request( " alarmCreateTime " ) %>
neType : <% = request( " neType " ) %>
neName : <% = request( " neName " ) %>
alarmLevel : <% = request( " alarmLevel " ) %>
alarmType : <% = request( " alarmType " ) %>
alarmRedefLevel : <% = request( " alarmRedefLevel " ) %>
alarmRedefType : <% = request( " alarmRedefType " ) %>
alarmLocation : <% = request( " alarmLocation " ) %>
alarmDetail : <% = request( " alarmDetail " ) %>
alarmPropose : <% = request( " alarmPropose " ) %>
alarmRegion : <% = request( " alarmRegion " ) %>
</ pre >
<!-- 当派单成功或取消时模拟Click下面相应的BUTTON,ID保持不变 -->
< BUTTON STYLE = " WIDTH:30 " ID = " ButtonOK " > 确定 </ BUTTON >
< BUTTON STYLE = " WIDTH:30 " ID = " ButtonCancel " > 取消 </ BUTTON >
</ BODY >
</ HTML >
webbrowser绑定:
webBrowser.DocumentText=s;
最后,在页面上,webbrowser上显示的结果,最后接收页面,中文会出现乱码.而如果把这两处代码保存为htm 和asp页面后,浏览htm页面post后asp页面不会出现乱码.
解决办法:
程序中不拼写第一个页面,改为这样的:
strTemp = string.Format(@"{0}={1}&", s, System.Web.HttpUtility.UrlEncode(strValue, System.Text.Encoding.GetEncoding("gb2312")));
strBuilder.Append(strTemp);
既弄成象url地址一样的串.但是,主要的一点,还是 System.Web.HttpUtility.UrlEncode的转换.
最后,绑定到webbrowser控件:
string headers = "Content-Type: application/x-www-form-urlencoded";
this.webBrowser.Navigate(http://localhost/test.asp, "", System.Text.Encoding.GetEncoding("gb2312").GetBytes(s), headers);
读取webBrowser的源码
不能够直接用webBrowser.DocumentText读取,这样出来的是乱码
System.IO.StreamReader streamReader = new System.IO.StreamReader(this.webBrowser.DocumentStream, System.Text.Encoding.GetEncoding("gb2312"));
string strWebBrowserDocument = streamReader.ReadToEnd();