【发布时间】:2017-01-05 09:24:10
【问题描述】:
我想为 ApiController 创建扩展方法,以便能够返回自定义内容。
我的想法是用我自己的详细信息返回自定义错误。
我想返回类似于OAuthAuthorizationServerProvider返回的错误的自定义错误:
{
"error": "invalid_grant",
"error_description": "You have 3 more attempts before Your account will be locked."
}
在我的 ApiController 中,我添加了这个方法:
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);
}
这给了我很好看的回应:
{
"error": "40001",
"error_description": "Somethis is wrong"
}
我已尝试将其转换为以下扩展方法:
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?
【问题讨论】:
-
你能从 ApiController 派生出你自己的 CustomApiController 类并实现一个公共的虚拟 ResponseMessage 方法,该方法调用内部基类吗?然后您将为 CustomApiController 编写扩展方法
-
把它保存在你的基类中。都是一样的。
-
@benjrb 我知道我可以这样做,但是如果我仍然需要使用 CustomApiController,那么使用扩展方法有什么意义。我想避免这种情况并为 ApiController 提供扩展类,而不是自定义基类
标签: c# .net asp.net-web-api2