にnullである - 謝罪これはしかし、重複している場合、私はそれがないかなり確信している。..セッションは、私がここに同様の質問を介さかなりの時間を費やしてきたし、私の質問に答えているいずれかを発見していないRouteHandler
I訪問者がフォームを完成させることを目的とするウェブサイトを持っている。私は、より一貫していっぱいになるように異なるタイプのフォームをテストすることに興味があります。私の考えは、各フォームには独自のコントローラーがあり、ユーザーが最初にURLを要求すると、1つのフォームをランダムに選択してRouteDataに関連するコントローラーを設定するカスタムルートハンドラーが選択します。選択されたformidは、フォームの中で無作為に選択されるのではなく、Sessionのサブフォームリクエストに格納されます。
このprobemは、routehandlerのsessionデータにアクセスできないようですが、requestContext.Httpcontext.Sessionは常にnullです。これはパイプラインの時期が早すぎるためですか?もしそうなら、私はこのアプローチをどのように達成できますか?
私が試した最初のコードは次のように見えた:
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);
requestContext.HttpContext.Session
は、私は次のようにカスタムHTTPハンドラをオフに渡すカスタムroutehandlerで試してみましたヌル
であるように、これは常にエラーが発生した:
Routehandler
requestContext.HttpContext.SetSessionStateBehavior(GetSessionStateBehavior(requestContext));
IHttpHandlerハンドラ=新しいFormMvcHandler(requestContext); リターンハンドラ。この第二のアプローチでは
FormMVCHandler
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)
の両方をオーバーライドすることで動作します - BeginProcessRequestは、フレームワーク(V3)によって呼び出される非同期コントローラを使用していない場合でも、この記事への
カスタムルートハンドラを投稿することができますか、現在の場所ですか? – Tommy