日历归档 |
|
<< < 2024 - 12 > >> | Su | Mo | Tu | We | Th | Fr | Sa | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|
|
|
About Me |
|
|
ZhangSichu |
|
Male |
|
32 |
|
ZhangSichu@gmail.com |
|
ZhangSichu@hotmail.com |
|
ZhangSichu.com |
|
weibo.com/zhangsichu |
|
|
|
个人推荐 |
|
|
|
|
分类归档 |
|
|
|
|
My Friends |
|
|
|
|
Asp.Net程序向Asp程序提交数据发生的问题
|
问题描述: 实际环境中有两套程序。一套是Asp的新闻信息系统,向外界发布信息。一套是Asp.Net写的信息采集系统,采集外界信息。新闻采集系统根据编辑的要求,采集指定站点的信息并存储在本地服务器上的数据库。信息采集程序也运行在这个服务器上。当采集程序采集完成。编辑登录本地服务器上的一个站点挑选合适的新闻,点击发送,这条新闻就发送到了公开站点上的Asp的新闻信息系统。在发送信息的这个过程中Asp.Net程序要向Asp程序提交数据。
问题分析: Asp.Net程序向Asp程序提交数据这个操作是跨站点数据提交。开始想使用SOAP WebService。用Asp写一个WSDL UDDI 想想就觉得比较恐怖。后来想想还是仿照REST 协议通过URL来提交数据吧。
问题实现: Asp.Net 通过HttpRequest 访问Asp程序的一个Url (例如:savefetchinfo.asp?pN1=pV1&pN2=pV2)来传数据。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(savefetchinfo.asp?pN1=row["Title"].ToString()&pN2=row["Content"].ToString()); request.ContentType = "application/x-www-form-urlencoded"; request.GetResponse();
|
这段代码发送的数据量一大Asp程序就会500错。提示数据过大。当数据小的时候。中文也会出现乱码。这种方法发送的方式不对,数据全部从Url走的,编码也没有设置好。
查了google和MSDN换成了WebClient()
WebClient client = new WebClient(); NameValueCollection values = new NameValueCollection(); values.Add("pN1",row["Title"].ToString()); values.Add("pN2", row["Content"].ToString()); client.UploadValues("http://xxx.xxx.xxx/savefetchinfo.asp", values);
|
改成这样后数据能够全部提交,Asp程序不会500错。但是提交的中文还是乱码。并且在第二次第三次提交的时候会出现一些十分诡异的错误:"A connection that was expected to be kept alive was closed by the server" 或者是 "An established connection was aborted by the software in your host machine" 这样错误让人很是不解。后来反射了WebClient,发现WebClient内部是使用 WebRequest 来发送请求的。发送数据使用了
Stream requestStream = request.GetRequestStream();
|
取得发送数据的流。用stream来添加发送的内容。
经过上面的几次实验终于找到了一个好的办法:
string data = string.Concat(“pN1=", HttpUtility.UrlEncode(row["Title"].ToString(), System.Text.Encoding.GetEncoding("gb2312")), "&pN2=", HttpUtility.UrlEncode(row["Content"].ToString(), System.Text.Encoding.GetEncoding("gb2312"))); byte[] buffer = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data); /*fix encoding bug*/ HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://xxx.xxx.xxx/savefetchinfo.asp"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = buffer.Length; request.KeepAlive = false; /*fix connection closed bug*/ request.ProtocolVersion = HttpVersion.Version10; Stream stream = request.GetRequestStream(); stream.Write(buffer, 0, buffer.Length); stream.Flush(); stream.Close(); request.GetResponse();
|
|
|
|
|
|
|