1

我有一个服务器应用程序,它执行另一个应用程序,第二个应用程序构建一个日志文件,我希望服务器通过 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 回答