Domanda

C'è un modo per mettere un gestore di errori httpmodule all'inizio della sezione dei moduli in Web.config senza farlo manualmente?

Ho provato l'approccio web.config supplementare come questo:

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

Il problema è che il gestore di errore personalizzato deve essere posizionato prima del gestore standard. Se non lo fai, SharePoint gestisce l'eccezione stessa e offre la pagina di eccezione standard.

Previsto:

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

Risultato da approccio supplementare:

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

Come questo thread dice (Confreremd per sviluppatore MS) Non c'è modo di controllare l'ordine dei nodi quando si lavora con SPWEBConfigModification:

http: / /social.technet.microsoft.com/forums/en-us/sharepoint2010Programming/Thread/154a09DE-D9FC-4622-A397-589A3C1A87E5/

Aggiunta manuale del web.config non è alcuna opzione.

Non c'è davvero altro modo?

È stato utile?

Soluzione 2

Alla fine ho finito con un approccio diverso per le mie pagine di errore personalizzate.

Poiché non è possibile controllare il ordine degli elementi in Web.config a livello programmatico (che succhia così tanto!) E la modifica manuale non è opzione, ho rinunciato all'approccio con un httpmodule e manipolando web.config. Invece ho scritto un ricevitore di funzionalità di applicazione web come descritto qui descritto: http://todd-carter.com /Post/2010/04/07/an-expected-error-has-occurered.aspx Per impostare una pagina di errore personalizzata per l'applicazione (che gestisce le eccezioni). La pagina di errore personalizzata ha un controllo che rende un messaggio personalizzato per l'utente e registra l'eccezione.

Inoltre ho aggiunto un file personalizzato 404.html alla soluzione nella cartella Layout mappata \ 1033 e registrato quel file per l'applicazione nello stesso ricevitore di funzionalità (vedere il codice sotto). Il 404.html fa un reindirizzamento a un file .aspx. L'ASPX ha un controllo che rende il contenuto internazionalizzato. Puoi anche semplicemente impostare l'HTML statico per 404 errori. La ragione del reindirizzamento era l'internazionalizzazione.

Un insidia aggiuntivo con il file .html e i browser non IE erano per me il problema descritto qui (perché ho copiato lo standard SP 404.html per un punto di partenza):

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

Codice va qui:

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

Altri suggerimenti

Se non funziona come previsto, ti consiglierei di utilizzare xpathinsieme a SPWebModifications per definire l'ordine.

Aggiornamento

Ho appena testato la mia soluzione insieme alla soluzione XPath e non si comporta come previsto.Sembra che ci sia nessun modo di controllare l'ordine delle voci.Grazie per per il suo input!

Aggiorna 2

Potresti provare a utilizzare HttpApplication anziché HttpContext perché HttpApplication definisce i metodi, le proprietà ed eventi comuni a tutti gli oggetti dell'applicazione all'interno di un'applicazione ASP.NET. Vedi altro .

.

Uso

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top