asp.net Server.Transfer 直接输出HTML源代码的问题

今天在用.NET利用IHttpModel实现网站静态缓存的时候,不知道最后为什么用 Server.Transfer(html)的时候结果输出的是HTML的源代码。

贴上源代码

using System;
using System.Web;
using System.Text.RegularExpressions;
using System.IO;
using System.Configuration;
using System.Collections.Generic;
namespace Product
{
    public class ProductModule : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.BeginRequest += (new EventHandler(this.Application_BeginRequest));//请求开始
            application.EndRequest += (new EventHandler(this.Application_EndRequest));//请求结束
        }
        private void Application_BeginRequest(Object source, EventArgs e)
        {
            HttpApplication Application = (HttpApplication)source;
            CheckUrl(Application);
        }
        private void Application_EndRequest(Object source, EventArgs e)
        {
            //HttpApplication Application = (HttpApplication)source;
            //Application.Response.Write("test");
        }
        private void CheckUrl(HttpApplication application)
        {
            if (application.Request.RequestType.ToUpper() == "POST" || application.Request.UserAgent.ToLower() == "product")
            {
                return;
            }

            string[] resUrlTemp = new string[5];//待缓存的请求模板
            resUrlTemp[0] = "/model/modelsearch.aspx\\?clid=([\\d]+)&coid=([\\d]+)&bid=([\\d]+)&price=(.*)&model=(.*)&p=([\\d]+)&t=([0-2]{1,1})";
            resUrlTemp[1] = "/pic/imgsearch.aspx\\?clid=([\\d]+)&cbid=([\\d]+)&model=(.*)&p=([\\d]+)";
            resUrlTemp[2] = "/praise/PraiseSearch.aspx\\?clid=([\\d]+)&coid=([\\d]+)&model=(.*)&p=([\\d]+)";
            resUrlTemp[3] = "/price/sellerpricesearch.aspx\\?clid=([\\d]+)&coid=([\\d]+)&brand=([\\d]+)&price=(.*)&model=(.*)&p=([\\d]+)&t=([0-2]{1,1})";
            resUrlTemp[4] = "/dealer/sellersearch.aspx\\?pve=([\\d]+)&city=([\\d]+)&type=([\\d]+)&seller=(.*)&bid=([\\d]+)&model=(.*)&pagesize=([\\d]+)&p=([\\d]+)";

            string reqUrl = application.Context.Request.Url.PathAndQuery.ToLower();//请求动态路径

            bool success = false;
            for (int i = 0; i < resUrlTemp.Length;i++ )
            {
                if (!success)
                {
                    Regex reg = new Regex(resUrlTemp[i]);//匹配当前请求是否需要缓存
                    MatchCollection mc = reg.Matches(reqUrl);
                    if (mc.Count > 0)
                    {
                        //静态页命名使用当前请求路径MD5加密命名
                        string PyReUrl = ConfigurationManager.ConnectionStrings["WebPhysicsUrl"].ConnectionString + "/Cache/" + i + "/" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(reqUrl, "MD5") + ".html";

                        FileInfo fi = new FileInfo(PyReUrl);//判断是否缓存
                        if (!fi.Exists)
                        {
                            //缓存页面
                            string WebUrl = ConfigurationManager.ConnectionStrings["WebUrl"].ConnectionString;
                            System.Net.HttpWebRequest Request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(WebUrl + reqUrl);//Post请求当前页
                            Request.Method = "GET";
                            Request.Accept = "*/*";
                            Request.UserAgent = "Product";
                            Request.AllowAutoRedirect = true;
                            Request.MaximumAutomaticRedirections = 2;

                            System.Net.HttpWebResponse Response = null;
                            try
                            {
                                Response = (System.Net.HttpWebResponse)Request.GetResponse();//获得响应
                            }
                            catch(Exception ex)
                            {
                                application.Response.Write("Response Error"+ex.Message);
                            }
                            if (Response != null)
                            {
                                System.IO.Stream strm = Response.GetResponseStream();
                                System.IO.StreamReader sr = new System.IO.StreamReader(strm, System.Text.Encoding.GetEncoding("gb2312"));

                                StreamWriter Sw = null;
                                try
                                {
                                    if (!Directory.Exists(Directory.GetParent(PyReUrl).FullName))
                                        Directory.CreateDirectory(Directory.GetParent(PyReUrl).FullName);

                                    FileStream Fs = new FileStream(PyReUrl, FileMode.Create, FileAccess.Write, FileShare.Read);
                                    Sw = new StreamWriter(Fs, System.Text.Encoding.Default, 512);

                                    Sw.Write(sr.ReadToEnd());//写入

                                    success = true;
                                }
                                catch(Exception ex)
                                {
                                    Sw.Close();
                                    application.Response.Write("Writer Error"+ex.Message);
                                }

                                sr.Close();
                                Sw.Close();
                                Response.Close();
                            }
                        }
                        else
                        {
                            //application.Response.Redirect(PyReUrl);//链接到静态页面 浏览器请求路径不变,不会影响收录
                            application.Server.Transfer("/Cache/" + i + "/" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(reqUrl, "MD5") + ".html");
                        }
                    }
                }
            }

        }
        public void Dispose()
        {
        }
    }
}

原帖地址:http://blog.csdn.net/mr_tanglin/article/details/6753771

我的问题是这样的,我的网站采用的UTF8编码

当这两个流采用gb2312的时候,Service.Transfer是可以正常显示HTMl的,但是页面乱码

  System.IO.Stream strm = Response.GetResponseStream();
  System.IO.StreamReader sr = new System.IO.StreamReader(strm, System.Text.Encoding.GetEncoding("gb2312"));  
 FileStream Fs = new FileStream(PyReUrl, FileMode.Create, FileAccess.Write, FileShare.Read);
 Sw = new StreamWriter(Fs, System.Text.Encoding.Default, 512);  

但是当我采用UTF编码的时候,页面缓存没问题,但是Service.Transfer就只是显示源代码,不知道为什么。求解。

此贴用于记录,如果找到解决方案后,我会贴出来!

时间: 2024-10-07 18:40:29

asp.net Server.Transfer 直接输出HTML源代码的问题的相关文章

ASP.NET跨页面传值——Server.Transfer

ASP.NET跨页面传值 这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效. Server.Transfer是从当前的ASPX页面转到新的ASPX页面,服务器端执行新页并输出,在新页面中通过Context.Handler来获得前一个页面传递的各种数据类型的值.表单数据.QueryString.由于重定向完全在服务器端完成,所以客户 端浏览器中的URL地址是不会

ASP.NET页面之间传递值(4):Server.Transfer

这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效. Server.Transfer是从当前的ASPX页面转到新的ASPX页面,服务器端执行新页并输出,在新页面中通过 Context.Handler来获得前一个页面传递的各种数据类型的值.表单数据.QueryString.由于重定向完全在服务器端完成,所以客户端 浏览器中的URL地址是不会改变的.调用Server

在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能

在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发“为xxx执行子请求时出错”的HttpException异常.而在最终实现Server.Transfer()操作的方法内部,我看到这样几行代码. else if (!(handler is Page)) { error = new HttpException(0x194, string.Empty); } 很明显,在方法内部,所有的IHttpHandle

ASP.NET中使用Server.Transfer()方法在页间传值 实例

以下代码在VS2008中测试通过 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="WebForm1.aspx.cs" Inherits="WebForm1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3

ASP.NET的Response.Redirect() 和Server.Transfer()的区别(转)

Sever.Transfer方法把执行流程从当前的ASPX页面转到同一服务器上的另一ASPX页面.但新的ASPX页面仍使用前一ASPX页面创建的应答流.如果用Server.Transfer方法实现页面之间的导航,则浏览器中的URL不会改变,因为重新定向完全是在服务器端进行的,浏览器根本不知道服务器已经执行了一次页面变换. Response.Redirect则是客户端第一次请求服务器,并返回状态代码302及新的URL,客户端再次请求新的URL,服务器才返回新页面,多了一次应答.

Server.Transfer和Response.Redirect区别

根本上,Response是叫浏览器去重新转向到指定的网页,而Server自然是发生在服务器端为主了,因此会有以下区别: 1. Server.Transfer只能够转跳到本地虚拟目录指定的页面,而Response.Redirect则十分灵活:2. Server.Transfer可以将页面参数方便传递到指定页面:3. 使用时,Server.Transfer跳到别的页面后,浏览器显示的地址不会改变,有时反而会造成误会,当然也有些场合需要这样的效果:4. Server.Transfer可以减少客户端对服

Response.Redirect()、Server.Execute和Server.Transfer的区别

1.Response.Redirect(): Response.Redirect方法导致浏览器链接到一个指定的URL. 当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代  码302(表示目标已经改变)以及新的目标URL.浏览器从服务器收到该应答,利用应答头中的信息发出一个对新URL的请求. 这就是说, 使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面 的请求,得到一个302

页面跳转 Server.Transfer和 Response.Redirect的区别

1.Server.Transfer 用于把处理的控制权从一个页面转移到另一个页面,在转移的工程中没有离开服务器内部控件(如request,session等)保存的信息不变.因此你能从a页面跳转到b页面而不丢失a页面里的信息. 2.Response.Redirect 发送一个HTTP响应到客服端浏览器,告诉客服端跳转到哪一个页面,客服端在发送跳转请求到服务器.使用此方法将无法保存内部控件的数据,页面a跳转到页面b,而页面b将无法访问a中form提交的数据. 而在具体比较如下 Server.Tran

Server.Transfer 和 Response.Redirect 用法区别

在ASP.NET中,在后台传值方式目前大多都是用 Response.Redirect("页面地址") 来重定向页面的,但是现在还有一种方式也可以达到重定向页面的作用,而且在某些时刻会起到一种很棒的效果,那就是使用 Server.Transfer("页面地址") 来重定向地址. 现在我们来详细了解一下这两种重定向页面地址的用法和区别: Response.Redirect :Response.Redirect 会将地址输出至浏览器,执行重定向操作.但是请注意,在程序执行