当前位置:编程学习 > C#/ASP.NET >>

.net 里Response.Redirect无效

我想用IHttpModule拦截用户访问,所以写了一个类public class MyModule : IHttpModule.如果用户session为空就跳转,里面有一个方法如下。但是没有效果,请问什么原因,调试了发现有一个异常。"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值",按照别人的解决方案还是不行。例如HttpContext.Current.Response.Redirect("/login.html",true); 换成HttpContext.Current.Response.Redirect("/login.html",false);和去掉try catch等,但问题依旧,请问如何处理,我用的wcf+linq+ext。 
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using ConairOAS.Common;
using System.Web.UI.Design;
namespace ConairOAS.Common
{
    public class ConairModule : IHttpModule
    {
        public static int loginflag = 0;       
        public void Init(HttpApplication application)
        {

            application.AcquireRequestState += (new
            EventHandler(this.Application_AcquireRequestState));
        }
        private void Application_AcquireRequestState(Object source,
                EventArgs e)
{            
   HttpApplication Application = (HttpApplication)source;
            HttpContext context = HttpContext.Current;
            HttpResponse Response = context.Response;
            Response.Redirect("http://www.baidu.com");//放在这里会有效果            Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);          
            string path = context.Request.Url.AbsolutePath.ToLower();             
            if (path.Contains("index.aspx") && loginflag == 0)
            {
                Response.Redirect("/login.html");
            }
             if (path.Contains(".svc/"))
            {
                if (path.Contains("login.svc/validateuser"))
                {                    
                    loginflag++;
                }
                else if (path.Contains("logout.svc/clearusersession"))
                {
                    loginflag = 0;                    
                }
                else
                {
                    loginflag++;
                    Response.Redirect("http://www.baidu.com");//放在这里没有效果                    string objectSid = checkSession(context);//session验证                 
                    
                }
            }                        
   }        
         public string checkSession(HttpContext context)
        {
            string objectSid ;
            try
            {                
                objectSid = context.Session["objectSid"].ToString();
                return objectSid;
            }
            catch(Exception ex)
            {
              Response.Redirect("http://www.baidu.com");//放在这里也没有效果                            
                throw ex;
            }           
            
        }
        }
}
 
--------------------编程问答-------------------- 设个断点,调试一下

试一试Server.Transfer呢

Response.Redirect("http://www.baidu.com",true); --------------------编程问答-------------------- 不行啊。这个早就试了一下的。 --------------------编程问答-------------------- catch访问不到吧,session为空不会异常吧 --------------------编程问答-------------------- try:



public class ConairModule : IHttpModule

 -->

public class ConairModule : Page,IHttpModule
--------------------编程问答-------------------- to ershou007  
能catch到。就是没有办法Response.Redirect("http://www.baidu.com",true);后面的代码也没有执行,但是也没有跳转。哭啊,在线等。 --------------------编程问答-------------------- 必定是你的判定逻辑有问题

另外你那个checkSession也是不妥的。 --------------------编程问答--------------------
引用 4 楼 zpcoder 的回复:
try: 


public class ConairModule : IHttpModule 

--> 

public class ConairModule : Page,IHttpModule 

to zpcoder ,你说的这个方法我也试过了。
 public class MyModule :System.Web.UI.Page, IHttpModule
但也没有作用 --------------------编程问答-------------------- + [System.Threading.ThreadAbortException] {由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。} System.Threading.ThreadAbortException
这个错误。 --------------------编程问答-------------------- 把Response.Redirect();语句从TRY中拿出 --------------------编程问答-------------------- try 

Response.Redirect("",false); 

catch (System.Threading.ThreadAbortException e) 

throw; 

--------------------编程问答--------------------
引用 10 楼 wuyq11 的回复:
try 

Response.Redirect("",false); 

catch (System.Threading.ThreadAbortException e) 

throw; 

谢谢,这个方法我也使用过,问题还是没有解决,当我重定向到百度的时候,
在IE7里弹出一个对话框:该页正在访问其控制范围之外的信息,这可能导致安全风险,是否继续,
当点击是后,程序还是在本页面。
我要疯了!! --------------------编程问答--------------------
 哦,晕了

 Response.Redirect();   好像不能跳到域外面去。

 只能在你的站内跳。例如从 /a.aspx 跳到 b.aspx --------------------编程问答-------------------- 依旧在线等。 --------------------编程问答--------------------
引用 12 楼 zpcoder 的回复:
哦,晕了 

Response.Redirect();  好像不能跳到域外面去。 

只能在你的站内跳。例如从 /a.aspx 跳到 b.aspx

Response.Redirect();  可以跳转的,Server.Transfer则不行。 --------------------编程问答-------------------- 学习。新知识。 --------------------编程问答--------------------
引用楼主 friskz 的帖子:
我想用IHttpModule拦截用户访问,所以写了一个类public class MyModule : IHttpModule.如果用户session为空就跳转,里面有一个方法如下。但是没有效果,请问什么原因,调试了发现有一个异常。"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值",按照别人的解决方案还是不行。例如HttpContext.Current.Response.Redirect("/login.html",true); 换成HttpContext.Current.Response.Redirect("/login.html",false…

发现当处理了部分source的结果后,就无法跳转,如果没有处理,就可以直接跳转。 --------------------编程问答-------------------- up --------------------编程问答-------------------- up --------------------编程问答--------------------
引用 18 楼 g1y9d861213 的回复:
up

谢谢了。 --------------------编程问答-------------------- 没有继承自IRequiredSessionState接口的类无法读写Session。 --------------------编程问答-------------------- UP --------------------编程问答-------------------- 学习 --------------------编程问答--------------------
引用 20 楼 cat_hsfz 的回复:
没有继承自IRequiredSessionState接口的类无法读写Session。

我这里可以读session啊,只是跳转不成功而已。请问如何跳转呢?有没有什么好的见解? --------------------编程问答-------------------- 1.逻辑有问题,试验数据是什么?
2.判断session为空不要写在catch中捕获异常,直接if(session["id"]<>NULL) or(session["id"].ToString!="")来进行分支判断. --------------------编程问答-------------------- urlrewrite --------------------编程问答-------------------- 学习,帮顶! --------------------编程问答-------------------- 不懂..学习一下 --------------------编程问答-------------------- 不懂..学习一下 --------------------编程问答-------------------- 关注一下 --------------------编程问答-------------------- ding
--------------------编程问答-------------------- 是不是没进到哪个语句? --------------------编程问答-------------------- up
--------------------编程问答-------------------- 是你程序的问题 --------------------编程问答-------------------- Response.Redirect   

  Response.Redirect方法导致浏览器链接到一个指定的URL。当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代码302(表示目标已经改变)以及新的目标URL。浏览器从服务器收到该应答,利用应答头中的信息发出一个对新URL的请求。   

  这就是说,使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面的请求,得到一个302应答,第二次是请求302应答中声明的新页面,得到重定向之后的页面。   
产生新的CONTEXT
Redirect是客户端的方法,好处是浏览器知道是传的,历史记录也会被更新,缺点是会影响性能,因为它还要与服务器回发 --------------------编程问答-------------------- 应该是执行条件不明确.服务器不能正确执行.不如设个断点试试.单步执行 --------------------编程问答-------------------- to only_endure  逻辑没有问题。
我先HttpContext.Current.Session.RemoveAll()了里面的数据。然后再读session,读不到就catch,跳转。 --------------------编程问答-------------------- httpcontent.current.response.redirect();
改成这个~~ --------------------编程问答-------------------- 找你们的测试人员帮你试试...肯定有些流程没走.. --------------------编程问答-------------------- 后面加一个
Response.End()
试一下 --------------------编程问答--------------------
引用 35 楼 Riverwcj 的回复:
应该是执行条件不明确.服务器不能正确执行.不如设个断点试试.单步执行

这样坐过了。 --------------------编程问答-------------------- ding --------------------编程问答-------------------- 我也遇到类似的问题! --------------------编程问答-------------------- 用ajax了吧 --------------------编程问答-------------------- 我也遇到过类似问题..
结果发现原来是我的web.config配置有问题..

可能是因为你在web.config那里禁止了匿名用户打开你登录之后的页面;
如果你重新写了一个成员资格提供程序类,也有可能是你没有指定你自己写的成员资格程序提供类作为你默认的成员资格提供类。 --------------------编程问答-------------------- Response.Redirect("http://www.baidu.com");  这样可以跳转啊!

  --------------------编程问答--------------------  刚才看了你的问题,如果真的没法解决,可以增加一个跳板! 先让它跳转到站内,然后在page_load里面进行外跳! --------------------编程问答-------------------- System.Threading.ThreadAbortException 这个错误是每次Response.Redirect 或server.transfer都会有的。这个exception应该过滤掉。就是不要throw出来,要不然你的catch段执行就影响了你的页面跳转。 --------------------编程问答-------------------- 我也遇到这样的问题哦,哎,郁闷,顶顶顶!!!
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,