2

この URL を適切に処理して 404 を返そうとしています: http://localhost:2867/dd./xml (スラッシュの前のドットに注意してください)

私の現在の実装では、Application_Error で 4 つの例外/エラーが発生します。Server.GetLastError() によって返される最初の例外は System.Web.HttpException で、次の 3 つは null です。

この問題を再現するために、最低限の実装を行いました。global.asax.cs のコードは次のとおりです。

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

  var routeData = new RouteData();
  routeData.Values.Add("controller", "Error");
  routeData.Values.Add("action", "Generic");
  routeData.Values.Add("area", "");

  IController errorController = new ErrorController();
  // this line throws System.Web.HttpException is a view is returned from ErrorController
  errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

エラー コントローラは次のようになります。

public class ErrorController : Controller
{
  public ActionResult Generic()
  {
    Response.TrySkipIisCustomErrors = true;
    Response.StatusCode = (int)HttpStatusCode.NotFound;

    return View();
    // returning content rather than a View doesn't fire 'System.Web.HttpException' in Application_Error
    //return Content("Some error!");
  }
}

2 つの問題があります。1 つは、Application_Error の 1 つのエラーではなく、指定された URL に対して 3 または 4 を取得することです。もう 1 つは、ErrorController からビューを返すときに、Application_Start の Execute 呼び出し行で例外がスローされることです。代わりに Content("something") が返された場合、この内部 (MVC と思われる) 例外はトリガーされません。

問題を確認するには、デバッグ モードにして開発サーバーを使用する必要があります。IIS または IIS Express を使用すると、何らかの理由でエラーがキャッチされません。また、時々これらのエラーはなくなります。最初に戻すには、ソリューションをきれいにする必要があります。

試してみたい場合は、最低限の解決策を次に示します: http://dl.dropbox.com/u/16605600/InvalidUrl.zip

ご協力ありがとうございました!

4

2 に答える 2

1

IIS7+ を使用している場合、これを web.config に入れると動作します:

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" />
    <error statusCode="404" responseMode="ExecuteURL" path="/Error/PageNotFound" />
  </httpErrors>
</system.webServer>

( ASP.NET MVC で 404 を適切に処理するにはどうすればよいですか?からの回答)

Application_Error で何が起こっているかを知っておくとよいでしょう。

于 2011-11-19T01:14:41.500 に答える
0

customeErrorsweb.configのセクションを変更することで 404 を処理できます。また、エラー ページのリダイレクトの性質を制御する (および 302 を回避する) ために使用できる属性
もあります (こちらをお読みください) 。redirectMode

<configuration>
  ...
  <system.web>
    <customErrors mode="RemoteOnly" 
                  redirectMode="ResponseRewrite" 
                  defaultRedirect="/ErrorPages/Oops.aspx">
      <error statusCode="404" redirect="/ErrorPages/404.aspx" />
    </customErrors>
...

http://www.asp.net/hosting/tutorials/displaying-a-custom-error-page-cs

ASP.net MVC には、 controller でスローされたすべての例外をキャッチするためにオーバーライドできるメソッドがあります。オーバーライドするだけController.OnException(...)で、そこでカスタムエラー処理を行うこともできます。すべてのコントローラーが共通の基本コントローラー クラスから継承する場合、エラー処理をそこに置くことができます。

http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.oneexception.aspx

于 2011-11-18T18:27:19.043 に答える