Исключение, Регистрирующееся для WCF Services с помощью ELMAH

Указание папки миграции также возможно во время вызова команды enable-migrations (которая создает класс Configuration) с использованием параметра -MigrationsDirectory:

enable-migrations -EnableAutomaticMigration:$false -MigrationsDirectory Migrations\CustomerDatabases -ContextTypeName FullyQualifiedContextName

В примере будет создан Configuration класс, который устанавливает MigrationsDirectory в указанную папку «Migrations \ CustomerDatabases», которая относится к корневой папке проектов.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    MigrationsDirectory = @"Migrations\CustomerDatabases";
}


См. Также эту статью , в которой рассказывается о проекте с несколькими контекстами и папками миграции.

Кстати, если вы используете несколько папок миграции и несколько контекстов, пожалуйста, подумайте также о том, чтобы установить имя для схемы по умолчанию в методе OnModelCreating вашего производного класса DbContext (где конфигурация Fluent-API) является). Это будет работать в EF6:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("CustomerDatabases");
    }

Префикс таблиц базы данных префикса с именем схемы. Это позволит вам использовать более одного контекста с одной базой данных в сценарии, где у вас есть несколько групп таблиц, которые не зависят друг от друга. (Это также создаст отдельные версии таблиц MigrationHistory, в приведенном выше примере это будет CustomerDatabases.__MigrationHistory).

62
задан Martin Hollingsworth 22 May 2009 в 00:11
поделиться

3 ответа

Решение из моего сообщения в блоге (указанное в OP) было основано на существующем решении, которое мы использовали / используем для изменения кодов ответа HTTP во время состояния ошибки.

Итак, для нас это было однострочное изменение, чтобы передать исключение в ELMAH. Если есть лучшее решение, я тоже хотел бы знать об этом.

Для постеров / справок и потенциальных улучшений - вот код из текущего решения.

Классы HttpErrorHandler и ServiceErrorBehaviourAttribute

using System;
using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Collections.ObjectModel;
using System.Net;
using System.Web;
using Elmah;
namespace YourApplication
{
    /// <summary>
    /// Your handler to actually tell ELMAH about the problem.
    /// </summary>
    public class HttpErrorHandler : IErrorHandler
    {
        public bool HandleError(Exception error)
        {
            return false;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            if (error != null ) // Notify ELMAH of the exception.
            {
                if (System.Web.HttpContext.Current == null)
                    return;
                Elmah.ErrorSignal.FromCurrentContext().Raise(error);
            }
        }
    }
    /// <summary>
    /// So we can decorate Services with the [ServiceErrorBehaviour(typeof(HttpErrorHandler))]
    /// ...and errors reported to ELMAH
    /// </summary>
    public class ServiceErrorBehaviourAttribute : Attribute, IServiceBehavior
    {
        Type errorHandlerType;

        public ServiceErrorBehaviourAttribute(Type errorHandlerType)
        {
            this.errorHandlerType = errorHandlerType;
        }

        public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
        {
        }

        public void AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
        {
        }

        public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
        {
            IErrorHandler errorHandler;
            errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
            foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
            {
                ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
                channelDispatcher.ErrorHandlers.Add(errorHandler);
            }
        }
    }
}

Пример использования

Украсьте свои службы WCF атрибутом ServiceErrorBehaviour:

[ServiceContract(Namespace = "http://example.com/api/v1.0/")]
[ServiceErrorBehaviour(typeof(HttpErrorHandler))]
public class MyServiceService
{
  // ...
}
88
ответ дан 24 November 2019 в 16:48
поделиться

Я сделал это на основе работы Уилла но я хочу убедиться, что это правильный подход перед публикацией code.

Я думаю, что это отличный подход (спасибо Уиллу за эту публикацию!). Не думаю, что Уилл или вы что-то здесь упустили. Реализация IErrorHandler - это предпочтительный способ перехвата всех возможных исключений на стороне сервера, которые в противном случае могли бы вызвать сбой в канале связи (разрушение), и, таким образом, это естественное место для подключения некоторых журналов, таких как ELMAH.

Marc

2
ответ дан 24 November 2019 в 16:48
поделиться

Я не пробовал делать это явно с помощью REST, и сам не использовал ELMAH, но стоит рассмотреть еще один вариант - подключиться к WCF с использованием IDispatchMessageInspector вместо IErrorHandler.

0
ответ дан 24 November 2019 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: