2017-01-05 2 views
2

カスタムコンテンツを返すためのApiControllerの拡張メソッドを作成したいと思います。
私の考えは、自分の詳細でカスタムエラーを返すことです。 は私がOAuthAuthorizationServerProviderによって返されるエラーに似たカスタムエラーを返すようにしたい:私は、このメソッドを追加しました私のApiController内部ApiController拡張メソッド - ResponseMessageにアクセスできない

{ 
    "error": "invalid_grant", 
    "error_description": "You have 3 more attempts before Your account will be locked." 
} 

{ 
    "error": "40001", 
    "error_description": "Somethis is wrong" 
} 
:これは私に見栄えの良い応答を与える

public IHttpActionResult Test() 
{ 
    HttpError err = new HttpError(); 
    err["error"] = "40001"; 
    err["error_description"] = "Something is wrong"; 
    var response = Request.CreateErrorResponse(HttpStatusCode.NotFound, err); 
    return ResponseMessage(response); 
} 

これを以下の拡張方法に変換しようとしました:

public static class ApiControllerExtensions 
{ 
    public static IHttpActionResult BadRequest(this ApiController apiController, string error, string errorDetails) 
    { 
     HttpError err = new HttpError(); 
     err["error"] = error; 
     err["error_description"] = errorDetails; 
     var response = apiController.Request.CreateErrorResponse(HttpStatusCode.NotFound, err); 
     return apiController.ResponseMessage(response); 
    } 
} 

が、私はエラーを取得:Cannot access protected internal method 'ResponseMessage' here

私はカスタムベースApiControllerを作成し、そこにそのメソッドを追加することができます知っているが、私は他のプロジェクトで再利用しやすくなりますので、拡張メソッドを作成したいと思います。

ApiController拡張メソッドからIHttpActionResultを返すにはどうすればよいですか?

+0

独自のCustomApiCon内部クラスを呼び出すpublic仮想ResponseMessageメソッドを実装していますか?次に、CustomApiController – benjrb

+0

の拡張メソッドを作成して、基本クラスに保持します。それは同じだ。 –

+0

@benjrb私はこのようにすることができますが、私はまだCustomApiControllerを使用する必要がある場合は、拡張メソッドを持つ点は何ですか。私はそれを避け、カスタム基本クラスではなく、ApiControllerの拡張クラスを持っていたい – Misiu

答えて

0

私の拡張メソッドを修正することができました。
代わりreturn apiController.ResponseMessage(response)の私は以下

return new ResponseMessageResult(response)を追加しまし働いている拡張メソッド:

public static class ApiControllerExtensions 
{ 
    public static IHttpActionResult InvalidRequest(this ApiController apiController, string error, string errorDetails = "", ModelStateDictionary modelState = null) 
    { 
     var err = modelState != null ? new HttpError(modelState, false) : new HttpError(); 
     if (err.ContainsKey("message")) 
      err.Remove("message"); 
     err["error"] = error; 
     if (!string.IsNullOrWhiteSpace(errorDetails)) 
      err["error_description"] = errorDetails; 
     var response = apiController.Request.CreateErrorResponse(HttpStatusCode.BadRequest, err); 

     return new ResponseMessageResult(response); 
    } 

    public static IHttpActionResult InvalidRequest(this ApiController apiController, string error, ModelStateDictionary modelState = null) 
    { 
     return InvalidRequest(apiController, error, null, modelState); 
    } 
} 

とサンプルの使用法は次のようになります。

return this.InvalidRequest("error") 

return this.InvalidRequest("error","error details") 

var msd = new ModelStateDictionary(); 
msd.AddModelError("name", "name not valid"); 

return this.InvalidRequest("error",msd); 
return this.InvalidRequest("error","details",msd); 

はJSONを返した(400不正なリクエスト)が次のようになります:

{ 
    "error": "error", 
    "modelState": { 
     "name": [ 
      "name not valid" 
     ] 
    }, 
"error_description": "details" 
}