请求/响应日志记录的响应正文

2024-01-11

我正在尝试编写一个 Owin 中间件组件,它将记录每个传入的请求和对数据库的响应。

这是我所取得的进展。

我被困在阅读response.body 上。说:

Stream不支持读取。

如何读取 Response.Body ?

 public class LoggingMiddleware : OwinMiddleware
 {
        private static Logger log = LogManager.GetLogger("WebApi");

        public LoggingMiddleware(OwinMiddleware next, IAppBuilder app)
            : base(next)
        {
        }

    public override async Task Invoke(IOwinContext context)
    {
        using (var db = new HermesEntities())
        {

            var sw = new Stopwatch();
            sw.Start();

            var logRequest = new log_Request
            {
                Body = new StreamReader(context.Request.Body).ReadToEndAsync().Result,
                Headers = Json.Encode(context.Request.Headers),
                IPTo = context.Request.LocalIpAddress,
                IpFrom = context.Request.RemoteIpAddress,
                Method = context.Request.Method,
                Service = "Api",
                Uri = context.Request.Uri.ToString(),
                UserName = context.Request.User.Identity.Name

            };
            db.log_Request.Add(logRequest);
            context.Request.Body.Position = 0;

            await Next.Invoke(context);

            var mem2 = new MemoryStream();
            await context.Response.Body.CopyToAsync(mem2);

            var logResponse = new log_Response
            {
                Headers = Json.Encode(context.Response.Headers),
                Body = new StreamReader(mem2).ReadToEndAsync().Result,
                ProcessingTime = sw.Elapsed,
                ResultCode = context.Response.StatusCode,
                log_Request = logRequest
            };

            db.log_Response.Add(logResponse);

            await db.SaveChangesAsync();
        }
    }
}

默认情况下,响应正文是 Katana 主机的只写网络流。您需要将其替换为MemoryStream,读取流,记录内容,然后将内存流内容复制回原始网络流。顺便说一句,如果您的中间件读取请求正文,下游组件则无法读取请求正文,除非请求正文被缓冲。因此,您可能还需要考虑缓冲请求正文。如果你想看一些代码,http://lbadri.wordpress.com/2013/08/03/owin-authentication-middleware-for-hawk-in-thinktecture-identitymodel-45/ http://lbadri.wordpress.com/2013/08/03/owin-authentication-middleware-for-hawk-in-thinktecture-identitymodel-45/可能是一个起点。看看班级HawkAuthenticationHandler.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请求/响应日志记录的响应正文 的相关文章

随机推荐

  • 如何以编程方式将 Word 文件转换为 PDF? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我发现了几个开源 免费软件程序 允许您将 doc 文件转换为 pdf 文件 但它们都是应用程序 打印机驱
  • 更改颜色文本谷歌甘特图(javascript),无需CSS

    如何在不使用或插入 css 的情况下更改左侧文本颜色 此代码与文档相同 我知道颜色取决于资源 我不会更改活动栏的颜色 而只会更改与其关联的文本 google charts load current packages gantt google
  • 如何在 Python 中绘制第一个楔形在顶部的饼图? [matplotlib]

    如何使用 Matplotlib 绘制第一个楔形从中午开始 即在饼图顶部 的饼图 默认值是用于pyplot pie 将第一个边缘放置在三点钟位置 如果能够自定义它就太好了 仅仅因为这出现在我的 Google 搜索中 我会补充说 与此同时 ma
  • ASP.Net 5 登录类库

    我对依赖注入有点陌生 我正在尝试开始使用 ASP NET 5 并且正在努力弄清楚如何使用 ASP NET 5 类库中的服务 尤其是像日志记录和 EF 数据访问这样简单的事情 例如 我已按照此处的指南进行操作 http docs asp ne
  • 避免向列表中添加重复元素 C#

    string lines3 new string 100 List
  • 为什么我在 Ubuntu 中使用 wget 无法获取此页面? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 http 121 199 111 177 http 121 199 111 177 我用win7 IE8 访问这个网址 没问题 可以获取页面 但如果我
  • Spring 3.1 JSON 日期格式

    我正在使用带注释的 Spring 3 1 MVC 代码 spring mvc 当我通过 RequestBody 发送日期对象时 日期显示为数字 这是我的控制器 Controller RequestMapping test public cl
  • Visual Studio Code 文件。排除设置不起作用

    我正在使用 Unity 并尝试从文件资源管理器侧边栏中排除 meta 文件 我导航到文件 gt 首选项 gt 用户设置 或工作区设置 无关紧要 并将文件的内容设置为以下内容 Place your settings in this file
  • TestCafe - 将选择器的结果存储在变量中

    因此 为了测试 我的搜索结果根据我输入的关键字而有所不同 我想在输入关键字之前存储 searchResults 的节点列表 然后将它们与添加关键字后获得的 searchResults 的节点列表进行比较 但是我无法让它工作 我试过了 let
  • Google Chrome 开发者工具包速度很慢

    我已经使用 Google Chrome 的开发工具包 元素检查 堆栈跟踪 JavaScript 调试等 一段时间了 并取得了巨大的成功 然而 大约两周前 它突然变得非常迟缓 例如 当我右键单击 UI 中的某个元素 然后单击 检查元素 时 或
  • Onedrive cors 在 JavaScript 中下载

    我正在尝试在客户端 JavaScript 中处理 onedrive 文件 但首先我需要一种使用 XMLHttpRequest 下载文件的方法 Onedrive支持cors进行很多操作 但是将文件下载到javascript中存在以下问题 正如
  • 在mysql中创建表约束

    我有一个表 其中有一些列a b c每列都有另一列 例如 x y z 这取决于a b c分别 x y z将会有价值1 if a b c具有任何值并且将包含 null 如果a b c has null 举个例子吧 存储的值a is 2 and
  • 静态档案中的 C 符号可见性

    我有文件 foo c bar c 和 baz c 以及定义函数 myfn 的包装器代码 myfn c 该函数使用其他文件中的代码和数据 我想创建诸如目标文件或存档 myfn o 或 libmyfn a 之类的内容 以便 myfn 可以供其他
  • string.Format() 参数

    可以向 string Format 方法传递多少个参数 必须有某种理论上的或强制的限制 它是否基于 params 类型的限制或使用它的应用程序的内存使用情况或完全基于其他原因 好的 我从隐藏中出现 我使用以下程序来验证发生了什么 而 Mar
  • 不带对话框窗口保存

    我正在尝试编写一个脚本来自动执行 Photoshop CS5 的许多操作 其中一部分涉及保存一堆文件 有没有一种方法可以在不打开对话框窗口的情况下保存文件 我一直在寻找JavaScript 工具指南 http wwwimages adobe
  • 如何在 BigQuery 中取消嵌套两列中的两个列表而不使用叉积作为单独的行

    我在 BigQuery 中有一个表 它有两列 每列包含一个数组 对于给定的行 两列将包含相同长度的数组 但该长度可能因行而异 WITH tbl AS select a b c AS one 1 2 3 as two union all se
  • 如何异步渲染局部视图

    可以异步渲染部分视图吗 我有一个需要渲染博客文章的部分视图 博客文章异步返回 In my Layout文件我渲染我的部分页脚 Footer In Footer我有以下标记 Html Action FooterLatestBlogPosts
  • 在 Dex 阶段构建大型 Codename One 应用程序时出错

    在 dex 阶段发送 Android 构建时 我在构建服务器中遇到错误 谷歌搜索了一下我了解到64K函数有一个硬限制 包括所有库 最重的是google play服务 或者你可以使用多个dex机制 如何为代号一激活此功能 我明白代号一 htt
  • SocketIO 发送给特定用户(无需为每个客户端使用单独的空间)

    我正在尝试开发一个支持后端长任务的网络应用程序 我在用flask socketio与芹菜一起打包在我的服务器上 我的工作流程如下 当客户端打开 Html 页面时 我启动到服务器的套接字连接 该连接为用户创建一个 uid 并将其发回 现在 一
  • 请求/响应日志记录的响应正文

    我正在尝试编写一个 Owin 中间件组件 它将记录每个传入的请求和对数据库的响应 这是我所取得的进展 我被困在阅读response body 上 说 Stream不支持读取 如何读取 Response Body public class L