Adicione um manipulador de erros personalizado no início da seção de módulos em web.config (não manualmente)
-
09-12-2019 - |
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:
Adicionar a entrada web.config manualmente não é uma opção.
Não há realmente outra maneira?
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):
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;