导读:本期聚焦于小伙伴创作的《C#如何实现tail服务并通过Web API实时推送文件追加内容》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何实现tail服务并通过Web API实时推送文件追加内容》有用,将其分享出去将是对创作者最好的鼓励。

在日志收集和实时监控系统中,经常需要把服务器上某个文本文件的新增内容实时推送给前端页面或其他服务。用C#可以快速实现一个tail服务,并通过Web API以流式方式把文件追加内容发送出去。

C#如何实现tail服务并通过Web API实时推送文件追加内容

核心实现思路

整体方案分为两部分:一是用FileSystemWatcher监控文件变化,二是通过ASP.NET Core的Controller返回Stream,把新增内容持续写入响应体。

  • 使用FileSystemWatcher监听文件Change事件
  • 记录上次读取位置,只读取追加部分
  • 通过HttpResponse.Body的Stream持续写入数据

文件监控与读取类

下面代码展示一个简易的TailWatcher,负责监听文件并把新增行通过回调抛出。

using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

public class TailWatcher
{
    private long _lastPosition;
    private readonly string _filePath;
    private readonly Action<string> _onAppend;

    public TailWatcher(string filePath, Action<string> onAppend)
    {
        _filePath = filePath;
        _onAppend = onAppend;
        _lastPosition = new FileInfo(filePath).Length;
    }

    public void Start()
    {
        var watcher = new FileSystemWatcher(Path.GetDirectoryName(_filePath), Path.GetFileName(_filePath));
        watcher.NotifyFilter = NotifyFilters.Size;
        watcher.Changed += (s, e) => ReadAppend();
        watcher.EnableRaisingEvents = true;
    }

    private void ReadAppend()
    {
        using var fs = new FileStream(_filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        fs.Seek(_lastPosition, SeekOrigin.Begin);
        using var reader = new StreamReader(fs, Encoding.UTF8);
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            _onAppend(line + Environment.NewLine);
        }
        _lastPosition = fs.Position;
    }
}

Web API实时推送

在ASP.NET Core中,我们可以写一个Controller,用Stream把内容推给客户端。注意要禁用缓冲并保持连接。

using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;

[Route("api/tail")]
public class TailController : Controller
{
    [HttpGet("{file}")]
    public async Task TailFile(string file)
    {
        Response.ContentType = "text/plain";
        Response.Headers["Cache-Control"] = "no-cache";
        var path = Path.Combine(Directory.GetCurrentDirectory(), "logs", file);
        if (!System.IO.File.Exists(path))
        {
            Response.StatusCode = 404;
            return;
        }

        var source = new TaskCompletionSource<bool>();
        var watcher = new TailWatcher(path, async (text) =>
        {
            var bytes = System.Text.Encoding.UTF8.GetBytes(text);
            await Response.Body.WriteAsync(bytes, 0, bytes.Length);
            await Response.Body.FlushAsync();
        });
        watcher.Start();

        // 保持连接直到客户端断开
        Context.RequestAborted.Register(() => source.TrySetResult(true));
        await source.Task;
    }
}

使用建议

如果前端需要双向通信或多人订阅,建议改用SignalR,把TailWatcher的回调Broadcast到Hub连接。对于单纯的文件tail推送,上面的流式API已经足够轻量。

注意:示例中的路径拼接仅用于演示,生产环境必须做权限校验和路径穿越过滤。

小结

通过C#的FileSystemWatcher加ASP.NET Core流式响应,我们可以用很少代码实现一个tail服务,并经由Web API实时推送文件追加内容,避免前端轮询,提升监控效率。

C#tail服务Web_API修改时间:2026-07-27 06:36:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。