Pergunta

Existe uma maneira de colocar um manipulador de erros HTTPModule no início da seção de módulos em web.config sem fazer isso manualmente?

Eu tentei a abordagem web.config suplementar assim:

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

O problema é que o manipulador de erros personalizado deve ser colocado antes do manipulador padrão.Caso contrário, o sharepoint tratará a exceção e entregará a página de exceção padrão.

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 abordagem suplementar:

<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 diz este tópico (confirmado pelo MS Developer), não há como controlar a ordem dos nós ao trabalhar com SPWebConfigModification:

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

Adicionar a entrada web.config manualmente não é uma opção.

Não há realmente outra maneira?

Foi útil?

Solução 2

Finalmente acabei com uma abordagem diferente para minhas páginas de erro personalizadas.

Como não é possível controlar a ordem dos elementos no web.config programaticamente (o que é uma droga!) e editar manualmente não é uma opção, desisti da abordagem com um HttpModule e da manipulação do web.config.

Em vez disso, escrevi um receptor de recursos com escopo de aplicativo da Web, conforme descrito aqui:http://todd-carter.com/post/2010/04/07/An-Expected-Error-Has-Occurred.aspxpara definir uma página de erro personalizada para o aplicativo (que trata de exceções).A página de erro personalizada possui um controle que renderiza uma mensagem personalizada para o usuário e registra a exceção.

Além disso, adicionei um arquivo 404.html personalizado à solução na pasta mapeada LAYOUTS\1033 e registrei esse arquivo para o aplicativo no mesmo receptor de recurso (veja o código abaixo).O 404.html redireciona para um arquivo .aspx.O aspx possui um controle que torna o conteúdo internacionalizado.Você também pode definir o html estático para erros 404.O motivo do redirecionamento foi a internacionalização.

Uma armadilha adicional com o arquivo .html e navegadores não-IE foi para mim o problema descrito aqui (porque copiei o SP 404.html padrão como ponto de partida):

http://andreasglaser.net/post/2009/03/15/SharePoint-and-custom-404-Page-Not-Found-and-UTF-8-issue-with-Firefox.aspx

O código vai aqui:

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

Outras dicas

Se não funcionar como esperado, recomendo que você use XPath junto com SPWebModifications para definir a ordem.

Atualizar

Acabei de testar minha solução junto com a solução XPath e ela não está se comportando conforme o esperado.Parece que existe sem chance de controlar a ordem das entradas.Obrigado Per por sua contribuição!

Atualização 2

Você poderia tentar usar HttpApplication em vez de HttpContext porque HttpApplication define os métodos, propriedades e eventos comuns a todos os objetos de aplicativo em um aplicativo ASP.NET. Ver mais

Uso

 HttpContext context = ((HttpApplication)sender).Context;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top