4

Silverlight クライアント バージョン 4.0.50917.0 および SDK バージョン 4.0.50826.1 を実行しています。

wcf pollingduplex バインディングに対して単純な Silverlight クライアントを作成しました。

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" />

</system.serviceModel>

私の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))

innerchannel のイベント ハンドラーに障害が発生しました。

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

...

void InnerChannel_Faulted(object sender, EventArgs e)
    {
        
        Dispatcher.BeginInvoke(() =>
        { status.Text += "Inner channel Faulted\n\n"
        }
    } 

上記を使用すると、Client.InnerChannelFaulted イベントが1 つ 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))

別名、ポーリング フィドラーごとに 1 つのメッセージはserverPollTimeout、新しいポーリングが開始されるたびにチャネルに障害が発生していないことを明らかにします。

ここで何が問題なのですか?

編集:

http://social.msdn.microsoft.com/Forums/en/wcf/thread/1e6aa407-4446-4d4a-8dac-5392250814b8http://forums.silverlight.net/forums/p/200659/468206を読みました.aspx#468206 と私は、「singleMessagePerPoll」がまともな回避策ではないことに同意します。私のバージョンでわかるように、SDK と開発者ランタイムの最新バージョンを実行しています。

EDIT2:

IE8 の代わりに Google Chrome をブラウザーとして使用すると、MultipleMessagesPerPoll が正常に動作することがわかりました。私には、これはランタイムと ie8 のバグのようなにおいがしますか?

EDIT3:

Silverlight WS ブログで確認済み: リンク

4

2 に答える 2

3

同じ SDK とクライアント バージョンを使用して、サンプルで問題を確認しました。

この問題は、他のブラウザーにもいくつかの影響を及ぼします。MultipleMessagePerPoll は、それらのブラウザーでも正しく動作しないように思われます (Fiddler と Firebug は、SingleMessagePerPoll によく似たものを示しています)。

ただし、クライアントのネットワーク スタックを使用して (ブラウザーのネットワーク スタックをバイパスして)、動作させることができました。ただし、この場合は Cookie を手動で設定する必要があるため、このソリューションは完璧にはほど遠いものです。アプリケーションによっては、煩わしい場合もあれば、問題にならない場合もあります。

クライアント スタックを介してすべての http 要求を実行するには、サービス呼び出しを開始する前にこれを使用します。

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

ただし、必要に応じて、もう少し具体的にすることもできます。

誰かがもっと満足のいく答えを持っているなら、私はそれを読んでうれしいです. 問題の再現に興味がある場合は、古い Tomek サンプルを修正して、SL3 の SingleMessagePerPoll の代わりに SL4 で MultipleMessagePerPoll を使用するようにしました。

于 2010-11-20T13:25:55.613 に答える