Pregunta

¿Hay una manera de poner un controlador de errores httpmodule al comienzo de la sección de módulos en web.config sin hacer esto manualmente?

He probado el enfoque de la web.config complementario como este:

  <add path="configuration/system.webServer/modules" id="{125A654F-9220-42F0-A97A-1746252468DE}">
    <add name="CustomErrorHandler" type="com.handlers.CustomErrorHandler, Assemblyname, Version=4.5.6.7, Culture=neutral, PublicKeyToken=3450345789" />
  </add>

El problema es que el controlador de errores personalizado debe colocarse antes del controlador estándar. Si no lo hace, SharePoint maneja la excepción en sí misma y ofrece la página de excepciones estándar.

esperado:

 <modules runAllManagedModulesForAllRequests="true">
  <add name="CustomErrorHandler" type="com.handlers.CustomErrorHandler, Assemblyname, Version=4.5.6.7, Culture=neutral, PublicKeyToken=3450345789" />
  <remove name="FileAuthorization" />
  <remove name="Profile" />
  <remove name="WebDAVModule" />
  <remove name="Session" />
  <add name="SPRequestModule" preCondition="integratedMode" type="Microsoft.SharePoint.ApplicationRuntime.SPRequestModule, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  <add name="SharePoint14Module" preCondition="integratedMode" />
  <add name="StateServiceModule" type="Microsoft.Office.Server.Administration.StateModule, Microsoft.Office.Server, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="RSRedirectModule" type="Microsoft.ReportingServices.SharePoint.Soap.RSRedirectModule, RSSharePointSoapProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
  <add name="PublishingHttpModule" type="Microsoft.SharePoint.Publishing.PublishingHttpModule, Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
</modules>

Resultado por enfoque complementario:

<modules runAllManagedModulesForAllRequests="true">
  <remove name="FileAuthorization" />
  <remove name="Profile" />
  <remove name="WebDAVModule" />
  <remove name="Session" />
  <add name="SPRequestModule" preCondition="integratedMode" type="Microsoft.SharePoint.ApplicationRuntime.SPRequestModule, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  <add name="SharePoint14Module" preCondition="integratedMode" />
  <add name="StateServiceModule" type="Microsoft.Office.Server.Administration.StateModule, Microsoft.Office.Server, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="RSRedirectModule" type="Microsoft.ReportingServices.SharePoint.Soap.RSRedirectModule, RSSharePointSoapProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
  <add name="PublishingHttpModule" type="Microsoft.SharePoint.Publishing.PublishingHttpModule, Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="CustomErrorHandler" type="com.handlers.CustomErrorHandler, Assemblyname, Version=4.5.6.7, Culture=neutral, PublicKeyToken=3450345789" />
</modules>

Como dice este hilo (Confiremd por desarrollador de MS) No hay manera de controlar el orden de los nodos cuando trabaje con SPWebConfigmodificación:

http: / /social.technet.microsoft.com/forums/en-us/sharepoint2010programming/thread/154a09de-d9fc-4622-a397-589a3c1a87e5/

Agregar la entrada web.config Manualmente es ninguna opción.

¿No hay ninguna otra forma?

¿Fue útil?

Solución 2

Finalmente terminé con un enfoque diferente para mis páginas de error personalizadas.

Porque no es posible controlar el orden de los elementos en Web.Config Programática (¡que apesta tanto!) Y la edición manualmente no es una opción, renuncié al enfoque con httpmodule y manipulando web.config.

En su lugar, escribí un receptor de función de aplicación web de aplicación web como se describe aquí: http://todd-carter.com /post/2010/04/07/An-Expected-Error-Has-Occurred.aspx para establecer una página de error personalizada para la aplicación (que maneja excepciones). La página de error personalizada tiene un control que hace un mensaje personalizado para el usuario y registra la excepción.

Además, agregué un archivo personalizado 404.html a la solución en la carpeta Diseños Mapped \ 1033 y registré ese archivo para la aplicación en el mismo receptor de características (consulte el código a continuación). El 404.HTML hace una redirección a un archivo .aspx. El ASPX tiene un control que hace que el contenido sea internacionalizado. También puede simplemente establecer el HTML estático para 404 errores. La razón de la redirección fue la internacionalización.

Un trampa adicional con el archivo .html y los navegadores que no son IE, fue para mí el problema descrito aquí (porque copié el estándar SP 404.HTML para un punto de partida):

http://andreasglaser.net/post/2009/03/15/sharepoint-and-custom-404-page-not-found-and-utf-8-suen-with-firefox. ASPX

El código va aquí:

private const string CustomErrorPage = "/_layouts/CustomError.aspx";

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
  SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;

  if (webApp != null)
  {
    if (!webApp.UpdateMappedPage(SPWebApplication.SPCustomPage.Error, CustomErrorPage))
    {
      throw new ApplicationException("Cannot create the new error page mapping.");
    }
  }

  webApp.FileNotFoundPage = "Custom404.html";
  webApp.Update(true);
}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
  SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;

  if (!webApp.UpdateMappedPage(SPWebApplication.SPCustomPage.Error, null))
  {
    throw new ApplicationException("Cannot reset the default error page mapping.");
  }
  webApp.FileNotFoundPage = String.Empty;
  webApp.Update(true);
}

Otros consejos

Si no funciona como se esperaba, entonces le recomendaría que use xpath xpathjunto con SPWebModifications para definir el pedido.

actualización

Acabo de probarlo mi solución junto con la solución XPath y no se está comportando como se espera.Parece que hay de ninguna manera de controlar el orden de las entradas.¡Gracias por su opinión!

actualización 2

¿Podría intentar usar HttpApplication en lugar de HttpContext porque HttpApplication define los métodos, propiedades y eventos comunes a todos los objetos de aplicación dentro de una aplicación ASP.NET. Ver más

Uso

 HttpContext context = ((HttpApplication)sender).Context;

Licenciado bajo: CC-BY-SA con atribución
scroll top