asp.net-core – 替换ASP.NET Core 1.0中间件中的响应流
发布时间:2020-12-16 09:13:05 所属栏目:asp.Net 来源:网络整理
导读:我想在我的ASP.NET Core 1.0项目中编写自定义中间件,它将取代原始框架的Http响应流到我自己的,所以我将能够对它执行读/寻/写操作(原来不可能在原来的2上)流)在进一步的代码中,即在动作或过滤器中. 我已经开始使用以下代码: public class ReplaceStreamMiddl
我想在我的ASP.NET Core 1.0项目中编写自定义中间件,它将取代原始框架的Http响应流到我自己的,所以我将能够对它执行读/寻/写操作(原来不可能在原来的2上)流)在进一步的代码中,即在动作或过滤器中.
我已经开始使用以下代码: public class ReplaceStreamMiddleware { protected RequestDelegate NextMiddleware; public ReplaceStreamMiddleware(RequestDelegate next) { NextMiddleware = next; } public async Task Invoke(HttpContext httpContext) { using (var responseStream = new MemoryStream()) { var fullResponse = httpContext.Response.Body; httpContext.Response.Body = responseStream; await NextMiddleware.Invoke(httpContext); responseStream.Seek(0,SeekOrigin.Begin); await responseStream.CopyToAsync(fullResponse); } } } 以下代码的问题在于,有时在调用await responseStream.CopyToAsync(fullResponse)时,fullResponse流已经关闭;所以它抛出一个异常无法访问一个封闭的Stream. 当我在浏览器中加载页面然后在完全加载之前刷新时,很容易观察到这种奇怪的行为. 我想知道: >为什么会这样? 解决方法
异常不是来自您的CopyToAsync.它来自您的一个代码的调用者:
您没有在HttpContext中恢复原始响应流.因此,无论谁调用您的中间件,都会返回一个已关闭的MemoryStream. 这是一些有效的代码: app.Use(async (httpContext,next) => { using (var memoryResponse = new MemoryStream()) { var originalResponse = httpContext.Response.Body; try { httpContext.Response.Body = memoryResponse; await next.Invoke(); memoryResponse.Seek(0,SeekOrigin.Begin); await memoryResponse.CopyToAsync(originalResponse); } finally { // This is what you're missing httpContext.Response.Body = originalResponse; } } }); app.Run(async (context) => { context.Response.ContentType = "text/other"; await context.Response.WriteAsync("Hello World!"); }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – jQuery无法在我的主机上运行?
- asp.net-mvc-4 – 来自程序集’mscorlib的WebAPI RC’Syste
- asp.net – Web窗体中的.NET MVC FileResult等价物
- 如何返回404状态,无效参数传递给我的ASP.NET MVC控制器?
- 使用asp.net在互联网上流式传输音频和视频
- 通过ASP.NET菜单控件禁用javascript生成
- 代码“Request.Headers.Range”不能在asp.net核心上运行
- asp.net – scriptresource.axd 404错误在asp net 4应用程序
- asp.net-mvc – MVC 3保持短网址
- 获取Asp.net/iis设置Cache-control:静态文件的max-age
推荐文章
站长推荐
- asp.net – MiniProfiler.Stop()上的MVC Mini Pr
- asp.net-mvc – ASP.net MVC – 为一个用户/角色
- asp.net-core – MVC 6安装为Windows服务(ASP.NE
- asp.net – 如何解决找不到ContentPlaceHolder错
- asp.net – 需要一个必须同时具有数字和字母字符
- asp.net – 如何使用窗口身份验证获取电子邮件地
- 在asp.net中输入密钥发出错误按钮
- templates – 相当于ASP Classic中的母版页
- asp.net-mvc – ASP.MVC应用程序常量,什么是最好
- ASP.NET Core MVC 6中的默认,系统和Mi??crosoft
热点阅读