Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF中写入文件时流式传输文件_C#_Wcf_File_Stream_Contract - Fatal编程技术网

C# 在WCF中写入文件时流式传输文件

C# 在WCF中写入文件时流式传输文件,c#,wcf,file,stream,contract,C#,Wcf,File,Stream,Contract,我有一个服务器应用程序执行另一个应用程序,第二个应用程序生成一个日志文件, 我希望服务器通过WCF将其发送到客户端 我希望客户端在EXEC应用程序更新日志时读取日志 我使用了一个返回流(日志文件)的操作契约。 问题是当我第一次发送流时,日志仍然是空的, 客户端看不到服务器执行器写入的“更新” 以下是服务器代码: public Stream GetLog() { Stream stream = new FileStream(@"Log.txt", FileMode.

我有一个服务器应用程序执行另一个应用程序,第二个应用程序生成一个日志文件, 我希望服务器通过WCF将其发送到客户端

我希望客户端在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();
    }

如何使用实时登录更新客户端?

我认为您的绑定是错误的。 您应该设置您的
transferMode=“Streamed”

在这里,您可以找到一个示例:


我认为您的绑定是错误的。 您应该设置您的
transferMode=“Streamed”

在这里,您可以找到一个示例:


有几种可能性。 你可以修改合同吗?如果您可以使用会话感知绑定(如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

问候,,
弗雷德里克有两种可能性。 你可以修改合同吗?如果您可以使用会话感知绑定(如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

问候,,
Fredrik

您是如何读取客户端的日志文件的?你只显示你是如何打开它的。我有一个流阅读器。。它写在客户机代码中。如果你把你的代码包括进来,那会很有帮助,因为那条注释不能更清楚地解释为什么你的逻辑不起作用。它就在这里,在我发布的客户机代码中-对不起,完全错过了它!如何从客户端的日志文件中读取?你只显示你是如何打开它的。我有一个流阅读器。。它写在客户机代码中。如果你把你的代码包括进来,那会很有帮助,因为那条注释不能更清楚地解释为什么你的逻辑不起作用。它就在这里,在我发布的客户机代码中-对不起,完全错过了它!我使用了此设置,但客户端流仍然没有随服务器流的更改而更新。@IsraelKo尝试使用BasicHttpBinding我使用了此设置,但客户端流仍然没有随服务器流的更改而更新。@IsraelKo尝试使用BasicHttpBinding我正在使用NetTcpBinding,您的解决方案确实解决了问题,但是实现非常复杂,需要存储所有需要日志的订阅服务器,并运行线程来捕获日志文件中的更改并更新所有订阅服务器。如果我的简单代码能够正常工作,我会很高兴。我正在使用NetTcpBinding,您的解决方案确实解决了这个问题,但是实现非常复杂,需要存储所有订阅服务器想要的日志,并操作线程来捕获日志文件中的更改并更新所有订阅服务器。如果我的简单代码能够工作,我会很高兴。