2013-08-07 3 views
3

Я разрабатываю службу WCF Rest, которую я собираюсь разместить в IIS.Обработка исключений службы WCF Rest только в одном месте

Теперь я выполняю контракт на обслуживание, и я вижу, что повторяю один и тот же код во всех своих методах, когда пытаюсь обрабатывать исключения.

Это одна из моего обслуживания методы контракта:

public void DeleteMessage(string message_id) 
{ 
    int messageId; 
    OutgoingWebResponseContext ctx = 
     WebOperationContext.Current.OutgoingResponse; 

    if ((message_id == null) || (!Int32.TryParse(message_id, out messageId)) || (messageId < 1)) 
    { 
     ctx.StatusCode = System.Net.HttpStatusCode.BadRequest; 
     ctx.StatusDescription = "message_id parameter is not valid"; 
     throw new ArgumentException("DeleteMessage: message_id is not valid", "message_id"); 
    } 

    try 
    { 
     using (var context = new AdnLineContext()) 
     { 
      Message message = new Message() { MessageId = messageId }; 

      context.Entry(message).State = EntityState.Deleted; 
      context.SaveChanges(); 

      ctx.StatusCode = System.Net.HttpStatusCode.OK; 
     } 
    } 
    catch (Exception ex) 
    { 
     ctx.StatusCode = System.Net.HttpStatusCode.InternalServerError; 
     ctx.StatusDescription = ex.Message; 
     ctx.SuppressEntityBody = true; 
    } 
} 

На всех моих методах, которые я мог бы бросаться ArgumentException или Exception, и управлять ими с возвратной HTTP STATUS CODE.

Есть ли способ поймать эти исключения во всем мире?

ответ

2

MS-recommended подходы, похоже, следуют FaultException. Идея заключается в реализации интерфейса IErrorHandler. This answer объясняет, как настроить его в конфигурации WCF.

Просмотрев реализацию этого шаблона в сервисе WCF старого стиля, я могу сказать, что он, вероятно, имеет смысл только для сложных сценариев на уровне предприятия. Для простых случаев я буду придерживаться исключений для исключения вручную.

Другой альтернативой является внедрение службы REST с помощью Web API. У этого есть хорошая обработка исключений strategy из коробки, и это то, что Microsoft на самом деле рекомендует для развития REST в .NET Technology Guide for Business Applications.

+0

Спасибо вам за полный ответ, но я не сложный сценарий корпоративного уровня. Я только хочу не повторять код. Благодарю. – VansFannel

+0

Ну, короче говоря, нет простой простой альтернативы для исключения исключений главным образом из-за того, что WCF не очень удобен для HTTP в первую очередь. Я бы сделал все это в Web API вместо этого, взял меня на два дня, чтобы полностью разобрать его с нуля - менее шаблонный с условными обозначениями кода MVC. –

+0

Это то, что я искал: http://dotnet.dzone.com/news/wcf-rest-tip-2 Извините, я не очень хорошо объяснил. – VansFannel

0

WCF имеет отличный встроенный механизм расширяемости для преобразования исключений в неисправности. Эта точка расширяемости может быть использована через интерфейс IErrorHandler, который предоставляет два метода: HandleError и ProvideFault. Метод HandleError вызывается в отдельном потоке после того, как вызов уже завершен, чтобы, возможно, зарегистрировать ошибку и выполнить другие операции. Ниже полезная ссылка

http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.providefault.aspx

LoggingConfiguration секции в файле web.config службы является еще одним вариантом для регистрации ошибок.

http://msdn.microsoft.com/en-us/library/aa303433.aspx

Смежные вопросы