Обработка исключений службы WCF с поддержкой Silverlight - PullRequest
1 голос
/ 26 июля 2011

У меня настроена веб-служба WCF с поддержкой Silverlight, и я подключаюсь к ней из своего приложения Silverlight.

Служба не написана с использованием шаблона ASync, но Silverlight автоматически генерирует асинхронные методы.

У меня есть метод, который в моем сервисе может вызвать исключение, я могу поймать это исключение, но я не уверен в лучшем способе обработки этого исключения, я заметил, что аргументы события завершены Метод содержит свойство ошибки.

Можно ли установить значение этого свойства ошибки?

Пример метода

public class service
{
    [OperationContract]
    public Stream getData(string filename)
    {
        string filepath = HostingEnvironment.MapPath(filename);
        FileInfo fi = new FileInfo(filenpath);

        try
        {
            Stream s = fi.Open(FileMode.Open);

            return s;
        }
        catch (IOException e)
        {
            return null;
        }
    }
}

Код Silverlight

btnFoo_Click(object sender, RoutedEventArgs e)
{
   ServiceClient svc = new ServiceClient();

   svc.getDataCompleted += new EventHandler<getDataCompletedEventArgs>(getData_Completed);
   svc.getDataAsync("text.txt");
}

void getData_Completed(object sender, getDataCompletedEventArgs e)
{
   e.Error //how can i set this value on the service?
}

Наконец, если служба находится в автономном режиме или время ожидания истекло, есть ли способ перехватить это исключение, прежде чем оно достигнет метода UnhandledException в App.xaml?

Спасибо

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Поскольку silverlight использует сервисы асинхронно, вы не получаете синхронный выброс исключения, а вместо этого он сохраняется в свойстве e.Error, что вам необходимо проверить в методе ServiceCallCompleted.

Чтобы ответить на ваш вопрос

как я могу установить это значение на сервисе?

Просто сгенерируйте исключение на сервере, и этого может быть достаточно, учитывая несколько других условий.

Возможно, вы захотите ввести FaultContract в свой метод службы WCF и выбросить FaultException<T>, который является распространенным способом устранения ошибок в WCF.

Однако результат ошибки в коде возврата 500 и silverlight не смогут получить ответ с таким кодом состояния и получить доступ к объекту Fault, даже если вы добавите этот атрибут в службу.

Эту проблему можно решить, используя несколько подходов.

  • Использование альтернативного стека HTTP-клиента : Вы можете зарегистрировать альтернативный стек HTTP с помощью метода RegisterPrefix. Ниже приведено описание того, как это сделать. Silverlight 4 предоставляет возможность использования клиентского стека HTTP, который, в отличие от стандартного стека HTTP браузера, позволяет обрабатывать SOAP-совместимые сообщения об ошибках. Однако потенциальная проблема перехода на альтернативный стек HTTP заключается в том, что информация, хранящаяся в браузере (например, файлы cookie для аутентификации), больше не будет доступна для Silverlight, и, следовательно, некоторые сценарии, включающие безопасные службы, могут перестать работать или потребовать дополнительный код для работы .
  • Изменение кода состояния HTTP : вы можете изменить свой сервис так, чтобы он возвращал ошибки SOAP с кодом состояния HTTP 200, Silverlight 4, чтобы ошибки успешно обрабатывались. Как это сделать, описано ниже. Обратите внимание, что это сделает службу несовместимой с протоколом SOAP, поскольку для SOAP требуется код ответа в диапазоне 400 или 500 для ошибок. Если служба является службой WCF, вы можете создать поведение конечной точки, которое включает инспектор сообщений, который изменяет код состояния на 200. Затем вы можете создать конечную точку специально для потребления Silverlight и применить ее поведение там. Другие ваши конечные точки по-прежнему будут соответствовать требованиям SOAP.

Неисправности в Silverlight

0 голосов
/ 18 августа 2012

Создание и обработка ошибок в Silverlight

OR


    [DataContract]
    public class MyError
    {
        [DataMember]
        public string Code { get; set; }
        [DataMember]
        public string Message { get; set; }
        [DataMember]
        public DateTime Time { get; set; }
    }


public class service
{
    [OperationContract]
    public Stream getData(string filename, out MyError myError)
    {
        myError = null;
        string filepath = HostingEnvironment.MapPath(filename);
        FileInfo fi = new FileInfo(filenpath);

        try
        {
            Stream s = fi.Open(FileMode.Open);
            return s;
        }
        catch (IOException e)
        {
            myError = new MyError() { Code = "000", Message = ex.Message, Time = DateTime.Now };
            return null;
        }
    }
}

Желаю успешных проектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...