我被要求使用WCF實現web服務,該服務將返回一個標準的響應對象,該對象指示Web服務調用是成功還是失敗,並返回錯誤消息(如果發生的話)。使用單個標準響應對象創建WCF web服務
它在我看來這不是如何打算使用WCF,是否正確?
我的問題是,我正在使用IDispatchMessageInspector.AfterReceiveRequest()在WCF反序列化並調用我的操作之前對XSD驗證請求。
如果驗證失敗,我該如何返回標準響應對象? WCF似乎希望我在這種情況下拋出FaultException,但我希望接口純粹返回一個包含任何失敗信息的標準響應對象。
所以這意味着你需要定義一個自定義的Fault Exception,當你接收到的請求在反序列化之前驗證失敗時,你可以拋出異常並且在請求成功時發送第二個標準響應。
那是正確的做法?我試圖在AfterReceiveRequest()中作弊並設置請求對象爲null,所以它跳過了處理請求的過程。爲了實現我的目標,簡單地返回一個單一的響應對象。
object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
try
{
validateMessage(ref request);
}
catch (Exception e)
{
request = null;
return new FaultException<string>(e.Message);
}
return null;
}
然後也許我可以在BeforeSendReply()中創建自己的自定義響應對象。
void IDispatchMessageInspector.BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
if (correlationState != null)
{
reply = CreateMyOwnResponse(((FaultException) correlationState));
}
}
但我知道這似乎很愚蠢,並且正在反對WCF如何最有可能被使用。有什麼方法可以很好地實現我想要做的事情嗎?當事情變糟時,我必須發送異常類型,並在事情成功時發送不同的「正常」響應。
感謝kroonwijk!我想我應該改變我的問題,特別是在使用IDispatchMessageInspector.AfterReceiveRequest的情況下,在對數據庫進行反序列化並調用我的操作之前驗證請求XML。如果此時發生XML驗證錯誤,我該如何返回您的ReturnValue類而不是拋出異常?這是我應該做的事嗎? – TerryB