【问题标题】:Converted POST FromBody to HttpRequestMessage - Need to Desearialize Body of Request将 POST FromBody 转换为 HttpRequestMessage - 需要反序列化请求正文
【发布时间】:2017-09-28 15:09:36
【问题描述】:

我有使用 FromBody 接受 POST 消息的工作 REST 代码。收到的参数是我需要使用的对象。现在,我需要检查标题中的授权。我认为可以通过将参数从对象切换到 HttpRequestMessage 来解决这个问题。当然,现在必须将消息的内容转换为原始对象,我很难弄清楚。

原来的方法如下:

    [HttpPost]
    public IHttpActionResult Post([FromBody] CardStatusRoot cardStatus)
    {
        try
        {
            if (cardStatus == null)
            {
                return BadRequest("Card data not provided");
            }
            if (cardStatus.Data.TransactionType.ToLower() == "card")
            {
                //... Process;
            }
        }
        catch (Exception ex)
        {
            try
            {
                // Log the failure to fund the card
            }
            catch { }

            return InternalServerError();
        }
        return Ok();
    }

新代码,使用 HttpRequestMessage:

    [HttpPost]
    public IHttpActionResult Post(HttpRequestMessage request)   
    {
        // Get the authentication from the header
        var encoding = Encoding.GetEncoding("UTF-8");
        var authValue = encoding.GetString(Convert.FromBase64String(request.Headers.Authorization.Parameter));
        var validAuthorization = ConfigurationManager.AppSettings["ValidKey"];

        if (authValue != validAuthorization)
        {
            return BadRequest("Not Authorized");
        }

        // This does NOT compile - Need help converting request.Content to a CardStatusRoot object
        CardStatusRoot cardStatus = (CardStatusRoot)request.Content.ReadAsStringAsync().Result;

     ... Same as first method
    }

如何将请求的内容转换为 CardStatusRoot 对象?

【问题讨论】:

  • 您可以同时拥有这两个参数,例如:Post([FromBody] CardStatusRoot cardStatus, HttpRequestMessage request)

标签: c# rest serialization httprequest deserialization


【解决方案1】:

ApiController 可以通过Request 属性访问当前请求。

[HttpPost]
public IHttpActionResult Post([FromBody] CardStatusRoot cardStatus) {
    try {
        HttpRequestMessage request = this.Request;
        if (cardStatus == null) {
            return BadRequest("Card data not provided");
        }
        if (cardStatus.Data.TransactionType.ToLower() == "card") {
            //... Process;
        }
    } catch (Exception ex) {
        try {
            // Log the failure to fund the card
        }
        catch { }

        return InternalServerError();
    }
    return Ok();
}

也就是说,这个问题更像是XY problem

你应该看看

Authentication Filters in ASP.NET Web API 2

Global Error Handling in ASP.NET Web API 2

【讨论】:

  • 谢谢!我希望有一个简单的答案。我从您提供的链接中得知您不喜欢我的错误处理方法?
  • @MarkBonafe Asp.net Web API 中的错误处理和日志记录是一个跨领域的问题。您的控制器应该尽可能精简。该框架提供了许多扩展点来添加该功能。
【解决方案2】:

只需使用前面的签名方法来计算数据。您可以像这样直接访问 headers 值

Request.Headers.Authorization.Parameter

其中RequestApiController 中为每个请求提供的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多