0

NetTcpBinding TransferMode.Streamedを使用するWCFサービスがあり、そのコールバックを使用してクライアントにストリームバックしようとしていますが、次の行でこの例外が発生しますhost.Open

Contract requires Duplex, but Binding 'NetTcpBinding' doesn't support it or isn't configured properly to support it.

 ServiceHost host;
    public Form1()
    {
        InitializeComponent();
    }   
    private void button1_Click(object sender, EventArgs e)
    {
        Uri baseAddress = new Uri(string.Format("net.tcp://{0}:1991/service", Dns.GetHostName()));
        host = new ServiceHost(typeof(WCF_Server.MainService), baseAddress);
        host.Open();
    }

サービスインターフェース:

[ServiceContract(CallbackContract = typeof(IScreenCallback))]
public interface IScreenShot
{
    [OperationContract]
    Stream GetStream(int formatIndex);

    [OperationContract]
    void ShowGallery();
    [OperationContract]
    void CloseGallery();

    [OperationContract]
    void AddImage(Stream stream);
}

public interface IScreenCallback
{
    [OperationContract]
    void NextImage();

    [OperationContract]
    void PrevImage();

    [OperationContract]
    void AddImageClient(Stream stream);
}

ストリームをクライアントコールバックに渡すにはどうすればよいですか?

4

1 に答える 1

1

IScreenShot契約は完全に一方向ではありません。それは、一方向に一方向であり、他の方向にも一方向である二重契約のためである必要があります。

とは言うものの、メッセージをバッファリングする必要がある内部メカニズムのため、ストリーミングとデュプレックスはまったく混ざりません。したがって、これはとにかく機能しません。

このシナリオをデュプレックスモードで機能させるには、データを適切なサイズのbyte []チャンクに分割し、ストリームとしてではなくチャンクで転送する必要があります。そのコントラクトをStreamの書き込みのように見せたり、コントラクトのインスタンスを送信側のStreamから派生したプロキシラッパーでラップしたりして、ストリームにデータを入力する人とほとんど同じように見せることができます。

于 2012-05-16T20:38:04.503 に答える