HttpContext.Response.Filter

В настоящее время используется asp.net mvc 3 VS 2010. Только что установил VS 2013, и теперь наш пользовательский фильтр не работает. Когда страница отображается, она просто отображает пустую страницу. Фильтр имеет данные и записывает их, но что-то в процессе цепочки не работает.

var response = filterContext.HttpContext.Response;
response.Filter = new MappingResponse(response.Filter);

В Visual Studio 2010 фильтр равен System.Web.HttpResponseStreamFilterSink.

В Visual Studio 2013 фильтр равен Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.ArteryFilter.

Не могу даже найти этот класс в документах. Кажется, что он не связывает метод Write, когда я вызываю класс потока.

Это фактический код, в котором я записываю поток

var responseBuffer = UTF8Encoding.UTF8.GetBytes( htmlPage );
responseStream.Write( responseBuffer, 0, responseBuffer.Length );

person user1159308    schedule 29.07.2013    source источник
comment
Этот вопрос шире. Это также происходит при использовании HttpContext.Current.Response.Write({'b':'test 2'}); в операции получения wcf, размещенной в asp.net. Приведенное ниже решение об отключении браузера устранило проблему для меня.   -  person Rafi    schedule 15.04.2015


Ответы (2)


После долгих поисков я заметил, что VS2013 поставляется с новым дополнением; SignalR, который, как оказалось, связан с проблемой ArteryFilter.

Итак, чтобы решить эту проблему, снимите флажок «Включить связь с браузером» рядом с кнопкой «Отладка» и вуаля; фильтры снова работают как положено. Тем не менее странно, что VS2013 не использует цепочку фильтров.

Снимите флажок

Кроме того, обратите внимание, что это общая функция ASP.NET и, следовательно, не ограничивается MVC.

СОХРАНЕНО ДЛЯ ИСТОРИИ - ОТВЕТ ВЫШЕ

Я испытываю то же самое, но пока это связано с новым IISExpress, а не с VS2013 perse. То, что отлично работало в VS2012, постигла та же участь, что и при установке VS2013.

При выполнении через обычный IIS проблема исчезает, поэтому ваш код работает нормально. Дайте мне знать, если вы найдете способ отключить этот {Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.ArteryFilter}.

Дальнейшее исследование показывает, что applicationhost.config (обычно расположенный в %USERPROFILE%\documents\IISexpress\config) действительно изменен VS2013. У меня есть резервная копия, переименованная в ApplicationHost.config.20120825120333.bak. Решение этой загадки каким-то образом скрыто в этом изменении конфигурации.

Прямое восстановление конфигурации делает невозможным запуск IISExpress с VS2013.

ОДНО НЕ ТАК ХОРОШЕЕ РЕШЕНИЕ:

Вы можете отключить отладку (эквивалентно CTRL+F5), и IISExpress будет действовать и работать должным образом. Включение отладки еще раз представит функцию, о которой идет речь в этой записи.

  <system.web>
    <compilation targetFramework="4.5" debug="false"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
person gimlichael    schedule 18.10.2013

Мы только что столкнулись с этой проблемой в VS 2015.

Чтобы добавить к ответу Майкла, самое элегантное решение IMHO - отключить функцию ссылки на браузер в web.config, чтобы она работала для всех разработчиков без дополнительных действий вручную.

<appSettings>
    <add key="vs:EnableBrowserLink" value="false"/>
</appSettings>

Подробнее об этой функции и о том, как ее отключить @http://www.asp.net/visual-studio/overview/2013/using-browser-link#disabling

person vladimir.ilic.exe    schedule 01.10.2015
comment
Точно! Спасибо. Я предполагаю, что, поскольку SignalR внедряет специальные скрипты в поток запросов, чтобы включить ссылку браузера, он блокирует поток во время процесса. Как непонятно, еще раз спасибо. - person BrutalSimplicity; 10.08.2017