2013-07-29 5 views
10

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

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); 
+0

Этот вопрос шире. Это также происходит, когда вы используете HttpContext.Current.Response.Write ("{'b': 'test 2'}"); в операции получения wcf, размещенной в asp.net. Решение ниже для разблокировки браузера исправило проблему для меня. – Rafi

ответ

10

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

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

Uncheck the "Enable Browser Link"

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

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

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

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

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

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

ONE-НЕ ТАК ХОРОШО РЕШЕНИЕ:

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

<system.web> 
    <compilation targetFramework="4.5" debug="false"/> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 
4

Мы просто попали этот вопрос в VS 2015.

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

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

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

+0

Пятно на! Спасибо. Я предполагаю, что поскольку SignalR внедряет специальные сценарии в поток запросов, чтобы включить ссылку браузера, он блокирует поток во время процесса. Как неясно, еще раз спасибо. – AverageJoe