Внутренний канал Silverlight PollingDuplex с ошибкой множественного сообщения PerPoll (serverPollTimeout)
Я использую клиент 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 происходит точно после одного 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))
ака одно сообщение в опросе показывает, что после каждого serverPollTimeout
новый опрос начат, и канал не неисправен.
Есть идеи, что здесь не так?
РЕДАКТИРОВАТЬ:
Я прочитал http://social.msdn.microsoft.com/Forums/en/wcf/thread/1e6aa407-4446-4d4a-8dac-5392250814b8 и http://forums.silverlight.net/forums/p/200659/468206.aspx и я согласен с тем, что "singleMessagePerPoll" не является достойным решением. Как вы можете видеть из моих версий, я использую самые последние версии SDK и среды выполнения разработчика.
EDIT2:
Я только что узнал, что если я использую Google Chrome в качестве браузера вместо IE8, MultipleMessagesPerPoll работает отлично! Для меня это пахнет как ошибка времени выполнения против ie8?
EDIT3:
Подтверждено в блоге silverlight WS: http://blogs.msdn.com/b/silverlightws/archive/2010/12/15/pollingduplex-using-multiplemessagesperpoll-issue-in-latest-sl4-gdrs.aspx
2 ответа
Я подтверждаю проблему на примере с теми же версиями SDK и клиента.
Эта проблема имеет и другие последствия для других браузеров: у меня сложилось впечатление, что MultipleMessagePerPoll, похоже, не работает на них правильно (Fiddler и Firebug показывают что-то похожее на SingleMessagePerPoll)
Однако я мог бы заставить его работать с помощью клиентского сетевого стека (в обход сетевого стека браузера). Это решение, однако, далеко от совершенства, так как в этом случае куки-файлы должны быть установлены вручную. Это может быть раздражающим или не проблема в зависимости от вашего приложения.
Чтобы выполнить все http-запросы через стек клиента, используйте это перед тем, как начать сервисные вызовы:
HttpWebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
Вы можете, однако, быть немного более конкретным, в соответствии с вашими потребностями.
Если у кого-то есть более удовлетворительный ответ, я был бы рад прочитать его. Если вы заинтересованы в воспроизведении проблемы, я изменил старый пример Tomek для использования MultipleMessagePerPoll на SL4 вместо SingleMessagePerPoll на SL3.
Эта проблема может быть вызвана добавлением global.asax на веб-сайт хостинга. Добавление сеансов на хостинг-сайт, по-видимому, приводит к повреждению дуплексной службы wcf. Я боролся с этой проблемой в течение нескольких дней, и, просто удалив файл global.asax с веб-сайта узла, зависание в службе исчезло. Множественные сообщения perpoll были ложным следом. Работает нормально.
Смотрите это для более:
Как недавно добавленный файл global.asax может испортить мой сервис WCF?