我有使用IErrorHandler一組被包裝異常的SOAP Web服務的,具體是:WCF IErrorHandler到的FaultException返回SOAP和WebHttpException到POX和JSON的端點
public sealed class ErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
// don't wrap existing fault exceptions
if ((error is FaultException)) return;
// our basic service fault
var businessFault = new BusinessFault { FaultMessage = error.Message, FaultReference = "Internal" };
// Resource based faultReason
var faultReason = new FaultReason(Properties.Resources.BusinessFaultReason);
var faultcode = FaultCodeFactory.CreateVersionAwareSenderFaultCode(InternalFaultCodes.BusinessFailure.ToString(), Service.Namespace);
var faultException = new FaultException<BusinessFault>(
businessFault,
faultReason,
faultcode);
// Create message fault
var messageFault = faultException.CreateMessageFault();
// Create message using Message Factory method
fault = Message.CreateMessage(version, messageFault, faultException.Action);
}
}
我現在已經增加了額外的端點JSON和痘哪些工作正常,除非發生異常。在Json端點的情況下,FaultException作爲XML返回。
我知道從其他等職位,在靜止情況下,我會更好投擲WebHttpException:
throw new WebFaultException<BusinessFault>(detail, HttpStatusCode.BadRequest);
或者在ProvideFault重寫響應消息的屬性,即:
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
var rmp = new HttpResponseMessageProperty
{
StatusCode = System.Net.HttpStatusCode.BadRequest,
StatusDescription = "See fault object for more information."
};
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
但是,MSDN有一些關於WebHttpException的有趣評論,即:
當你唱一個WCF REST端點(WebHttpBinding和WebHttpBehavior或WebScriptEnablingBehavior),響應的HTTP狀態碼相應地設置爲 。但是,WebFaultException可以與非REST端點一起使用,其行爲與常規的FaultException類似。
當使用WCF REST端點時,序列化的 故障的響應格式與非故障響應的確定方式相同。有關WCF REST格式的更多 信息,請參閱WCF REST格式。
因此建議我需要轉換當前的ProvideFault方法以提供新的WebHttpException(包裝任何現有的Exception或FaultExceptions),然後SOAP仍然可以正常工作。
是否有人想刺探看起來像什麼(.Net4.0 btw)?我想要一個錯誤處理程序來統治它們!
我不明白你的問題。您是否想要爲JSON/POX/SOAP端點具有唯一的IErrorHandler實現? – Cybermaxs
@Cybermaxs正確。 WCF允許您將多個端點公開給不同類型的客戶端。這一切都很好,直到你需要提出錯誤。如果我(一般)提出SOAP錯誤,那麼HTTP客戶端將不會更聰明。如果我提出一個HTTP錯誤,那麼SOAP客戶端將被置於黑暗中。 – Junto