私は名前付きパイプ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文字以上ありません。これは読めるわけではありません。
ありがとうございます。
ありがとうございました!私はこれを逃すことができないか分からない.... –