Служба Silverlight 3 WCF `CommunicationException` Сервер вернул ошибку: NotFound - PullRequest
5 голосов
/ 01 декабря 2009

У меня есть приложение Silverlight 3, которое 95% времени успешно запрашивает данные из службы WCF (в том же веб-приложении) и отображает их.

Это случается нечасто, обычно, если я быстро обращаюсь к службе несколько раз, но иногда это происходит по одиночному запросу.

Время от времени, если я запрашиваю много транзакций за короткий период, я получаю одно из двух исключений, оба они происходят в файле Reference.cs в EndMyMethod(System.IAsyncResult result).

Существует несколько методов, и исключения существуют для любого их числа. Первый, это TimeoutException(), который я понимаю, и это имеет смысл, второй, который я совершенно не понимаю, это «CommunicationException() был не обработан кодом пользователя: удаленный сервер возвратил ошибку: NotFound».

Я поместил блоки try..catch как вокруг .MyMethodAsync(), так и в обработчике для MyMethodCompleted, но безрезультатно, поскольку исключение возникает в сгенерированном файле Reference.cs.

Любая помощь очень ценится.

обновление

Reference.cs - генерируется "Добавить ссылку на службу"

public System.IAsyncResult BeginTogglePicked(string ID, string toggle, System.AsyncCallback callback, object asyncState) 
{
   object[] _args = new object[2];
   _args[0] = ID;
   _args[1] = toggle;
   System.IAsyncResult _result = base.BeginInvoke("TogglePicked", _args, callback, asyncState);
   return _result;
}

public void EndTogglePicked(System.IAsyncResult result) 
{
   object[] _args = new object[0];
   // This is the line where the Exception is Thrown
   base.EndInvoke("TogglePicked", _args, result);
}

Код вызова - pickedIDs - это список строк, а userIDSelecting - строка, определенная в начале процедуры. Обработчик событий mdc_TogglePIckedCompleted в данный момент пуст.

MapDataClient mdc = new MyDataClient();
mdc.TogglePickedCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(mdc_TogglePickedCompleted);

foreach (string id in pickedIDs)
{
    mdc.TogglePickedAsync(id, userIDSelecting, mdc);
}

Обновление 2

Это "InnerException" от CommunicationException: System.Net.WebException: The remote server returned an error: NotFound.

Не уверен, что это может быть более полезным, поскольку он не дает никаких дополнительных подробностей. Как я уже сказал, это происходит периодически, не каждый раз, когда я вызываю метод обслуживания. Я также хотел бы отметить, что иногда один и тот же вызов будет работать, а другие - нет. Я начинаю думать, что эта проблема связана с тем, что IIS не отвечает на мои сервисные вызовы, мысли?

Обновление 3

Когда я имею в виду временное, я имею в виду истинного интриганта. Это может произойти только один раз в сеансе пользователя, и это может произойти только в одном из пятидесяти сеансов. Это не все или ничего ничего. Вызывающее приложение размещается на том же веб-сайте, что и служба WCF, поэтому я не думаю, что проблема заключается в clintaccesspolicy.xml, но я могу ошибаться.

Ответы [ 5 ]

4 голосов
/ 14 декабря 2009

Сообщение, которое вы получаете, вероятно, является красной сельдью: - (

Когда генерируются внутренние исключения службы WCF, они ВСЕГДА будут проявляться как Сервер не найден исключения в пользовательском интерфейсе Silverlight. Это потому, что ответ HTTP имеет тип 500. Лучшая статья, которую я прочитал об этом, была от Дэвида Бетца - http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2 (это было написано для SL2, но концепции по-прежнему верны для SL3. Кроме того, некоторые из его подходов предназначены для пуристов - например, «НИКОГДА», использующих функции Add Service Reference от VS - вам не обязательно следовать всем его советам ;-))

В любом случае, возвращаясь к вашему вопросу, вам нужно преобразовать тип ответа в 200 и проанализировать исключение в сообщении. Это можно сделать с помощью MessageInspector (в сервисе и приложении SL).

Некоторые из этих подходов могут показаться довольно устрашающими - потребуется некоторое время, чтобы понять это - концепция крайне важна для WCF <-> SL приложений, и она имеет смысл, как только вы получить это: -)

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

1 голос
/ 08 января 2010

Могу ли я порекомендовать всегда, всегда * Fiddler работает при работе с Silverlight и WCF?

0 голосов
/ 03 декабря 2009

Убедитесь, что у вас есть файл clientaccesspolicy.xml. В противном случае вы можете получить эту ошибку, поскольку файл политики не может быть найден.

0 голосов
/ 13 декабря 2009

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

После прочтения вашего поста ранее я продолжал искать информацию о клиентской политике и нашел ее (не помню где), но я использую ее, и теперь она отлично работает!

Надеюсь, что то же самое хорошо для вас :) В моем файле отсутствовали дополнительные детали в разделе разрешений.

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="http://*" />
        <domain uri="https://*" />

      </allow-from>


      <grant-to>
        <resource include-subpaths="true" path="/"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>
0 голосов
/ 03 декабря 2009

Ваш сервис возвращает клиенту подробности исключений? По умолчанию это не так. Вы можете добавить следующий атрибут в ваш класс обслуживания.

[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
public class MyService ...

Вы можете обнаружить, что получаете какое-то исключение на стороне сервера, которое невидимо для клиента.

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