【问题标题】:ApiController extension method - can't access ResponseMessageApiController 扩展方法 - 无法访问 ResponseMessage
【发布时间】: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


【解决方案1】:

我已经设法修复了我的扩展方法。
我添加了 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"
}

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多