Asp.net mvc RouteHandler中的会话为空

Asp.net mvc RouteHandler中的会话为空,asp.net-mvc,Asp.net Mvc,我在这里花了相当长的时间研究了类似的问题,但没有找到任何回答我问题的答案-如果这是重复的,我很抱歉,但是我很确定它不是 我有一个网站,其目的是让访问者填写表格。我对测试不同类型的表格感兴趣,以确定哪些表格填写得更一致。我的想法是,每个表单都有自己的控制器,当用户第一次请求url时,自定义路由处理程序会随机选择一个表单,并在RoutedData中设置相关控制器。所选的formid然后存储在会话中,因此在子请求时,它将只使用会话中的表单,而不是随机选取的表单 问题是我似乎无法访问routehandl

我在这里花了相当长的时间研究了类似的问题,但没有找到任何回答我问题的答案-如果这是重复的,我很抱歉,但是我很确定它不是

我有一个网站,其目的是让访问者填写表格。我对测试不同类型的表格感兴趣,以确定哪些表格填写得更一致。我的想法是,每个表单都有自己的控制器,当用户第一次请求url时,自定义路由处理程序会随机选择一个表单,并在RoutedData中设置相关控制器。所选的formid然后存储在会话中,因此在子请求时,它将只使用会话中的表单,而不是随机选取的表单

问题是我似乎无法访问routehandler中的会话数据-requestContext.Httpcontext.Session始终为空。这是不是因为现在还为时过早?如果是的话,我如何实现这种方法

我尝试的第一个代码如下所示:

int FormID = 0;
string FormName = "";
RepositoryManager mgr = new RepositoryManager();

if (requestContext.HttpContext.Session["Form_ID"] != null && requestContext.HttpContext.Session["Form_Name"] != null)
{
    int.TryParse(requestContext.HttpContext.Session["Form_ID"].ToString(), out FormID);
    FormName = requestContext.HttpContext.Session["Form_Name"].ToString();
}

if (FormID == 0)
{
    List<Form> forms = mgr.FormRepository.Get(f => f.FormType.Code == "").ToList();
    int rnd = new Random().Next(0, forms.Count - 1);
    FormID = forms[rnd].ID;
    FormName = forms[rnd].FormName;
    requestContext.HttpContext.Session["Form_ID"] = FormID;
    requestContext.HttpContext.Session["Form_Name"].ToString();
}

requestContext.RouteData.Values["controller"] = FormName;
return new MvcHandler(requestContext);
IHttpHandler handler=newformmvchandler(requestContext); 返回处理程序

FormMVCHandler

requestContext.HttpContext.SetSessionStateBehavior(GetSessionStateBehavior(requestContext));
    public class FormMvcHandler : MvcHandler, IRequiresSessionState
{
    public FormMvcHandler(RequestContext requestContext)
        : base(requestContext)
    {

    }

    protected override void ProcessRequest(HttpContext httpContext)
    {
        //for testing setting form manually - session will be used here as in original routehandler
        RequestContext.RouteData.Values["controller"] = "1Stage";
        base.ProcessRequest(httpContext);
    }
}
在第二种方法中,更改控制器名称没有效果。我已经尝试在HTTPHandler的构造函数中更改控制器名称,这确实有效果,但是如果我尝试使用RequestContext.HttpContext.session从那里访问会话,它仍然为null。我曾尝试在ProcessRequest中设置断点,但从未命中

编辑2

现在可以通过覆盖HttpHandler中的
ProcessRequest(HttpContext HttpContext)
BeginProcessRequest(HttpContext HttpContext)
来实现这一点,即使不使用异步控制器,框架(v3)也会调用BeginProcessRequest

查看本文:


我认为您需要使用iRequiresessionState接口

在router hander中使用会话还为时过早

您可以通过使用动作过滤器实现您想要的

创建一个名为FormController的控制器,一个名为FormPickerAttribute的操作。在ActionExecuting属性中,您可以检查cookie或session,其中设置了表单id。假设表单id为“Form1”(如果为null,则创建一个),然后将操作方法更改为“Form1”

您还可以为每个表单创建一个控制器,只需更新

{"controller", "FormIdController"}

在RouteHandler中有一个函数GetHttpHandler,它返回一个IHttpHandler。该自定义HttpHandler必须使用IRequireResessionState,然后您可以在HttpHandler中的ProcessRequest函数中访问会话。

我已经尝试过这一点,但它与我所理解的IRequireResessionState设计用于HttpHandler没有区别,不是RouteHandler在RouteHandler中,您有一个函数GetHttpHandler,它返回一个IHttpHandler。该自定义HttpHandler必须使用IRequiresessionState,然后您可以在HttpHandler中的ProcessRequest函数中访问会话。@Wim-我尝试了这个方法,现在它开始工作了,我必须重写ProcessRequest和BeginProcessRequest(即使我的控制器不是异步的),但您的方法成功了。如果你作为答案发布,我会接受。你可以发布你的自定义路由处理程序/你现在在哪里吗?我尝试过这样的方法,但是我不想更改URL
{"controller", "FormIdController"}