2016-09-19 5 views
1

Я занимаюсь разработкой службы двунаправленного WCF namedpipe.Байт []/поток через namedPipe WCF сбой

Для основных вещей клиент и сервер общаются без проблем. Сервер может перенаправить клиент, отправляющий ему строки, и он делает это без каких-либо проблем. Но, когда я хочу, чтобы он отправил растровое изображение с байтом [] или потоком, все виновато. Просто заметьте, я попытался использовать поток, потому что байт [] не работает ... На стороне сервера байт []/поток генерируется без проблем. Но когда сервер отправляет байту []/stream клиенту, если байт []/stream пуст, он проходит, но когда он имеет данные, он неисправен.

Я уже проверил все свои конфигурации и попытался установить большой буфер/сообщение/poolize/stringcontent/arraylenght/byteperread/любой размер/длина, потому что я знаю, что это классическая проблема в WCF.

Ниже приведена C/P основной части моего файла конфигурации WCF.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
    <compilation debug="true"/> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <netNamedPipeBinding> 
     <binding name="NamedPipeBinding_ICameraService" closeTimeout="00:05:00" openTimeout="00:20:00" receiveTimeout="00:20:00" sendTimeout="00:20:00" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" maxConnections="10" maxBufferPoolSize="500000000" maxBufferSize="500000000" maxReceivedMessageSize="500000000"> 
      <readerQuotas maxDepth="32" maxStringContentLength="500000000" maxArrayLength="500000000" maxBytesPerRead="500000000" maxNameTableCharCount="500000000"/> 
      <security mode="Transport"/> 
     </binding> 
     </netNamedPipeBinding> 
    </bindings> 
    <services> 
     <service name="EOSDigital.CameraService" behaviorConfiguration="MEX"> 
     <endpoint address="net.pipe://localhost/EOSDigital/CameraService" binding="netNamedPipeBinding" bindingConfiguration="NamedPipeBinding_ICameraService" contract="EOSDigital.ICameraService"/> 

     <endpoint address="net.pipe://localhost/EOSDigital/CameraService/mex" binding="mexNamedPipeBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MEX"> 
      <serviceMetadata httpGetEnabled="False"/> 
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Вот контракт на обслуживание обратного

[ServiceContract] 
public interface ICameraServiceCallBack 
{ 
    [OperationContract(IsOneWay = true)] 
    void CallBackFunction(string str); 

    [OperationContract(IsOneWay = true)] 
    void LiveviewUpdated(byte[] img); 
} 

А вот заявление моего контракта службы.

[ServiceContract(CallbackContract = typeof(ICameraServiceCallBack))] 
public interface ICameraService 

Я не стану все, это слишком громоздко.

Это, как я использую его

private void CurrentCamera_LiveViewUpdated(object sender, Stream img) 
{ 
    MemoryStream data = new MemoryStream(); 
    img.CopyTo(data); 

    _callback = OperationContext.Current.GetCallbackChannel<ICameraServiceCallBack>(); 

    _callback.CallBackFunction("this is a test"); // ok 

    _callback.LiveviewUpdated(data.ToArray()); //Faulted 
} 

Я получаю поток от цифровой камеры Canon и вокруг байта [146242]. Когда я отправляю байт [10], он работает. Должно быть, проблема с размером, и я думаю, что я что-то пропустил в файле конфигурации ...

Я также попытался сгенерировать и посмотреть в файл scvclog моего сервиса, чтобы увидеть некоторые детали происходящего ошибочное исключение. Но, ну ... В одной строке есть не менее 50 тыс. Символов. Это невозможно прочитать.

Спасибо.

ответ

1

Проверьте конфигурацию вашего клиента WCF. Конфигурация вашего клиента должна иметь тот же netNamedPipeBinding, что и ваш хост.

Помещенный, что в файле конфигурации клиента

<netNamedPipeBinding> 
    <binding name ="duplexEndpoint" closeTimeout="00:05:00" openTimeout="00:20:00" receiveTimeout="00:20:00" sendTimeout="00:20:00" transactionProtocol="OleTransactions" 
      hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="50000000" maxBufferSize="50000000" maxConnections="10" maxReceivedMessageSize="50000000"> 
    <readerQuotas maxDepth="32" maxStringContentLength="50000000" maxArrayLength="50000000" maxBytesPerRead="50000000" maxNameTableCharCount="50000000"/> 
    </binding> 
</netNamedPipeBinding> 

Это должны быть помещены ниже кронштейна serviceModel.Bindings.

Затем связать конфигурацию в конечной точке кронштейна

bindingConfiguration="duplexEndpoint" 

Это должно делать то, что вы ожидали.

+0

Спасибо! Я не знаю, как я мог это пропустить .... –