在windows应用程序中运行asp.net程序的中文乱码问题

时间:2021-11-15 11:57:10

重载SimpleWorkerRequest

从MSDN上知道可以重载SimpleWorkerRequest来实现这现更多自己的行为。如何重载SimpleWorkerRequest?从Cassini的Request.cs源代码中,我们可以看到很多方法与实现方式,其中的 

在windows应用程序中运行asp.net程序的中文乱码问题SendResponseFromMemory( byte [] data,  int  length) 
在windows应用程序中运行asp.net程序的中文乱码问题SendResponseFromFile(String filename, 
long  offset,  long  length) 
在windows应用程序中运行asp.net程序的中文乱码问题SendResponseFromFile(IntPtr handle, 
long  offset,  long  length) 
在windows应用程序中运行asp.net程序的中文乱码问题SendResponseFromFileStream(FileStream f, 
long  offset,  long  length) 
在windows应用程序中运行asp.net程序的中文乱码问题FlushResponse(
bool  finalFlush)

 是我最感兴趣。分析Request.cs的源代码,我知道
SendResponseFromMemory(byte[] data, int length)
FlushResponse(bool finalFlush)
应是我需要重点考虑的

以下是MyRequest.cs的源代码

在windows应用程序中运行asp.net程序的中文乱码问题public   class  MyRequest:SimpleWorkerRequest 
在windows应用程序中运行asp.net程序的中文乱码问题在windows应用程序中运行asp.net程序的中文乱码问题

在windows应用程序中运行asp.net程序的中文乱码问题
private ArrayList _responseBodyBytes; 
在windows应用程序中运行asp.net程序的中文乱码问题
private System.IO.MemoryStream mem; 
在windows应用程序中运行asp.net程序的中文乱码问题
private System.IO.StreamWriter writer; 
在windows应用程序中运行asp.net程序的中文乱码问题
public MyRequest(string pWebPage, string pQuery,string pFile):base(pWebPage,pQuery,null
在windows应用程序中运行asp.net程序的中文乱码问题在windows应用程序中运行asp.net程序的中文乱码问题

在windows应用程序中运行asp.net程序的中文乱码问题
this.mem = new MemoryStream(); 
在windows应用程序中运行asp.net程序的中文乱码问题
// this.writer = new StreamWriter(pFile,false,Encoding.GetEncoding("gb2312")); 
在windows应用程序中运行asp.net程序的中文乱码问题
this.writer = new StreamWriter(pFile,false,Encoding.UTF8); 
在windows应用程序中运行asp.net程序的中文乱码问题
this._responseBodyBytes = new ArrayList(); 
在windows应用程序中运行asp.net程序的中文乱码问题
this.initFilePath(pWebPage); 
在windows应用程序中运行asp.net程序的中文乱码问题}

在windows应用程序中运行asp.net程序的中文乱码问题
在windows应用程序中运行asp.net程序的中文乱码问题
private void initFilePath(string path) 
在windows应用程序中运行asp.net程序的中文乱码问题在windows应用程序中运行asp.net程序的中文乱码问题

在windows应用程序中运行asp.net程序的中文乱码问题
this._path = path; 
在windows应用程序中运行asp.net程序的中文乱码问题
string strVir = GetAppPathTranslated(); 
在windows应用程序中运行asp.net程序的中文乱码问题
string str = strVir + path; 
在windows应用程序中运行asp.net程序的中文乱码问题str 
= str.Replace("/","\\"); 
在windows应用程序中运行asp.net程序的中文乱码问题
this._filePath = str; 
在windows应用程序中运行asp.net程序的中文乱码问题}

在windows应用程序中运行asp.net程序的中文乱码问题
在windows应用程序中运行asp.net程序的中文乱码问题
public override void SendResponseFromMemory(byte[] data, int length) 
在windows应用程序中运行asp.net程序的中文乱码问题在windows应用程序中运行asp.net程序的中文乱码问题

在windows应用程序中运行asp.net程序的中文乱码问题
if (length > 0
在windows应用程序中运行asp.net程序的中文乱码问题在windows应用程序中运行asp.net程序的中文乱码问题

在windows应用程序中运行asp.net程序的中文乱码问题
byte[] bytes = new byte[length]; 
在windows应用程序中运行asp.net程序的中文乱码问题Buffer.BlockCopy(data, 
0, bytes, 0, length); 
在windows应用程序中运行asp.net程序的中文乱码问题_responseBodyBytes.Add(bytes); 
在windows应用程序中运行asp.net程序的中文乱码问题}
 
在windows应用程序中运行asp.net程序的中文乱码问题}

在windows应用程序中运行asp.net程序的中文乱码问题
在windows应用程序中运行asp.net程序的中文乱码问题
public override void FlushResponse(bool finalFlush) 
在windows应用程序中运行asp.net程序的中文乱码问题在windows应用程序中运行asp.net程序的中文乱码问题

在windows应用程序中运行asp.net程序的中文乱码问题
for (int i = 0; i < _responseBodyBytes.Count; i++
在windows应用程序中运行asp.net程序的中文乱码问题在windows应用程序中运行asp.net程序的中文乱码问题

在windows应用程序中运行asp.net程序的中文乱码问题
byte[] bytes = (byte[])_responseBodyBytes[i]; 
在windows应用程序中运行asp.net程序的中文乱码问题
this.mem.Write(bytes,0,bytes.Length); 
在windows应用程序中运行asp.net程序的中文乱码问题}
 
在windows应用程序中运行asp.net程序的中文乱码问题_responseBodyBytes 
= new ArrayList();
在windows应用程序中运行asp.net程序的中文乱码问题
在windows应用程序中运行asp.net程序的中文乱码问题
if (finalFlush) 
在windows应用程序中运行asp.net程序的中文乱码问题在windows应用程序中运行asp.net程序的中文乱码问题

在windows应用程序中运行asp.net程序的中文乱码问题System.IO.StreamReader read 
= new StreamReader(this.mem); 
在windows应用程序中运行asp.net程序的中文乱码问题
this.mem.Position = 0
在windows应用程序中运行asp.net程序的中文乱码问题
string str = read.ReadToEnd(); 
在windows应用程序中运行asp.net程序的中文乱码问题
this.writer.Write(str); 
在windows应用程序中运行asp.net程序的中文乱码问题
this.writer.Close(); 
在windows应用程序中运行asp.net程序的中文乱码问题}
 
在windows应用程序中运行asp.net程序的中文乱码问题}

在windows应用程序中运行asp.net程序的中文乱码问题
在windows应用程序中运行asp.net程序的中文乱码问题


为什么使用MemoryStream来读取整个页面的字符串,再写到文件里呢?为什么为直接写到文件中呢?这是出于编码的考虑,直接写到文件中,文件内容的编码得不到保证,再使用IEWebbrowser打开的时候还是会出现乱码,尽管用记事本打开并没有看到乱码。如果使用IE打开,调整使用的编码你就能看到如windows程序一样的效果。

大家可能留意到代码保留了一个gb2312来构造StreamWriter的代码,使用gb2312的时候会有一个奇怪的现象,如果aspx页面编码指定是charset=gb2312的话,界面正常;如果是charset=utf-8时,IE自然会选择utf8,结果显示的页面乱码,只有选择为gb2312时才正常。使用utf8来构造StreamWriter就不存在这个问题。