2013-08-07 52 views
3

我正在開發一個我要在IIS上託管的WCF Rest服務。只能在一個地方處理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; 
    } 
} 

在所有的我的方法,我可以拋出一個ArgumentExceptionException,並與回報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。我會在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