Ответ не доступен в этом контексте
У меня проблемы. Локально все работает нормально, но на рабочем сервере всегда выдается исключение "Ответ недоступен в этом контексте". В чем может быть проблема? Я заметил, что многие люди испытывают эту проблему из-за некоторых изменений в global.asax. Вот код global.asax, часть, связанная с запуском приложения.
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
Application["SystemUser"] = TUser.GetUserByIdentifier("system").UID;
InitializeSolrInstances();
SearchIndexer.DoIndex();
StartRatingTimer();
SolrManager.RecalculateMostRequested();
}
private static void InitializeSolrInstances() {
SolrConfigurationManager.InitSolrConnection<OfferItemPresenter>(Resources.ApplicationResources.SolrServiceURL + "/offer");
SolrConfigurationManager.InitSolrConnection<SavedQueryItemPresenter>(Resources.ApplicationResources.SolrServiceURL + "/savedquery");
SolrConfigurationManager.InitSolrConnection<TopProductsPresenter>(Resources.ApplicationResources.SolrServiceURL + "/topproducts");
SolrConfigurationManager.InitSolrConnection<TopSellersPresenter>(Resources.ApplicationResources.SolrServiceURL + "/topsellers");
SolrConfigurationManager.InitSolrConnection<MostRequestedItemPresenter>(Resources.ApplicationResources.SolrServiceURL + "/mostrequested");
SolrConfigurationManager.InitSolrConnection<MostRequestedQuery>(Resources.ApplicationResources.SolrServiceURL + "/requestedquery");
}
private void StartRatingTimer() {
_LastRatingRenewedTime = DateTime.Now;
DateTime CurrentTime = DateTime.Now;
DateTime StartTime = new DateTime(2011, 1, 1);
GlobalSettings.ReIndexMainSolrCores(StartTime, CurrentTime);
Timer OfferAndUserRatingRenewerTimer = new Timer() {
/*Timer interval for 24 hours*/
Interval = 24 * 60 * 60 * 1000, Enabled = true };
OfferAndUserRatingRenewerTimer.Elapsed += new ElapsedEventHandler(OfferAndUserRatingRenewerTimer_Elapsed);
}
public void OfferAndUserRatingRenewerTimer_Elapsed(Object Sender, ElapsedEventArgs e) {
GlobalSettings.ReIndexMainSolrCores(_LastRatingRenewedTime, e.SignalTime);
_LastRatingRenewedTime = e.SignalTime;
}
Я не использую свойства Response или Request HttpContext вообще. Ни в самом глобальном asax, ни в вызываемых методах. Помоги мне.
Вот что это показывает. Ошибка сервера в приложении /.
Ответ не доступен в этом контексте.
Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.Web.HttpException: Ответ недоступен в этом контексте.
Ошибка источника:
Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местоположении исключения может быть идентифицирована с помощью трассировки стека исключений ниже.
Трассировки стека:
[HttpException (0x80004005): Response is not available in this context.]
System.Web.Util.HttpEncoder.get_Current() +11406684
System.Web.HttpUtility.UrlEncode(String str, Encoding e) +137
SolrNet.Impl.SolrConnection.<Get>b__0(KeyValuePair`2 input) +89
SolrNet.Utils.<Select>d__1a`2.MoveNext() +612
SolrNet.Utils.Func.Reduce(IEnumerable`1 source, TResult startValue, Accumulator`2 accumulator) +393
SolrNet.Impl.SolrConnection.Get(String relativeUrl, IEnumerable`1 parameters) +908
SolrNet.Impl.SolrQueryExecuter`1.Execute(ISolrQuery q, QueryOptions options) +195
SolrNet.Impl.SolrBasicServer`1.Query(ISolrQuery query, QueryOptions options) +176
SolrNet.Impl.SolrServer`1.Query(ISolrQuery query, QueryOptions options) +176
TebeComSearchEngine.SolrManager.RecalculateMostRequested() in SolrManager.cs:77
TebeCom.MvcApplication.Application_Start() in Global.asax.cs:101
[HttpException (0x80004005): Response is not available in this context.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +4043621
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +191
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375
[HttpException (0x80004005): Response is not available in this context.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11612256
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4842149`
3 ответа
После многих копаний и осмотра кода SolrNet они, похоже, не делают ничего плохого. Кроме того, как косвенно указал Дарин, HttpUtility.UrlEncode должен нормально работать в коде без HttpContext, например, в консольном приложении, и это так.
Однако, как отметил VinayC в своем комментарии к ответу Дарина:
На самом деле, это похоже на ошибку. Из отражателя фактический код выглядит так: "if (null!= Current && null!= Current.Response && ...)", где current - текущий контекст http. Проблема здесь в том, что получатель ответа выдает исключение, а не возвращает ноль
Вместо того, чтобы выдавать это чрезмерно описательное исключение (без сомнения, они пытались быть полезными), они должны были просто возвратить нуль и позволить исключениям нулевой ссылки произойти. В этом случае они просто проверяли наличие нулей, поэтому исключение не произошло бы в любом случае! Я сообщу об этом как об ошибке, если это еще не было.
К сожалению, это означает, что у вас практически нет другого выбора, кроме как работать в классическом режиме. Технически вы могли бы позвонить TebeComSearchEngine.SolrManager.RecalculateMostRequested()
в потоке, в котором вы появились application_start
и отложить его выполнение до окончания запуска приложения. Насколько я знаю, нет надежного способа программно сигнализировать об окончании запуска приложения, поэтому такой подход может быть немного грязным.
Если вы готовы к этому, вы, вероятно, могли бы реализовать этот механизм отложенного запуска. По сравнению с наказанием первого посетителя сайта, это не так уж плохо.
"Ответ не доступен в этом контексте". В чем может быть проблема?
Это выполняется в режиме интегрированного пула приложений IIS7 вместо классического режима. В интегрированном режиме у вас нет доступа к HttpResponse в Application_Start
любая попытка получить к нему доступ.
Вот сообщение в блоге, которое описывает похожую ситуацию, но с HttpRequest.
Это обсуждалось около месяца назад в списке рассылки SolrNet.
Это регрессия в ASP.NET 4, вот упоминание об этой ошибке.
В будущем выпуске SolrNet будет заменен System.Web.HttpUtility.UrlEncode, чтобы обойти эту ошибку. (или если вам это действительно нужно, почему бы не форкнуть исходный код и исправить его?)
РЕДАКТИРОВАТЬ: Я только что исправил это.