2011-07-08 23 views
9

Tengo un problema. Localmente todo funciona bien pero en el servidor de producción siempre arroja la excepción 'La respuesta no está disponible en este contexto'. ¿Cual puede ser el problema? Me he dado cuenta de que muchas personas experimentan este problema debido a algunos cambios de global.asax. Aquí está el código de global.asax, la parte relacionada con el inicio de la aplicación.La respuesta no está disponible en este contexto

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; 
    } 

No consumo propiedades de respuesta o solicitud de HttpContext en absoluto. Ni en asax global en sí mismo, ni dentro de los métodos a ser llamados. Ayuadame.

Eso es lo que se ve. ` Error de servidor en '/' Aplicación.

La respuesta no está disponibleen este contexto.

Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de excepciones: System.Web.HttpException: La respuesta no está disponible en este contexto.

Error de origen:

una excepción no controlada se generó durante la ejecución de la solicitud Web actual. La información sobre el origen y la ubicación de la excepción se puede identificar utilizando el seguimiento de pila de excepción a continuación.

Seguimiento de la pila:

[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` 
+0

¿Cuándo ocurre el error (al hacer qué)? ¿Puedes mostrar el código donde ocurre el error? – M4N

+0

acordado; stacktrace y los detalles de la excepción exacta parecerían clave aquí –

+0

No puedo decir qué línea lo causa porque no puedo depurar la versión de la vida. La versión local funciona perfectamente! – Oybek

Respuesta

4

Después de cavar y mirar el código de SolrNet, parece que no están haciendo nada mal. Además, as Darin pointed out in an indirect manner, HttpUtility.UrlEncode debería funcionar bien en el código sin un HttpContext, como una aplicación de consola, y lo hace.

Sin embargo, como VinayC señalado en su comentario sobre la respuesta de Darin de:

Actually, it appears to be a bug. From reflector, actual code appears to be "if (null != current && null != current.Response && ...)" where current is current http context. Issue here is that Response getter throws an exception, instead of returning null

en vez de tirar esa excepción excesivamente descriptiva (sin lugar a dudas que estaban tratando de ser útil), que deberían haber regresado nula y dejar pasar las excepciones de referencia nula. En este caso, simplemente estaban buscando nulos, ¡así que la excepción no hubiera sucedido de todos modos! Lo reportaré como un error si aún no lo ha sido.

Desafortunadamente, lo que esto significa para usted es que no tiene más remedio que ejecutar en modo clásico. Técnicamente, puedes poner la llamada al TebeComSearchEngine.SolrManager.RecalculateMostRequested() en un hilo que engendras en application_start y retrasar su ejecución hasta después de que la aplicación termine de comenzar. Por lo que yo sé, no hay una forma infalible de señalar programáticamente el final de la aplicación, por lo que ese enfoque puede ser un poco complicado.

Sin embargo, si estás dispuesto a hacerlo, probablemente puedas implementar ese mecanismo retrasado de inicio.En comparación con castigar al primer visitante del sitio, no parece tan malo.

+0

Gracias :) Dedicaré un tiempo a buscar una solución alternativa confiable para el inicio de la aplicación. Todavía no tendría acceso a Request, pero funcionaría alrededor del error de .net –

+0

Bueno, creo que pondré el código en Application_BeginRequest con un booleano global. Después de lanzar este código en la rutina, estableceré el valor en falso para que las solicitudes posteriores no activen el código. En otras palabras, lanzaré este código en la primera solicitud de la página. – Oybek

9

'Response is not available in this context'. What can be the problem?

Está ejecutando esta en modo IIS7 grupo de aplicaciones integrado en lugar de modo clásico. En el modo Integrado, no tiene acceso a HttpResponse en Application_Start y cualquier intento de acceder a él explotará.

Aquí hay un blog post que cubre una situación similar pero con HttpRequest.

+0

¿Debo cambiar a un modo clásico que no me gustaría hacer o eliminar el uso de Request que simplemente no puedo encontrar? – Oybek

+0

@Oybek, ambos son posibles. Depende de ti para decidir. Probablemente eliminaría el uso de Request. Tal vez está llamando a alguna biblioteca externa que intenta acceder a la solicitud. A juzgar por el seguimiento de pila de excepción, parece que SolrNet está intentando acceder a él. –

+0

@Oybek podemos ayudarte a encontrarlo, solo necesitamos ver un poco más de código. Probablemente está anidado en algún lugar relativamente profundo. –

Cuestiones relacionadas