Добавьте пользовательский обработчик ошибок в начале раздела модулей в Web.config (не вручную)
-
09-12-2019 - |
Вопрос
Есть ли способ поставить обработчик ошибок httpmodule в начале раздела модулей в web.config, не делая этого вручную?
Я попробовал дополнительный подход Web.config, как это:
<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>
.
Проблема в том, что пользовательский обработчик ошибок должен быть размещен перед стандартным обработчиком. Если вы этого не сделаете, SharePoint обрабатывает сам исключение и обеспечивает стандартную страницу исключения.
Ожидается:
<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>
.
Результат по дополнительному подходу:
<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>
.
Как эта нить говорит (Confiremd MS Developer) Нет возможности контролировать порядок узлов при работе с SPWEBConfigmodification:
Добавление записи Web.config вручную не вариант.
на самом деле нет другого пути?
Решение 2
Наконец я оказался другим подходом для моих пользовательских страниц ошибок.
Потому что невозможно контролировать порядок элементов в web.config программно (который столько отсасывает!) И редактирование вручную нет варианта, я отказался от подхода с httpmodule и Manipulation web.config.
вместо этого я написал веб-приложение Scoped Plance Receiver, как описано здесь: http://todd-carter.com /post/2010/04/07/an-expected-Error-has-occurred.aspx . Чтобы установить пользовательскую страницу ошибки для приложения (которая обрабатывает исключения). Страница настраиваемой ошибки имеет элемент управления, который отображает пользовательское сообщение для пользователя и регистрирует исключение.
Дополнительно добавил пользовательский файл 404.html в решение в папке сопоставленных макетов \ 1033 и зарегистрировал этот файл для приложения в том же ресивере функций (см. Код ниже). 404.html делает перенаправление на .aspx-файл. ASPX имеет контроль, который оказывает контент интернационализированным. Вы также можете просто установить статический HTML на 404 ошибок. Причина перенаправления была интернационализация.
Одна дополнительная ловушка с файлом .html и неиправочными браузерами была для меня проблема, описанная здесь (потому что я скопировал стандарт SP 404.html для отправной точки):
код идет здесь:
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);
}
. Другие советы
Если это не будет работать, как ожидалось, я бы порекомендовал вам использовать xpathВместе с SPWEBModifications для определения порядка.
<Сильное> Обновление
Я только что проверил его решение вместе с решением XPath, и он не ведет себя как ожидалось.Похоже, что есть нет способа контролировать порядок записей.Спасибо за его вклад!
<Сильное> Обновление 2
Не могли бы вы попробовать использовать HttpApplication
вместо HttpContext
, потому что HttpApplication
определяет методы, свойства и события, общие для всех объектов приложений в приложении ASP.NET. Подробнее / P >.
Использование
.HttpContext context = ((HttpApplication)sender).Context;