2012-10-25 60 views
3

這是我的服務代碼。我像所有最佳實踐文章中提到的那樣拋出一個錯誤 - 以WebFaultException的形式出現。從WCF中的ASP.NET RESTful webservice返回錯誤的最佳實踐

[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class API 
{ 
    [OperationContract] 
    [WebGet()] 
    public int MyMethod() 
    { 
     throw new WebFaultException<string>("TESTERROR", HttpStatusCode.BadRequest); 
    } 
} 

現在,當發送到http://localhost:1389/API.svc/MyMethod我得到的請求是這樣的JSON對象:

{ 「ExceptionDetail」:空, 「ExceptionType」:空, 「消息」:「服務器是由於內部錯誤而無法處理請求有關錯誤的更多信息,請在服務器上啓用IncludeExceptionDetailInFaults(來自ServiceBehaviorAttribute或來自配置行爲),以便將異常信息發回給客戶端,或者打開根據Microsoft .NET Framework 3.0 SDK文檔進行跟蹤並檢查服務器跟蹤日誌。「,」StackTrace「:null}

我試着在我的web.config中啓用includeExceptionDetailInFaults,這個消息確實有點改變,但是我仍然沒有在任何地方看到我的「TESTERROR」!

回答

1

好了,原來你把它添加到的.svc -file:Factory="System.ServiceModel.Activation.WebServiceHostFactory"

並從web.config中<behaviors>部分,只留下了這一點:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="MyAPI"><endpoint address="" binding="webHttpBinding"/></service> 
    </services> 
</system.serviceModel> 
1

我認爲發生的事情是你沒有任何形式的回報發生,只有一個迴應代碼。所以你的服務器扔500沒有任何額外的信息。您仍然可以通過將異常詳細信息輸出到日誌文件來使用它。

我通常會做的是創建一個可序列化的響應對象,其中包含一條消息和我想返回給客戶端的任何代碼。然後,我捕捉到異常,構建響應對象並將其返回給客戶端。客戶端然後接收它可以讀取的xml有效載荷。所以,如果它不是200(成功),那麼我認爲這是一個錯誤,並顯示相應的信息(或者說我包含在XML細節

<ServiceError> 
    <ServerCode> 
     500 
    </ServerCode> 
    <ApplicationCode> 
     9100 
    </ApplicationCode> 
    <Message> 
     API key is expired. 
    </Message> 
</ServiceError> 

更新:

至於JSON標準那張,我從來沒有見過一個實際的文檔標準我所看到的是一種事實上的標準,或者說這種趨勢是:

{ 
    "status": "success", //or "failed" 
    "data": { 
    //any app specific payload here 
    }, 
    "message": null //or additional info here (i.e. exception details) 
} 
+0

我知道我可以構建任何我想要的,使用HttpContext.Current例如...但我們所記錄的方式返回錯誤一個JSON RESTful WCF服務? – Alex

+0

我不認爲有官方的標準迴應。但有一個共同的答案(編輯我的答案) – Sinaesthetic

+0

yap,感謝編輯,但我的意思是 - 如果在.NET中有任何內置機制允許返回這種類型的數據。不要猜...好吧,我會等幾天才結束問題,謝謝 – Alex