клиент Silverlight не понимает ошибки - PullRequest
3 голосов
/ 28 января 2011

У меня есть служба WCF, которая выдает исключение, которое я безуспешно пытаюсь перехватить в своем клиентском коде Silverlight.Я использую необъявленные ошибки в целях отладки, и это мой метод обслуживания:

[OperationContract]
public ServiceResponse MyWCFServiceMethod()
{
  ServiceResponse resp = new ServiceResponse ();
  //code for setting resp...

  //purposely throw error here.
  throw new FaultException(new FaultReason(new FaultReasonText("My fault Reason!")),new FaultCode("my fault code here"));
  return resp;
}

Теперь в моей модели представления клиента Silverlight, в методе обратного вызова службы, я пытаюсь обработать это следующим образом:

private void MyServiceCallback(MyWCFServiceMethodCompletedEventArgs e)
{
   if (e.Error == null)
   {
       //proceed normally
   }
   else if (e.Error is FaultException)
   {
      FaultException<ExceptionDetail> fault = e.Error as FaultException<ExceptionDetail>;
      MessageBox.Show(fault.Detail.Message);
      MessageBox.Show(fault.Reason.ToString());
   }
} 

в этой строке else if (e.Error is FaultException) Я все еще получаю System.Net.WebException {Удаленный сервер возвратил ошибку: NotFound.}

Это записи конфигурации

<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />

Это объявление класса обслуживания

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MySilverlightWCFService
{
 ....

Этот сервис находится в другом проекте в том же решении Silverlight.Почему мой клиент Silverlight не может получить исключение по вине, которое я генерирую?

Спасибо за ваше время ...

Ответы [ 3 ]

7 голосов
/ 30 января 2011

хорошо, так что, наконец, кажется, что способ сделать эту работу - добавить одну строку кода в службу непосредственно перед тем, как вы сгенерируете исключение ошибки!

System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;

Затем сгенерируйте действительное исключение

throw new FaultException(new FaultReason(new FaultReasonText("My fault Reason!")),new FaultCode("my fault code here"));

Затем в silverlight измените раздел обработки ошибок обратного вызова службы из того, что я поставил в моем вопросе выше:

   //else if (e.Error is FaultException)
   else
   {
      //FaultException<ExceptionDetail> fault = e.Error as FaultException<ExceptionDetail>;
      //MessageBox.Show(fault.Detail.Message);
      FaultException fault = e.Error as FaultException;
      MessageBox.Show(fault.Reason.ToString());
   }

Это сработало для меня.Гадкий путь!

Я попробую с Заявленные ошибки, когда у меня будет время.

3 голосов
/ 01 марта 2012

Проверьте SilverlightFaultBehavior .Он будет обрабатывать изменение кода статуса для вас.

2 голосов
/ 28 января 2011

Сервер, вероятно, выдает код ответа HTTP 500, который Silverlight игнорирует. Вы должны изменить службу, чтобы вернуть HTTP-код, который будет принимать Silverlight.

Из Производительность данных и стратегии обработки ошибок в Silverlight 3 : (В этой статье показано, как вернуть ошибки WCF в Silverlight.)

Печально известная не найденная ошибка: Когда возникает исключение, HTTP статус код 500 возвращается Silverlight. Браузерная сеть стек предотвращает Silverlight от чтение ответов с кодом состояния 500, так что любая информация о сбое SOAP содержится внутри недоступен для Клиентское приложение Silverlight. Четное если сообщение может быть получено, Silverlight 2 не способен преобразование ошибки обратно в управляемое исключение Обе эти вопросы были решены в Silverlight 3.

...