Mam zestaw webservices SOAP, które są zawijania wyjątki używając IErrorHandler, w szczególności:WCF IErrorHandler wrócić FaultException do SOAP i WebHttpException do POX i JSON punkty końcowe
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);
}
}
Mam teraz dodane dodatkowe punkty końcowe dla Json czy ospy które działają poprawnie, chyba że wystąpi wyjątek. W przypadku punktu końcowego Json wyjątek FaultException jest zwracany jako XML.
Zdaję sobie sprawę z drugiej tak stanowisk, które w przypadku odpoczynku będę lepiej rzuca WebHttpException:
throw new WebFaultException<BusinessFault>(detail, HttpStatusCode.BadRequest);
lub nadrzędnymi właściwości Komunikat odpowiedzi w ProvideFault, a więc:
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);
Jednak MSDN ma kilka interesujących uwag na temat WebHttpException, mianowicie:
Po śpiewać punkt końcowy REST WCF (WebHttpBinding i WebHttpBehavior lub WebScriptEnablingBehavior) kod statusu HTTP dla odpowiedzi jest ustawiony odpowiednio na . Jednak wyjątek WebFaultException może być używany z punktami końcowymi niebędącymi obiektami REST i zachowuje się jak zwykły wyjątek FaultException.
Podczas korzystania z punktu końcowego usługi WCF REST format odpowiedzi z serializowanego błędu jest określany w taki sam sposób, jak w przypadku odpowiedzi innej niż usterka. Aby uzyskać więcej informacji na temat formatowania REST WCF, zobacz Formatowanie REST WCF.
Byłoby zatem sugerować, że trzeba konwertować mój obecny sposób ProvideFault dostarczenia nowego WebHttpException (zawijania istniejące wyjątki lub FaultExceptions) i następnie SOAP będzie nadal działać, jak również.
Czy ktoś chciałby zabić kogoś, co by to wyglądało (.Net4.0 btw)? Chcę jedną procedurę obsługi błędów, aby rządzić nimi wszystkimi!
nie rozumiem twojego pytania. Czy chcesz mieć unikalną implementację IErrorHandler dla punktu końcowego JSON/POX/SOAP? – Cybermaxs
@Cybermaxs correct. WCF umożliwia prezentowanie wielu punktów końcowych dla różnych typów klientów. Wszystko działa dobrze, dopóki nie musisz podnosić błędów. Jeśli podniosę (ogólnie) błąd SOAP, wówczas klienci HTTP nie będą mądrzejsi. Jeśli zgłoszę usterkę HTTP, klienci SOAP zostaną pozostawieni w ciemności. – Junto