ApiController扩展方法-无法访问ResponseMessage [英] ApiController extension method - can't access ResponseMessage

查看:105
本文介绍了ApiController扩展方法-无法访问ResponseMessage的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为ApiController创建扩展方法以能够返回自定义内容.
我的想法是使用我自己的详细信息返回自定义错误. 我想返回类似于OAuthAuthorizationServerProvider返回的错误的自定义错误:

I want to create extension method for ApiController to be able to return custom content.
My idea is to return custom error with my own details. I want to return custom error similar to errors returned by OAuthAuthorizationServerProvider:

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

在我的ApiController中,我添加了以下方法:

Inside my ApiController I've added this method:

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"
}

我尝试将其转换为以下扩展方法:

I've tried converting this to below extension method:

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并在其中添加该方法,但是我想创建扩展方法,以便在其他项目中重用它.

I know I can create custom base ApiController and add that method there, but I'd like to create extension method so it will be easier to reuse it in other projects.

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

How can I return IHttpActionResult from ApiController extension method?

推荐答案

我已设法解决扩展方法.
我已添加return new ResponseMessageResult(response)

I've managed to fix my extension method.
Instead of return apiController.ResponseMessage(response) I've added return new ResponseMessageResult(response)

以下是有效的扩展方法:

Below is working extension method:

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错误请求)如下所示:

returned JSON (400 Bad Request) looks like this:

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

这篇关于ApiController扩展方法-无法访问ResponseMessage的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆