Программная настройка Exception-отправки в WCF
Я хотел бы, чтобы мой клиент Silverlight мог отображать исключения, которые произошли на сервере во время вызова WCF.
Учитывая мой текущий код для создания канала WCF (на клиенте):
// create the binding elements
BinaryMessageEncodingBindingElement binaryMessageEncoding = new BinaryMessageEncodingBindingElement();
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement() { MaxBufferSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue };
// add the binding elements into a Custom Binding
CustomBinding customBinding = new CustomBinding(binaryMessageEncoding, httpTransport);
// create the Endpoint URL
EndpointAddress endpointAddress = new EndpointAddress(serviceUrl);
// create an interface for the WCF service
ChannelFactory<TWcfApiEndPoint> channelFactory=new ChannelFactory<TWcfApiEndPoint>(customBinding, endpointAddress);
channelFactory.Faulted += new EventHandler(channelFactory_Faulted);
TWcfApiEndPoint client = channelFactory.CreateChannel();
return client;
Когда возникает исключение, я просто получаю исключение NotFound, которое, очевидно, бесполезно. Как я могу получить информацию об исключении?
Я использую этот код для использования объекта клиента, возвращенного выше:
try
{
// customFieldsBroker is the client returned above
customFieldsBroker.BeginCreateCustomField(DataTypeID, newCustomField, (result) =>
{
var response = ((ICustomFieldsBroker)result.AsyncState).EndCreateCustomField(result);
}, customFieldsBroker);
}
catch (Exception ex)
{
// would like to handle exception here
}
Заключение вызовов Begin/End в блок try { } catch { }, похоже, даже не попадает в блок catch {}.
Если это имеет значение, я использую Silverlight 3 на клиенте.
2 ответа
Из-за ограничений безопасности в изолированной программной среде браузера silverlight не может видеть тело ошибок сервера (код состояния 500). Чтобы это работало, вам нужно внести изменения на стороне сервера, чтобы изменить способ возврата ошибок браузеру. Есть статья MSDN, которая описывает это подробно.
Вам нужно сделать две вещи:
- объявить исключение неисправности как часть контракта
выбросить исключение как исключение ошибки
[OperationContract]
[FaultContract (TypeOf (ArithmeticFault))]
public int Calculate (Операция op, int a, int b)
{//...}
бросить новое FaultException();