加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ApiController扩展方法 – 无法访问ResponseMessage

发布时间:2020-12-15 21:04:31 所属栏目:百科 来源:网络整理
导读:我想为ApiController创建扩展方法,以便能够返回自定义内容. 我的想法是用我自己的细节返回自定义错误. 我想返回类似于OAuthAuthorizationServerProvider返回的错误的自定义错误: { "error": "invalid_grant","error_description": "You have 3 more attempt
我想为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);
    }
}

但是我收到错误:无法访问受保护的内部方法’ResponseMessage’

我知道我可以创建自定义基础ApiController并在那里添加该方法,但我想创建扩展方法,以便在其他项目中重用它更容易.

如何从ApiController扩展方法返回IHttpActionResult?

解决方法

我已经设法修复了我的扩展方法.而不是返回apiController.ResponseMessage(响应)我添加了返回new ResponseMessageResult(response)

以下是工作扩展方法:

public static class ApiControllerExtensions
{
    public static IHttpActionResult InvalidRequest(this ApiController apiController,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,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 Bad Request)看起来像这样:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读