1

ファイル (マルチパート フォーム データ) をアップロードするために、ASP.NET でホストされた WebAPI エンドポイントに取り組んでいます。予想されるファイルは小さいので、デフォルトの最大要求サイズ (4MB) のままにします。リクエスト サイズに違反すると、デフォルトで、フレームワークは HTML 中心のレスポンスを返します。より API クライアントに適したものを返したいと思います。

IIS と ASP.NET パイプラインの動作方法により、要求サイズ違反は、MessageHandlers などの WebAPI パイプラインでは処理されないようです。したがって、Global.asax.cs でエラーをキャッチし、API クライアント フレンドリな応答を作成するコントローラーにリダイレクトすることにしました。

protected void Application_Error()
{
    if (exception.Message.ToUpper().Contains("MAXIMUM REQUEST LENGTH"))
    {
        Server.ClearError();
        Response.Redirect("~/errors/500?message=" + exception.Message);
    }
}

public class ErrorsController : ApiController
{
   public HttpResponseMessage Get(int id, string message)
   {
      return Request.CreateResponse((HttpStatusCode)id, message);
   }
}

これを行うより良い方法はありますか?302 リダイレクトを発行せずに、このようなことを処理できるようにしたいと考えています。

4

1 に答える 1

0

Application_Error を使用して API コントローラーを呼び出す方法を探しましたが、解決策が見つかりません。

私が得た最も近いものは以下です。

ただし、このコードにより、System.Web.Http.DLL で「System.NullReferenceException」が発生します。

これは、HttpRequestMessage が不完全であるためだと思います...そのヘッダーとプロパティは null ですが、機能させるためにそこに何を入れる必要があるかわかりません:

protected void Application_Error(object sender, EventArgs e){

        // Other code omitted for brevity

        Exception exception = Server.GetLastError();

        // Set the RouteData to point to the desired controller and action to invoke
        IHttpRouteData routeData = new HttpRouteData(new HttpRoute());
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "Get");
        routeData.Values.Add("id", "500");
        routeData.Values.Add("message", exception.Message);

        // Avoid IIS7 returning its own stock error pages
        Response.TrySkipIisCustomErrors = true;

        // Call target Controller and pass the routeData.
        System.Web.Http.Controllers.IHttpController errorController = new ErrorController();
        var request = new HttpRequestMessage
        {
            Method = HttpMethod.Get,
            RequestUri = new Uri(Request.Url.AbsoluteUri),
        };

        errorController.ExecuteAsync(
            new HttpControllerContext(GlobalConfiguration.Configuration, routeData, request),
            CancellationToken.None
        );

TrySkipIisCustomErrors リファレンス: http://www.west-wind.com/weblog/posts/2009/Apr/29/IIS-7-Error-Pages-taking-over-500-Errors

于 2013-02-21T14:18:26.300 に答える