HttpContext.Response.Filter

use*_*308 11 asp.net asp.net-mvc-3 visual-studio-2013

目前正在使用asp.net mvc 3 VS 2010.刚刚安装了VS 2013,现在我们的自定义过滤器无法正常工作.呈现页面时,它只显示一个空白页面.过滤器有数据并将其写出,但链接过程中的某些内容不起作用.

var response = filterContext.HttpContext.Response;
response.Filter = new MappingResponse(response.Filter);
Run Code Online (Sandbox Code Playgroud)

在visual studio 2010中,过滤器是System.Web.HttpResponseStreamFilterSink.

在visual studio 2013中,过滤器是 Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.ArteryFilter

甚至无法在docs中找到该类.当我调用stream类时,它似乎没有链接Write方法.

这是我写出流的实际代码

var responseBuffer = UTF8Encoding.UTF8.GetBytes( htmlPage );
responseStream.Write( responseBuffer, 0, responseBuffer.Length );
Run Code Online (Sandbox Code Playgroud)

gim*_*ael 10

经过长时间的挖掘,我注意到VS2013增加了一个新产品; SignalR - 事实证明它与ArteryFilter问题有关.

因此,为了解决此问题,请取消选中"调试"按钮旁边的"启用浏览器链接"功能.过滤器再次按预期工作.VS2013没有链接过滤器仍然很奇怪.

取消选中

另请注意,这是一般的ASP.NET功能,因此不限于MVC.

保留历史 - 答案在上面

我遇到了同样的事情,但到目前为止它似乎与新的IISExpress有关,而不是VS2013 perse.在VS2012中运行良好的东西与安装VS2013引入的命运相同.

通过正常的IIS执行时问题消失,因此您的代码工作正常.如果您找到了禁用此方法的方法,请告诉我{Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.ArteryFilter}.

进一步调查显示,VS2013确实改变了applicationhost.config(通常位于%USERPROFILE%\ documents\IISexpress\config中).我将备份重命名为ApplicationHost.config.20120825120333.bak.这个谜团的解决方案在某种程度上隐藏在此配置更改中.

直接恢复配置使IISExpress无法从VS2013启动.

一个不太好的解决方案:

您可以关闭调试(相当于CTRL + F5),IISExpress将按预期执行和工作.启用调试将再次引入此条目的功能.

  <system.web>
    <compilation targetFramework="4.5" debug="false"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
Run Code Online (Sandbox Code Playgroud)