none
ASHX中保存的Session不能传到ASPX RRS feed

  • 问题

  • IIS7中,ASHX中保存的Session不能传到ASPX,但是用VS2010自带的调试服务器就可以的,这是为什么?IIS7的什么地方设置有问题
    • 已移动 chenrensong 2012年5月9日 0:51 有关iis的问题! (发件人:ASP.NET 与 AJAX)
    2012年5月7日 17:04

答案

  • 在经典托管管道模式下,IIS行为和以前的IIS6版本是一致的。

    我试了一下你的代码,去掉了业务逻辑部份,在两种模式下都是没有问题的,虽然我用的是IIS7.5,IIS7应该也是可以的

    部署到IIS7后,请求ashx文件和aspx文件的URL各是什么?确保他们使用了同一个应用程序池,而且域名也是相同的。

    2012年5月10日 2:27

全部回复

  • 可以给看看具体代码吗?要继承IHttpHandler, IRequiresSessionState 这两个接口!

     public class Service : IHttpHandler, IRequiresSessionState
        {
    
            HttpRequest Request;
            HttpResponse Response;
            HttpSessionState Session;
            HttpServerUtility Server;
            HttpCookie Cookie;
    
            public void ProcessRequest(HttpContext context)
            {
                context.Response.Buffer = true;
                context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
                context.Response.AddHeader("pragma", "no-cache");
                context.Response.AddHeader("cache-control", "");
                context.Response.CacheControl = "no-cache";
                context.Response.ContentType = "text/plain";
    
                Request = context.Request;
                Response = context.Response;
                Session = context.Session;
                //Server = context.Server;
    
                //string method = Request["Method"].ToString();
                //MethodInfo methodInfo = this.GetType().GetMethod(method);
                //methodInfo.Invoke(this, null);
    
                GetTree();
            }
    

    2012年5月8日 3:27
  • 这两个接口我都已经继承了啊 问题是用IIS7就不行,VS自带的调试器就可以,是不是IIS7的设置有什么问题 ?
    2012年5月8日 3:33
  • Web.config的

    <sessionState mode="Off" ></sessionState>

    mode不能为Off


    2012年5月8日 3:44
  • mode="InProc" 和  mode="StateServer" 我都试过了,还是在IIS7中不行,但是 VS development server 就可以 奇了怪了
    2012年5月8日 5:48
  • 换别的机子试试..
    2012年5月8日 6:49
  • 只要是IIS 那就不行 
    2012年5月8日 7:24
  • 我这边试过发现没有丢失....
    解决方案参考:
    1.修改webconfig中timeout的时效时间
    2.建议让网站使用独立的应用程序池
    3.iis设置Session超时时间(默认为20分钟)
    4.在应用程序池上打开网站对应的应用程序池属性,将web数量改为1 重启iis

    我在网上看到一种很怪的方法,就是在类里面加上Serializable 你试试

    2012年5月8日 8:21
  • 还是行不通,我把代码发上来,大家指点指点:

    ashx:

        [Serializable]
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        public class WebOffice_Handler : IHttpHandler, IRequiresSessionState
        {
            private string sid = "";
            private int tid = 0;
            
            public void ProcessRequest(HttpContext context)
            {
                MpLeagalStaffAuthorization(context);
    
                //调试标记
                //System.Diagnostics.Debug.Assert(false); 
    
                context.Response.ContentType = "text/plain";
                context.Response.Buffer = true;
                context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
                context.Response.AddHeader("pragma", "no-cache");
                context.Response.AddHeader("cache-control", "");
                context.Response.CacheControl = "no-cache";
    
                string m = context.Request.Params["m"] != null ? context.Request.Params["m"].ToString().Trim() : "";
                string t = context.Request.Params["tid"] != null ? context.Request.Params["tid"].ToString().Trim() : "";
                string d = context.Request.Params["sid"] != null ? context.Request.Params["sid"].ToString().Trim() : "" ;
    
                if (m.Length==0 || d.Length==0) return;
    
                sid = HttpUrlEncode.Decrypt(d);
                tid = Convert.ToInt32(t);
    
                string p = "";
                if (m.ToLower().Equals("gen"))
                {
                    //需要根据模版生成路径放到Session中,转发给Result.aspx
                    p=GenDocPath(sid, tid, 0);
                }
                else if (m.ToLower().Equals("edit"))
                {
                    //需要在线编辑现有的文档,把获取的路径放到Session中直接转发给WebOffice.aspx
                    p=GetDocPath(sid,0);
                }
        
                if(p==null || p.Length==0)
                {
                    return;
                }
    
                //保存获取到的生成路径到SESSION以供其有他页面提取用
                //context.Session.Add("MP_DOC_PATH", p);
                context.Session["MP_DOC_PATH"] = p;
                context.Session.Timeout = 10000;          
                
                //写回response
                context.Response.Clear();
                context.Response.ContentType = "text/plain";
                context.Response.Write(p);        
            }
    
            public bool IsReusable
            {
                get
                {
                    return true;
                }
            }

    2012年5月8日 15:14
  • 标准的ashx 可以不要有下面2个语句的。。还有你可以试试 直接去掉所有语句直接写一个  context.Session["MP"] = “123”;

    然后在aspx 里面看看是否获取的到..

      [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    如果还是不可以,估计就是你的iis问题了...

    我已经把你的主题由asp.net区移动到iis专区,谢谢你的理解!

    2012年5月9日 0:50
  • 如果集成模式不可以的话,把应用程序池改成经典模式
    2012年5月9日 2:27
  • 如果集成模式不可以的话,把应用程序池改成经典模式
    仁兄,此言何意,不甚了解?
    2012年5月9日 4:15
  • 因为用VS 自带的调试服务器工具就可以取到的,但是部署到IIS7上就不行了
    2012年5月9日 4:16
  • 在经典托管管道模式下,IIS行为和以前的IIS6版本是一致的。

    我试了一下你的代码,去掉了业务逻辑部份,在两种模式下都是没有问题的,虽然我用的是IIS7.5,IIS7应该也是可以的

    部署到IIS7后,请求ashx文件和aspx文件的URL各是什么?确保他们使用了同一个应用程序池,而且域名也是相同的。

    2012年5月10日 2:27