1

別のアプリをEXECするサーバーアプリケーションがあり、その2番目のアプリがログファイルを作成し、サーバーがそれをWCF経由でクライアントに送信するようにします。

EXECアプリがログを更新している間、クライアントにログを読み取らせたい。

ストリーム(ログファイル)を返す操作コントラクトを使用しました。問題は、最初にストリームを送信したとき、ログがまだ空であり、サーバーEXECが書き込んだ「更新」がクライアントに表示されないことです。

サーバーコードは次のとおりです。

    public Stream GetLog()
    {
        Stream stream = new FileStream(@"Log.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        return stream;
    }

サーバーからのEXECは、単に「Log.txt」ファイルに書き込んでいます。

クライアントコードは次のとおりです。

        public void SaveLog()
    {
        Stream stream = ServerProxy.GetLog();
        StreamWriter writer = new StreamWriter("NEWLog.txt");
        writer.AutoFlush = true;
        StreamReader reader = new StreamReader(stream);
        char[] buf = new char[100];
        int count = 0;
        while (count = reader.ReadBlock(buf, 0, 100) > 0)
        {
            writer.Write(buf, 0, count);
        }
        stream.Close();
        writer.Close();
    }

ログインリアルタイムでクライアントを更新するにはどうすればよいですか?

4

2 に答える 2

1

あなたのバインディングは間違っていると思います。あなたはあなたを設定する必要がありますtransferMode="Streamed"

そこで例を見つけることができます:

http://msdn.microsoft.com/en-us/library/ms751463.aspx

于 2013-02-10T19:10:52.823 に答える
0

いくつかの可能性があります。契約の変更はできますか?netTcpBinding のようなセッション アウェア バインディングを使用できる場合は、コントラクトを変更して、コールバックを使用して新しいログ データを公開するコールバック コントラクトを使用できます。

[ServiceContract]
public interface ILogCallback
{
    [OperationContract(IsOneWay = true)]
    void NewLog(string logString);
}

[ServiceContract(CallbackContract = typeof(ILogCallback))]
public interface ILog
{
    /// Call this method to sign up for future log messages, 
    /// which will be sent to the callback NewLog.
    [OperationContract]
    void SignMeUpForLogs();
}

どのような種類のバインディングを使用できますか? セッションは実行可能な代替手段ですか、それとも PerCall を使用する必要がありますか?

よろしく、フレドリック

于 2013-02-10T19:20:50.953 に答える