日志注入
public class DemoController : BaseController
{
private readonly ILogger<DemoController> _logger;
public DemoController(ILogger<DemoController> logger)
{
_logger = logger;
}
[HttpGet]
public string GetMethod()
{
_logger.LogInformation("TODO.......");
}
}
缓冲区中的文件流发给客户端
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Web;
[Route("api/MyApi/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(IgnoreApi = false)]
public class BaseController : ControllerBase
{
/// <summary>
/// 缓冲区中的文件流发给客户端
/// </summary>
/// <param name="stream">二进制文件流</param>
/// <param name="fileName">文件名称</param>
/// <param name="length">文件长度</param>
/// <param name="contentType">文件的内容类型</param>
/// <returns></returns>
protected IActionResult DownloadFile(Stream stream, string fileName, long length, string contentType = "application/octet-stream")
{
Response.ContentType = contentType;
Response.Headers.Add("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.Headers.Add("Content-Length", length.ToString());
Response.Headers.Add("Access-Control-Allow-Origin", "*");
Response.Headers.Add("Access-Control-Allow-Credentials", "true");
int bufferSize = FileHelper.CACHESIZE;
using (stream)
{
using (Response.Body)
{
long hasRead = 0;
int curRead = 0;
var buffer = new byte[bufferSize];
while ((curRead = stream.Read(buffer, 0, bufferSize)) != 0) // 读取内容到服务器内存中
{
if (HttpContext.RequestAborted.IsCancellationRequested)
{
// 如果客户端中断了服务器的连接,取消下载文件的读取和发送
break;
}
Response.Body.Write(buffer, 0, curRead);
Response.Body.Flush(); // 释放服务器内存空间
hasRead += curRead; // 更新已经发送到客户端浏览器的字节数
//Console.WriteLine($"{DateTime.Now} {fileName} 数据流分段写 {length}/{hasRead}");
}
}
}
return new EmptyResult();
}
}