Ответ не доступен в этом контексте

У меня проблемы. Локально все работает нормально, но на рабочем сервере всегда выдается исключение "Ответ недоступен в этом контексте". В чем может быть проблема? Я заметил, что многие люди испытывают эту проблему из-за некоторых изменений в 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, чтобы обойти эту ошибку. (или если вам это действительно нужно, почему бы не форкнуть исходный код и исправить его?)

РЕДАКТИРОВАТЬ: Я только что исправил это.

Другие вопросы по тегам