1
0

DefaultController.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using FreeRedis;
  2. using Masuit.MyBlogs.Core.Extensions.Firewall;
  3. using Masuit.Tools.AspNetCore.ModelBinder;
  4. using Masuit.Tools.DateTimeExt;
  5. namespace Masuit.MyBlogs.Core.Controllers;
  6. public sealed class DefaultController(IRedisClient redis) : Controller
  7. {
  8. /// <summary>
  9. /// 设置cookie
  10. /// </summary>
  11. /// <param name="pair"></param>
  12. /// <returns></returns>
  13. [HttpPost("/SetCookie"), HttpGet("/SetCookie"), AllowAccessFirewall]
  14. public ActionResult SetCookie([FromBodyOrDefault] NameValuePair pair)
  15. {
  16. Response.Cookies.Append(pair.Name, pair.Value, new CookieOptions
  17. {
  18. SameSite = SameSiteMode.None
  19. });
  20. return Ok();
  21. }
  22. /// <summary>
  23. /// 文章统计
  24. /// </summary>
  25. /// <returns></returns>
  26. [Route("/ping")]
  27. public async Task<IActionResult> Ping(CancellationToken cancellationToken = default)
  28. {
  29. Response.ContentType = "text/event-stream";
  30. Response.Headers.Append("X-Accel-Buffering", "no");
  31. Response.Headers.Append("Cache-Control", "no-cache");
  32. var ip = HttpContext.Connection.RemoteIpAddress?.ToString();
  33. await redis.SAddAsync("GlobalOnline", ip);
  34. while (true)
  35. {
  36. try
  37. {
  38. if (cancellationToken.IsCancellationRequested)
  39. {
  40. break;
  41. }
  42. await Response.WriteAsync("event: message\n", cancellationToken);
  43. await Response.WriteAsync("data:" + DateTime.Now.GetTotalMilliseconds() + "\r\r", cancellationToken: cancellationToken);
  44. await Response.Body.FlushAsync(cancellationToken);
  45. await Task.Delay(2000, cancellationToken);
  46. }
  47. catch (OperationCanceledException)
  48. {
  49. break;
  50. }
  51. }
  52. await redis.SRemAsync("GlobalOnline", ip);
  53. Response.Body.Close();
  54. return Ok();
  55. }
  56. }
  57. public class NameValuePair
  58. {
  59. public string Name { get; set; }
  60. public string Value { get; set; }
  61. }