2

Streamed TransferMode で NetTcpBinding を使用しています。コールバックをデュプレックスとして実行しようとしましたが、エラー メッセージが表示されました。Streamed TransferMode で NetTcpBinding を使用し、(二重) コールバック サービス コントラクトを使用することは可能ですか? 背景: - 高速であり、nat の問題がないため、NetTcpBinding を使用します。 - 大きなファイルも転送するため、ストリーミング モードを使用します。

設定:

 <netTcpBinding>
    <binding name="DuplexBinding" transferMode="Streamed"
                closeTimeout="00:10:00"  openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"  transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="104857600" maxReceivedMessageSize="104857600"
             >
      <readerQuotas maxDepth="104857600" maxStringContentLength="104857600" maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600"/>
      <reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00"/>
      <security mode="None" />
    </binding>
  </netTcpBinding>

その契約:

IMyDataService.cs

   [ServiceContract(CallbackContract = typeof(INotifyCallback))]
    public interface IMyDataService
    {
        [OperationContract(ProtectionLevel = System.Net.Security.ProtectionLevel.None)]
        [FaultContract(typeof(MyFaultException))]
        [FaultContract(typeof(MyUserAlreadyLoggedInFaultException))]
        [FaultContract(typeof(AuthorizationFaultException))]
        Guid Authenticate(Guid clientID, string userName, string password, bool forceLogin);
    }


INotifyCallback.cs

    public interface INotifyCallback
    {
        [OperationContract(IsOneWay = true)]
        void ShowMessageBox(string message);
    }

transferMode="Streamed" を設定するとエラーが発生します

コントラクトには Duplex が必要ですが、Binding 'NetTcpBinding' は Duplex をサポートしていないか、サポートするように正しく構成されていません。

誰もが提案できます ありがとう

4

1 に答える 1

1

クライアント コードで、DuplexChannelFactoryを使用してサーバーへのチャネルを作成していることを確認します。

INotifyCallback callbackObject = new NotifyCallbackImpl(); //your concrete callback class
var channelFactory = new DuplexChannelFactory<IMyDataServce>(callbackObject); //pick your favourite constructor!
IMyDataService channel = channelFactory.CreateChannel();
try {
    var guid = channel.Authenticate(....);
    //... use guid...
} finally {
    try {
        channel.Close();
    } catch (Exception) {
        channel.Abort();
    }
}

[編集] 自動生成されたサービス参照のプロキシは、DuplexClientBaseを拡張する必要があります。

于 2012-08-25T09:13:54.803 に答える