Внутренний канал Silverlight PollingDuplex с ошибкой множественного сообщенияPerPoll (serverPollTimeout) - PullRequest
4 голосов
/ 15 ноября 2010

Я использую клиент Silverlight версии 4.0.50917.0 и SDK версии 4.0.50826.1

Я создал простой клиент Silverlight для привязки wcf pollingduplex:

Web.config:

<system.serviceModel>
<extensions>
  <bindingExtensions>
    <add name="pollingDuplexHttpBinding"
        type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </bindingExtensions>
</extensions>
<behaviors>
  <serviceBehaviors>
    <behavior name="sv">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceThrottling maxConcurrentSessions="2147483647"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

<bindings>
  <!-- Create the polling duplex binding. -->
  <pollingDuplexHttpBinding>
    <binding name="multipleMessagesPerPollPollingDuplexHttpBinding"
             duplexMode="MultipleMessagesPerPoll"
             maxOutputDelay="00:00:01"/>

    <binding name="singleMessagePerPollPollingDuplexHttpBinding"
             maxOutputDelay="00:00:01"/>
  </pollingDuplexHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="sv" name="Backend.GUIPollingService">
    <endpoint address="" binding="pollingDuplexHttpBinding" bindingConfiguration="singleMessagePerPollPollingDuplexHttpBinding"
      contract="Backend.IGUIPollingService" />
    <endpoint address="mmpp" binding="pollingDuplexHttpBinding" bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding"
      name="multimessage" contract="Backend.IGUIPollingService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

Мой клиент Silverlight подключается следующим образом:

 string endPointAddress2 = "http://"
          + App.Current.Host.Source.DnsSafeHost
          + ":"
          + App.Current.Host.Source.Port.ToString(CultureInfo.InvariantCulture)
          + "/GUIPollingService.svc/mmpp";
 this.client = new GUIClientProxy.GUIPollingServiceClient(
        new PollingDuplexHttpBinding(PollingDuplexMode.MultipleMessagesPerPoll), 
        new EndpointAddress(endPointAddress2))

Я получил обработчик событий для внутреннего канала, неисправного:

client.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted);

...

void InnerChannel_Faulted(object sender, EventArgs e)
    {

        Dispatcher.BeginInvoke(() =>
        { status.Text += "Inner channel Faulted\n\n"
        }
    } 

При использовании вышеуказанного событие Client.InnerChannelFaults наступает точно после one serverPollTimeout.(по умолчанию 15 секунд, проверено с помощью Fiddler)

Если я переключаю свой клиент для подключения следующим образом:

string endPointAddress2 = "http://"
          + App.Current.Host.Source.DnsSafeHost
          + ":"
          + App.Current.Host.Source.Port.ToString(CultureInfo.InvariantCulture)
          + "/GUIPollingService.svc";
 this.client = new GUIClientProxy.GUIPollingServiceClient(
        new PollingDuplexHttpBinding(), 
        new EndpointAddress(endPointAddress2))

или одно сообщение для каждого опроса Fiddler показывает, что после каждого serverPollTimeout новый опросзапущен и канал не неисправен.

Есть идеи, что здесь не так?

РЕДАКТИРОВАТЬ:

Я прочитал http://social.msdn.microsoft.com/Forums/en/wcf/thread/1e6aa407-4446-4d4a-8dac-5392250814b8 иhttp://forums.silverlight.net/forums/p/200659/468206.aspx#468206 и я согласен с тем, что «singleMessagePerPoll» не является достойным решением.Как вы можете видеть из моих версий, я использую самые последние версии SDK и среды разработки.

EDIT2:

Я только что узнал, что если я использую Google Chrome в качестве браузера вместо IE8MultipleMessagesPerPoll работает отлично!Для меня это пахнет как среда выполнения и ошибка ie8?

EDIT3:

Подтверждение в блоге silverlight WS: http://blogs.msdn.com/b/silverlightws/archive/2010/12/15/pollingduplex-using-multiplemessagesperpoll-issue-in-latest-sl4-gdrs.aspx

Ответы [ 2 ]

3 голосов
/ 20 ноября 2010

Я подтверждаю проблему в примере с теми же версиями SDK и клиента.

Эта проблема имеет и другие последствия для других браузеров: у меня сложилось впечатление, что MultipleMessagePerPoll, похоже, работает неправильнона них тоже нет (Fiddler и Firebug показывают нечто, очень похожее на SingleMessagePerPoll)

Однако я мог бы заставить его работать, используя сетевой стек клиента (минуя сетевой стек браузера).Однако это решение далеко от совершенства, так как в этом случае куки-файлы должны быть установлены вручную.Это может быть раздражающим или не проблема в зависимости от вашего приложения.

Чтобы выполнить все запросы http через стек клиента, используйте это перед тем, как начать свои сервисные вызовы:

HttpWebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

Выоднако, может быть немного более конкретным, в зависимости от ваших потребностей.

Если у кого-то есть более удовлетворительный ответ, я был бы рад прочитать его.Если вы заинтересованы в воспроизведении проблемы, я изменил старый пример Tomek для использования MultipleMessagePerPoll на SL4 вместо SingleMessagePerPoll на SL3.

1 голос
/ 15 февраля 2014

Эта проблема может быть вызвана добавлением global.asax на веб-сайт хостинга.Добавление сеансов на сайт хостинга, по-видимому, приводит к сбоям в дуплексном сервисе wcf.Я боролся с этой проблемой в течение нескольких дней, и, просто удалив файл global.asax с веб-сайта хоста, зависание службы исчезло.Множественные сообщения perpoll были ложным следом.Это работает нормально.

См. Это подробнее:

Как только что добавленный файл global.asax может испортить мою службу WCF

...