2011-08-07 7 views
1

私は次のようなものを持っていますIHttpModuleと私は特定の絶対または相対URLのコントローラからアクションを実行する方法を把握しようとしています。ASP.NET MVCのHttpModuleからコントローラアクションを実行するにはどうすればよいですか?

public class CustomErrorHandlingModule : IHttpModule 
{ 
    #region Implementation of IHttpModule 

    public void Init(HttpApplication context) 
    { 
     context.Error += (sender, e) => 
      OnError(new HttpContextWrapper(((HttpApplication)sender).Context)); 
    } 

    public void Dispose() 
    {} 

    public void OnError(HttpContextBase context) 
    { 
     // Determine error resource to display, based on HttpStatus code, etc. 
     // For brevity, i'll hardcode it for this SO question. 
     const string errorPage = @"/Error/NotFound"; 

     // Now somehow execute the correct controller for that route. 
     // Return the html response. 
    } 
} 

どのようにすることができますか?あなたがのHttpContextを使用することができます

+0

どのようなFxバージョンですか?これは通常の操作またはエラーのみですか? –

+1

_all_ルーティングに関する質問は本当にありましたか? –

+0

@Henk Holterman - > .NET 4.0(投稿を更新します)。エラーのみです。 'context.Error'でどのように起動しているのか見てみましょうか?もちろん、私はMVCと404の扱いに関して、すべての* *を読んでいませんでした。 –

答えて

7

何か仕事をする必要があります。

public void OnError(HttpContextBase context) 
{ 
    context.ClearError(); 
    context.Response.StatusCode = 404; 

    var rd = new RouteData(); 
    rd.Values["controller"] = "error"; 
    rd.Values["action"] = "notfound"; 
    IController controller = new ErrorController(); 
    var rc = new RequestContext(context, rd); 
    controller.Execute(rc); 
} 

また、次のrelated answer便利を見つけるかもしれません。

+0

確かに、以前よりもむしろエラーコントローラ内にエラーコードを設定したいのですか?たぶん私は何かが欠けているでしょう。 –

+0

@Simon Halsey - おそらく...しかし、どちらもうまく動作します。 –

+0

@Darin Dimitrov - awesome dude :)しかし、あなたのコントローラとアクションをハードコードしていることに気づくでしょうか?すでに決定されたURIでこれを行うことは可能ですか?例えば。 url =; foo/bah/pewpew/notfound'? –

0

System.Web.HttpContext.Current.Response.Redirect("/Error/NotFound"); 
+0

いいえ - >質問をもう一度お読みください。これは、302の一時的なリダイレクトを行い、URLを '/ Error/NotFound'に設定します。これは私の後ではありません。これは 'CustomErrors'を使うときのデフォルトのシナリオです。 –

+0

ああ、もう1つ。エラーページは200 STATUS OKで応答します。これは間違っています(ページの 'HttpStatus'を強制するための特別なコードがない限り)。 –

1

私はあなたがこれはあなたが使用したいファイルのパスを変更することができますHttpContext.Current.RewritePath

を使用する必要があると思います。これは、MVC 2プロジェクトで作成されたdefault.aspxの機能です。

私はあなたと同じように、302を使用せずにエラー処理を行いましたが、今すぐ自分のコードにアクセスできません。私は月曜日にいくつかのコードを投稿します。線に沿って

0

こんにちはは、フレームワークは、ルーティングおよびすべてのコンポーネントを使用して、そのパスのコードを実行させるためにこれを使用する:

// MVC 3 running on IIS 7+ 
    if (HttpRuntime.UsingIntegratedPipeline) 
    { 
     context.Server.TransferRequest(url, true); 
    } 
    else 
    { 
     // Pre MVC 3 
     context.RewritePath(url, false); 

     IHttpHandler httpHandler = new MvcHttpHandler(); 
     httpHandler.ProcessRequest(httpContext); 
    } 

、理想的には、要求処理はこの時点でコンプリータです。そうでない場合、リクエストがasp.net httpパイプラインに沿ってさらに処理されている場合は、これを使用してこの時点でリクエストを停止し、asp.netにこのリクエストを完了したことを伝えてください:

HttpApplication app = (HttpApplication) context.Application; 
app.CompleteRequest();; 

コンテキストにアプリケーションがあるかどうかはわかりませんが、必要に応じてこのモジュールでリクエストを停止するために使用します。

+0

このリンクもご覧ください:http://stackoverflow.com/questions/799511/how-to-simulate-server-transfer-in-asp-net-mvc – Zasz

関連する問題