2016-09-19 18 views
1

私は名前付きパイプDuplex WCFサービスを開発中です。Byte []/namedPipe WCFのストリームにエラーが発生しました

基本的なことについては、クライアントとサーバーは問題なく通信しています。サーバーは、文字列を送信しているクライアントにコールバックすることができ、何の問題もありません。 しかし、私はそれがバイト[]またはストリームでビットマップを送信したい場合、すべてがフォールトしています。バイト[]が動作していないため、ストリームを使用しようとしました... サーバ側では、バイト[] /ストリームが問題なく生成されます。 しかし、サーバがバイト[] /ストリームをクライアントに送るとき、バイト[] /ストリームが空であればそれは通過しますが、データがあるときはフォールトしています。

私はすでにWCFの古典的な問題であることがわかっているので、私はすべての設定をチェックして、大きなバッファ/メッセージ/プールサイズ/文字列コンテンツ/文字列/バイト幅/サイズ/長さを設定しようとしました。

ここには、私のWCF設定ファイルの主要部分のC/Pがあります。ここで

<?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 

私はすべてを置くことはありませんが、これは大きすぎます。

これは私がキヤノンのデジタルカメラからのストリームを取得し、それはバイト[146242]の周りにある

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 
} 

それを使用する方法です。私はバイト[10]を送るときに動作します。 サイズの問題でなければなりません。設定ファイルで何かが見逃してしまったと思います...

また、私のサービスのscvclogファイルを見て、発生の詳細を見てみましたフォールト例外。 しかし、まあ... 1行に50k文字以上ありません。これは読めるわけではありません。

ありがとうございます。

答えて

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

ありがとうございました!私はこれを逃すことができないか分からない.... –

関連する問題