1

私はこのトピックに関して半分答えられたままになっているいくつかの質問を見てきました。NetTcpBindingを使用する自己ホスト型WCFアプリケーションに要求を送信したいと思います。問題は、ソケットを使用する必要があるということです。

TcpListener(ChannelListener OnOpen上)を開くトランスポートバインディング要素を作成しました。これは正常に機能しますが、その場合は、独自のメッセージフレーミングモデルを使用する必要があります。

明らかに、net.tcpメッセージフレーミングモデルを実装するつもりはありません(http://msdn.microsoft.com/en-us/library/ff470920%28v=prot.10%29.aspx

私は私を示唆するいくつかの投稿( http://blogs.msdn.com/b/carlosfigueira/archive/2008/01/13/writing-custom-requests-to-simple-wcf-services.aspxを含む)を読みましたリクエストを送信し、MessageEncoder/MessageInspectorを介して送信されたバイトを解釈する必要があります。

このようにして、基本的に、メソッド/操作ごとにメッセージを作成できます(リクエストごとに小さな変更を加えます)

このメソッドを試しましたが、(ChannelFactoryからの)WCFチャネルを使用したときに、(カスタムMessageEncoderを使用して)問題のバイトを取得しました。

私はそれらのバイトを保存し、TcpClientを介して送信しました-MessageEncoderは起動しませんでした。

通常のチャンネルを開くと:

        ChannelFactory<ITestService> factory = new ChannelFactory<ITestService>(new    NetTcpBinding(),
            "net.tcp://localhost:76599");

        factory.CreateChannel().DoSomething(string.Empty); //gets to MessageEncoder

ソケットを介して同じことを試してみると:

        TcpClient cli = new TcpClient("localhost", 76599);

        byte[] fileArray = File.ReadAllBytes("c:\\fileFromMessageEncoder.bin");
        cli.GetStream().Write(fileArray, 0, fileArray.Length); // Does not get to MessageEncoder

何か案は?

4

1 に答える 1

0

ついにそれが機能するようになりました。
MessageEncoderを介して取得したバイトを送信する前に、Net.Tcp接続のデフォルトのハンドシェイクを開始しました。

エンドポイントURIはUTF-8でエンコードされている必要があることに注意することが重要です。

プロセスは非常に簡単です。ネゴシエーション要求を送信し、プリアンブル終了メッセージ(0x0C)を送信し、サーバーがプリアンブル確認メッセージ(0x0B)を返すのを待ちます。

次に、バイナリエンベロープを送信し、WCFアプリケーションからの応答を受信できます。

この投稿が将来誰かに役立つことを願っています。

NegotiationConsts.Via via = new NegotiationConsts.Via(uri);
int arraySize = via.EndpointString.Length + 
NegotiationConsts.DefaultRequestLength;

byte[] request = new byte[arraySize];

int count = 0;
request[count++] = NegotiationConsts.Version.RECORD_TYPE;
request[count++] = NegotiationConsts.Version.MAJOR_VERSION;
request[count++] = NegotiationConsts.Version.MINOR_VERSION;

request[count++] = NegotiationConsts.Mode.RECORD_TYPE;
request[count++] = NegotiationConsts.Mode.DUPLEX;

request[count++] = NegotiationConsts.Via.RECORD_TYPE;
request[count++] = via.Length;
via.EndpointString.CopyTo(request,count);
count+=via.EndpointString.Length;

request[count++] = NegotiationConsts.WCFEncoding.RECORD_TYPE;
request[count++] = NegotiationConsts.WCFEncoding.BINARY_ENCODING;

return request;
于 2012-09-08T15:01:10.660 に答える