Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebApi在一个过滤器中获取原始正文_C#_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# WebApi在一个过滤器中获取原始正文

C# WebApi在一个过滤器中获取原始正文,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我正在创建一个日志,需要检索请求主体以保存在db中。我用HttpActionContext创建了一个过滤器。 我尝试通过filterContext.Request.Content.ReadAsStringAsync().Result进行恢复; 但它总是返回一个空字符串 LogFilter.cs public override void OnActionExecuting(HttpActionContext filterContext) { try {

我正在创建一个日志,需要检索请求主体以保存在db中。我用HttpActionContext创建了一个过滤器。 我尝试通过filterContext.Request.Content.ReadAsStringAsync().Result进行恢复; 但它总是返回一个空字符串

LogFilter.cs

public override void OnActionExecuting(HttpActionContext filterContext)
    {
        try
        {
            Task<string> content = filterContext.Request.Content.ReadAsStringAsync();
            string body = content.Result;

            logModel.RequestLog rl = new logModel.RequestLog();
            rl.IP = ((HttpContextWrapper)filterContext.Request.Properties["MS_HttpContext"]).Request.UserHostAddress;
            rl.Type = filterContext.ControllerContext.RouteData.Values["controller"].ToString().ToUpper();
            rl.URL = filterContext.Request.RequestUri.OriginalString;
            rl.Operation = filterContext.Request.Method.Method;
            rl.RequestDate = DateTime.Now;


            filterContext.ControllerContext.RouteData.Values.Add("reqID", new deviceLog.RequestLog().Add(rl).ID.ToString());
        }
        catch { }
        //return new deviceLog.RequestLog().Add(rl);
        base.OnActionExecuting(filterContext);
    }
public override void OnActionExecuting(HttpActionContext filterContext)
{
尝试
{
任务内容=filterContext.Request.content.ReadAsStringAsync();
字符串体=content.Result;
logModel.RequestLog rl=新的logModel.RequestLog();
rl.IP=((HttpContextWrapper)filterContext.Request.Properties[“MS_HttpContext”]).Request.UserHostAddress;
rl.Type=filterContext.ControllerContext.RoutedData.Values[“controller”].ToString().ToUpper();
rl.URL=filterContext.Request.RequestUri.OriginalString;
rl.Operation=filterContext.Request.Method.Method;
rl.RequestDate=DateTime.Now;
filterContext.ControllerContext.RoutedData.Values.Add(“reqID”,新设备日志.RequestLog().Add(rl.ID.ToString());
}
捕获{}
//返回新的deviceLog.RequestLog().Add(rl);
base.OnActionExecuting(filterContext);
}

可能请求流已到达末尾。尝试将流位置重置为开始位置:

public class MyAttribute:ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionContext actionContext)
    {
        string rawRequest;
        using (var stream = new StreamReader(actionContext.Request.Content.ReadAsStreamAsync().Result))
        {
            stream.BaseStream.Position = 0;
            rawRequest = stream.ReadToEnd();
        }
    }
}

您正在数据库中保存原始请求?听起来是个有问题的设计选择。我正在保存请求正文,以便能够跟踪一些错误。您如何使用此筛选器?在操作方法上分配它?用作全局筛选器,用于我的应用程序的所有控制器我认为你的应用程序是MVC。请参阅我的WebAPI更新帖子。您的答案如何与microsoft官方文档“此规则的原因是请求正文可能存储在只能读取一次的非缓冲流中。”是否保证正文将始终被读取?执行此代码时,我收到以下错误:“NotSupportedException:此流不支持seek操作。”此答案错误。它不回答所问的问题,并生成NotSupportedException,因为stream.BaseStream是只读的。。