2

如何从 WebApi 中的控制器方法访问 JSON?例如下面我想访问作为参数传入的反序列化客户和序列化客户。

public HttpResponseMessage PostCustomer(Customer customer)
{
    if (ModelState.IsValid)
        {
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, customer);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = customer.Id }));
            return response;
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
    }
4

3 回答 3

5

您将无法在控制器中获取 JSON。在 ASP.NET Web API 管道中,绑定发生在操作方法执行之前。媒体格式化程序将读取请求正文 JSON(这是一个只读流)并在执行到您的操作方法时清空内容。但是,如果您在绑定之前从管道中运行的组件(例如消息处理程序)读取 JSON,您将能够像这样读取它。如果您必须获取 JSON in action 方法,您可以将其存储在属性字典中。

public class MessageContentReadingHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
                                  HttpRequestMessage request,
                                      CancellationToken cancellationToken)
    {
        var content = await request.Content.ReadAsStringAsync();

        // At this point 'content' variable has the raw message body
        request.Properties["json"] = content;

        return await base.SendAsync(request, cancellationToken);
    }
}

从 action 方法中,您可以像这样检索 JSON 字符串:

public HttpResponseMessage PostCustomer(Customer customer)
{
    string json = (string)Request.Properties["json"];
}
于 2013-08-04T02:33:59.227 回答
0

无法获取解析后的 JSON,但可以获取内容并自行解析。尝试这个:

public async Task PostCustomer(Customer customer)
{
    var json = Newtonsoft.Json.JsonConvert.DeserializeObject(await this.Request.Content.ReadAsStringAsync());

    ///You can deserialize to any object you need or simply a Dictionary<string,object> so you can check the key value pairs.
}
于 2013-11-22T23:29:00.197 回答
0

我试图做一些非常相似的事情,但无法找到一种方法将处理程序直接注入 Web API 的适当位置。似乎委派的消息处理程序介于反序列化/序列化步骤和路由步骤之间(它们在所有这些 Web API 管道图中都没有向您展示)。

但是我发现 OWIN 管道在 Web API 管道之前。因此,通过将 OWIN 添加到您的 Web API 项目并创建自定义中间件类,您可以在请求到达 Web API 管道之前和离开 Web API 管道之后处理请求,这非常方便。并且一定会为您提供您正在寻找的结果。

希望这可以帮助。

于 2015-06-11T13:31:35.833 回答