Ошибка WCF при возврате к обратному вызову клиента с использованием NetTcpBinding

У меня есть служба WCF, использующая NetTcpBinding TransferMode.Streamed, я ищу поток обратно к клиенту с помощью его обратного вызова, но я получаю это исключение на линии 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);
}

Как бы я передать поток для обратного вызова клиента?

1 ответ

Ваш контракт на IScreenShot не полностью односторонний. Это должно быть для дуплексного контракта с односторонним движением в одном направлении, а также односторонним движением в другом.

Тем не менее, потоковая передача и дуплекс вообще не смешиваются из-за внутренней механики, которая требует буферизации сообщений. Так что это не будет работать в любом случае.

Чтобы этот сценарий работал в дуплексном режиме, вы должны разделить данные на куски byte[] разумного размера и передавать их в виде кусков, а не в виде потоков. Вы можете сделать этот контракт похожим на запись потока Stream или даже обернуть экземпляр контракта в прокси-оболочку, полученную из Stream, на стороне отправки, чтобы он выглядел почти одинаково для любого, кто заполняет поток.

Другие вопросы по тегам