1

後でURLを整理するために応答をリダイレクトするときに取得されるように、URLをセッションに保存しようとしています。これはGlobal.asaxファイルにあります。元の応答を受け取り、セッションにURLを保存しています

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        HttpException httpException = exception as HttpException;

        // get the url
        var url = Request.RawUrl;

        // store in session
        Session["requestUrl"] = url;

        if (exception is HttpException && ((HttpException)exception).GetHttpCode() == 404) {
            Response.Redirect("/CMS/CMS");
        }

    }

セッションの内容を見るとそこにあります

次に、CMS / CMSアクションでこれを抽出しようとしましたが、変数urlがnullですか??:

    public ActionResult CMS(String aspxerrorpath)
    {
        var url = Session["requestUrl"]; // this is null??

        Response.StatusCode = 404;
        Response.TrySkipIisCustomErrors = true;
        return View();
    }

何か案は?

4

2 に答える 2

2

ダリンのアプローチはより理にかなっていますが、他の誰かが同じ問題を抱えていて、Sessionオブジェクトに値を設定する必要がある場合に備えて...

何が起こっているのかわかりませんが、これが私が見つけたものです。すでにSession変数が設定されている場合は、使用しているコードは正常に機能します。したがって、たとえば、次のようなものがある場合:

protected void Session_Start(object sender, EventArgs e) {
 Session["asdasd"] = true;
}

そして、ページにアクセスし、別のリクエストでエラーをトリガーすると、正常に機能Session[requestUrl]します。

これにより、ページにエラーがある場合、おそらくセッションCookieがASP.NETによって送信されていないのではないかと思いました。案の定、関数でを呼び出すと、まだセッションがない場合でも、問題なく機能Server.ClearError();します。ああ、最初にサーバーエラーをクリアしない限り、Cookieが送信されていないように見えると思いました。しかし、それから私はFiddlerを壊しました、そして見よ、どちらの場合もクッキー送られています。したがって、呼び出しがSession変数を保存する効果がある理由がわかりません。:)しかし、どんな理由であれ、それは機能します。Application_ErrorSession[requestUrl]Server.ClearError();

于 2013-01-04T16:42:55.437 に答える
1

申し訳ありませんが、セッションが機能しない理由はわかりませんが、URLを整理してからパスを書き直したい場合は、リダイレクトしないでください。

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;

    if (exception is HttpException && ((HttpException)exception).GetHttpCode() == 404) 
    {
        Server.ClearError();

        // get the url
        var url = Request.RawUrl;

        var routeData = new RouteData();
        routeData.Values["controller"] = "Cms";
        routeData.Values["action"] = "Cms";
        routeData.Values["aspxerrorpath"] = url;

        IController cmsController = new CmsController();
        var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
        cmsController.Execute(rc);
    }
}

このように、追加のリダイレクトを実行する必要はなく、Sessionに依存する必要もありません。

また、私がコードを借りた場所から次の投稿をチェックアウトすることもできます。

于 2013-01-04T16:07:18.483 に答える