相关疑难解决方法(0)

如何获取HttpRequestMessage数据

我有一个MVC API控制器,具有以下操作.

我不明白如何阅读消息的实际数据/正文?

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc

50
推荐指数
3
解决办法
9万
查看次数

在ASP.Net Web API中的日志记录DelegatingHandler中读取HttpRequestMessage.Content时丢失

在Controller中的Action中尝试对象时,偶尔似乎是null.我发现,这是由于ReadAsStringAsync()在SendAsync()的覆盖DelegatingHandler.问题在于内容.当我的客户端发送一个内容正文并在记录器中读取它时,它永远不会被Controller Action Invoker读取(或者可能在某个地方JsonFormatter).我怀疑后续调用Content.ReadAsStringAsync()不会抛出异常,但也不会返回预期的内容体(返回一些信息表明异步读取已完成).

但是我的问题仍然存在,因为我想[FromBody]在一个动作中读取一个参数,当它Content.ReadStringAsync获得RaceCondition的时候它是null DelegatingHandler.当JsonFormatter虽然赢了,我得到的对象,但是这是罕见的(只在服务启动).

这是我的DelegatingHandler代码:

public class LogHandler : DelegatingHandler
{

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var apiRequest = new WebApiUsageRequest(request);
        WriteLog(apiRequest);
        request.Content.ReadAsStringAsync().ContinueWith(t =>
        {
            apiRequest.Content = t.Result;
            WriteLog(apiRequest);
        });

        return base.SendAsync(request, cancellationToken).ContinueWith(task =>
        {
            var apiResponse = new WebApiUsageResponse(task.Result);
            apiResponse.Content = task.Result.Content != null ? task.Result.Content.ReadAsStringAsync().Result : null;
            WriteLog(apiResponse);
            return task.Result;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有人有解决这个问题的线索?

c# rest web-services asp.net-web-api

14
推荐指数
3
解决办法
1万
查看次数

标签 统计

c# ×2

asp.net-mvc ×1

asp.net-web-api ×1

rest ×1

web-services ×1