C# 在WCF中写入文件时流式传输文件
我有一个服务器应用程序执行另一个应用程序,第二个应用程序生成一个日志文件, 我希望服务器通过WCF将其发送到客户端 我希望客户端在EXEC应用程序更新日志时读取日志 我使用了一个返回流(日志文件)的操作契约。 问题是当我第一次发送流时,日志仍然是空的, 客户端看不到服务器执行器写入的“更新” 以下是服务器代码:C# 在WCF中写入文件时流式传输文件,c#,wcf,file,stream,contract,C#,Wcf,File,Stream,Contract,我有一个服务器应用程序执行另一个应用程序,第二个应用程序生成一个日志文件, 我希望服务器通过WCF将其发送到客户端 我希望客户端在EXEC应用程序更新日志时读取日志 我使用了一个返回流(日志文件)的操作契约。 问题是当我第一次发送流时,日志仍然是空的, 客户端看不到服务器执行器写入的“更新” 以下是服务器代码: public Stream GetLog() { Stream stream = new FileStream(@"Log.txt", FileMode.
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,您的解决方案确实解决了这个问题,但是实现非常复杂,需要存储所有订阅服务器想要的日志,并操作线程来捕获日志文件中的更改并更新所有订阅服务器。如果我的简单代码能够工作,我会很高兴。