【问题标题】:How do I add/change .NET Web API's default Json message response properties?如何添加/更改 .NET Web API 默认 Json 消息响应属性?
【发布时间】:2017-02-27 08:12:19
【问题描述】:

以 Web API 中未经授权的调用为例,它将按照此提供响应。

  1. 对于不成功的 API 响应,是否可以将默认属性名称“消息”更改为其他名称,例如“原因”/“描述”?

  2. 是否可以添加“状态”之类的新属性?

【问题讨论】:

    标签: c# .net asp.net-mvc


    【解决方案1】:

    是的,只需使用如果您想更改从服务器返回的 Josn 响应的结构,您可以使用 asp.net mvc app 中的以下代码创建新的响应。

      // here you can use your own properties  which then can be send to client .
      return Json(new { Status= false ,Description = response.Message });
    

    如果你有控制器方法,那么你应该返回 JsonResult

    如果您正在寻找通用解决方案,请查看这篇文章,它可能会对您有所帮助。

    http://www.devtrends.co.uk/blog/wrapping-asp.net-web-api-responses-for-consistency-and-to-provide-additional-information

    【讨论】:

    • 嗨@Yashveer,我实际上正在寻找更深入的东西,它甚至没有达到控制器动作。无论是未经授权的 401,还是其他一些非 200 响应。
    • @Kes 您能否提供更多信息,例如您希望此实现在哪里。一个可能的答案是另一个答案是使用 AuthorizeAttribute 。创建一个自定义类,当控制器上存在 Authorize 属性时将调用该类。
    • @Kes 指定您的项目类型以及到目前为止您尝试了什么
    • 基本上我需要标准化来自 Web api 的 json 响应。例如,如果所有操作都返回“状态”作为每个表示成功或失败的响应的一部分,我希望.net 处理的其他响应也返回“状态”(授权就是其中之一)。通过添加自定义授权方式,我将只解析授权。我如何涵盖所有其他响应,例如 { "Message" : "The request is invalid." }?
    • 所以我们看到这意味着您将拥有一个基类,它将具有 Stattus 、 Message 作为 String 并且所有其他 ViewModel 都将从 this 继承。所以所有控制器方法都会返回一些具有基类的东西。这样,您将始终拥有这些属性。这对于所有控制器方法都是正确的,但对于授权你仍然需要一个自定义类
    【解决方案2】:

    可以使用自定义 AuthorizeAttribute 来完成。

     public class CustomAuthorizeAttribute : AuthorizeAttribute
        {
    
            public CustomAuthorizeAttribute ()
            {
    
            }
    
            public override void OnAuthorization(HttpActionContext actionContext)
            {
                try
                {
                    if (Authorize(actionContext))
                    {
                        return;
                    }
                    HandleUnauthorizedRequest(actionContext);
                }
                catch (Exception)
                {
                    //create custom response
                    actionContext.Response = actionContext.Request.CreateResponse(
                        HttpStatusCode.OK,
                        customresponse
                    );
                    return;
                }
    
            }
    
            protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
            {
                //create custom unauthorized response
    
                actionContext.Response = actionContext.Request.CreateResponse(
                    HttpStatusCode.OK,
                    customunauthorizedresponse
                );
                return;
            }
    
            private bool Authorize(HttpActionContext actionContext)
            {
                //authorization logics
            }
    
    
        }
    

    在您的 api 控制器方法中,您可以使用 [CustomAuthorizeAttribute] insted of [Authorize]

    【讨论】:

    • 非常感谢关于自定义授权的指针。但是,有没有办法在全球范围内应用它而不仅仅是授权?因为可能还有其他响应,例如 { "Message" : "The request is invalid." }.
    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多