Nano Hash - криптовалюты, майнинг, программирование

Таблица стилей ELMAH не работает с Simple Injector

В приложении ASP.NET при попытке работать как с Simple Injector, так и с ELMAH следующий запрос на получение возвращает ошибку 500:

GET /elmah.axd/stylesheet возвращает ошибку 500.

Сообщение об ошибке:

Не удалось найти регистрацию для типа ManifestResourceHandler и выполнить неявную регистрацию. Чтобы контейнер мог создать ManifestResourceHandler, он должен иметь только один общедоступный конструктор: их 2. См. https://simpleinjector.org/one-constructor для получения дополнительной информации.

Трассировки стека:

SimpleInjector.ActivationException: No registration for type ManifestResourceHandler could be found and an implicit registration could not be made. For the container to be able to create ManifestResourceHandler it should have only one public constructor: it has 2. See https://simpleinjector.org/one-constructor for more information.
   at SimpleInjector.Container.ThrowNotConstructableException(Type concreteType)
   at SimpleInjector.Container.ThrowMissingInstanceProducerException(Type serviceType)
   at SimpleInjector.Container.ThrowInvalidRegistrationException(Type serviceType, InstanceProducer producer)
   at SimpleInjector.Container.GetRegistration(Type serviceType, Boolean throwOnFailure)
   at WebApp.Global.InitializeHandler(IHttpHandler handler) in .......\Global.asax.cs:line 63
   at WebApp.PageInitializerModule.<>c__DisplayClass1_0.<System.Web.IHttpModule.Init>b__0(Object sender, EventArgs e) in .......\Global.asax.cs:line 48
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

После ссылки «для получения дополнительной информации», упомянутой выше, есть дополнительная ссылка на некоторую документацию о том, как попытаться исправить эти типы ошибок. Ссылка: https://simpleinjector.readthedocs.io/en/latest/extensibility.html#overriding-constructor-resolution-behavior

Там предлагается 2 исправления. Я попробовал оба исправления и для каждого получил следующие разные ошибки.

Первое исправление

Где используется GreediestConstructorBehavior. Это исправление дало следующее сообщение об ошибке и трассировку стека:

Сообщение об ошибке первого исправления:

Не удалось найти регистрацию для типа ManifestResourceHandler и выполнить неявную регистрацию. Конструктор типа ManifestResourceHandler содержит параметр resourceName типа String, который нельзя использовать для внедрения конструктора.

Трассировка стека первого исправления:

SimpleInjector.ActivationException: No registration for type ManifestResourceHandler could be found and an implicit registration could not be made. The constructor of type ManifestResourceHandler contains parameter 'resourceName' of type String which can not be used for constructor injection.
   at SimpleInjector.Container.ThrowNotConstructableException(Type concreteType)
   at SimpleInjector.Container.ThrowMissingInstanceProducerException(Type serviceType)
   at SimpleInjector.Container.ThrowInvalidRegistrationException(Type serviceType, InstanceProducer producer)
   at SimpleInjector.Container.GetRegistration(Type serviceType, Boolean throwOnFailure)
   at WebApp.Global.InitializeHandler(IHttpHandler handler) in .......\Global.asax.cs:line 63
   at WebApp.PageInitializerModule.<>c__DisplayClass1_0.<System.Web.IHttpModule.Init>b__0(Object sender, EventArgs e) in .......\Global.asax.cs:line 48
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Второе исправление

Где используется MostResolvableParametersConstructorResolutionBehavior. Это второе исправление дало следующее сообщение об ошибке и трассировку стека:

Второе сообщение об ошибке исправления:

Не удалось найти регистрацию для типа ManifestResourceHandler и выполнить неявную регистрацию. Чтобы контейнер мог создать ManifestResourceHandler, он должен содержать общедоступный конструктор, содержащий только разрешаемые параметры.

Вторая трассировка стека исправлений

SimpleInjector.ActivationException: No registration for type ManifestResourceHandler could be found and an implicit registration could not be made. For the container to be able to create ManifestResourceHandler, it should contain a public constructor that only contains parameters that can be resolved.
   at SimpleInjector.Container.ThrowNotConstructableException(Type concreteType)
   at SimpleInjector.Container.ThrowMissingInstanceProducerException(Type serviceType)
   at SimpleInjector.Container.ThrowInvalidRegistrationException(Type serviceType, InstanceProducer producer)
   at SimpleInjector.Container.GetRegistration(Type serviceType, Boolean throwOnFailure)
   at WebApp.Global.InitializeHandler(IHttpHandler handler) in .......\Global.asax.cs:line 63
   at WebApp.PageInitializerModule.<>c__DisplayClass1_0.<System.Web.IHttpModule.Init>b__0(Object sender, EventArgs e) in .......\Global.asax.cs:line 48
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Спасибо всем, кто может помочь с этим.


Ответы:


1

Исправлено путем обновления класса PageInitializerModule, чтобы Simple Injector игнорировал обработчики ELMAH:

Перед изменением:

public sealed class PageInitializerModule : IHttpModule
{
    public static void Initialize()
    {
        DynamicModuleUtility.RegisterModule(typeof(PageInitializerModule));
    }

    void IHttpModule.Init(HttpApplication app)
    {
        app.PreRequestHandlerExecute += (sender, e) => {
            var handler = app.Context.CurrentHandler;
            if (handler != null)
            {
                string name = handler.GetType().Assembly.FullName;
                if (!name.StartsWith("System.Web") &&
                    !name.StartsWith("Microsoft"))
                {
                    Global.InitializeHandler(handler);
                }
            }
        };
    }

    void IHttpModule.Dispose() { }
}

Изменился на:

public sealed class PageInitializerModule : IHttpModule
{
    public static void Initialize()
    {
        DynamicModuleUtility.RegisterModule(typeof(PageInitializerModule));
    }

    void IHttpModule.Init(HttpApplication app)
    {
        app.PreRequestHandlerExecute += (sender, e) => {
            var handler = app.Context.CurrentHandler;
            if (handler != null)
            {
                string name = handler.GetType().Assembly.FullName;
                if (!name.StartsWith("System.Web") &&
                    !name.StartsWith("Microsoft") &&
                    !name.StartsWith("Elmah")) // <----- ADDED THIS -----
                {
                    Global.InitializeHandler(handler);
                }
            }
        };
    }

    void IHttpModule.Dispose() { }
}
12.04.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..