2013-08-07 3 views
3

IIS에서 호스팅 할 WCF Rest 서비스를 개발하고 있습니다.한 곳에서만 WCF Rest Service 예외 처리

이제 서비스 계약을 구현 중이며 예외를 처리하려고 할 때 모든 메소드에서 동일한 코드가 반복되는 것을 볼 수 있습니다.

이 내 서비스 계약 방법의 하나입니다 내 모든 메소드에

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 서비스에서이 패턴을 구현 한 것을 보면 복잡한 엔터프라이즈 수준 시나리오에서만 의미가 있다고 말할 수 있습니다. 간단한 경우 예외를 수동으로 던지기를 계속합니다.

또 다른 대안은 Web API으로 REST 서비스를 구현하는 것입니다. 그것은 예외 처리가 좋은 상자 strategy 및 Microsoft가 실제로 .NET Technology Guide for Business Applications에서 REST 개발을 위해 권장하는 것입니다.

+0

를 완료 답변을 주셔서 감사하지만 복잡한 엔터프라이즈 수준의 시나리오를하지 않습니다. 나는 단지 코드를 반복하지 않기를 원한다. 감사. – VansFannel

+0

글쎄, 간단히 말해, WCF가 처음에는 HTTP에 친숙하지 않기 때문에 예외를 던지기위한 좋은 대안이 없다. 저는 웹 API에서 모든 것을 할 것이고, MVC 코드 규칙에 따른 보편화되지 않은 방식으로 처음부터 완벽하게 파악하는 데 2 ​​일이 걸렸습니다. –

+0

이것은 내가 찾고 있었던 것이다 : http://dotnet.dzone.com/news/wcf-rest-tip-2 미안하지만, 잘 설명하지 못했다. – VansFannel

0

WCF는 예외를 오류로 변환하는 뛰어난 확장 기능을 기본 제공합니다. 이 확장 지점은 IErrorHandler 인터페이스를 통해 사용할 수 있습니다.이 인터페이스는 HandleError 및 ProvideFault라는 두 가지 메서드를 제공합니다. HandleError 메서드는 호출이 이미 완료된 후에 별도의 스레드에서 호출되어 가능한 경우 오류를 기록하고 다른 작업을 수행합니다. 다음은 서비스 web.config 파일에 유용한 링크

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

LoggingConfiguration 장에게 오류를 기록하는 또 다른 옵션이다.

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