Startup.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #define UseOptions // or NoOptions or UseOptionsAO
  2. using Microsoft.AspNetCore.Builder;
  3. using Microsoft.AspNetCore.Hosting;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using Microsoft.Extensions.Logging;
  7. using Microsoft.Extensions.Logging.Console;
  8. using Microsoft.Extensions.Logging.Debug;
  9. using System;
  10. using System.Net.WebSockets;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. namespace EchoApp
  14. {
  15. public class Startup
  16. {
  17. // This method gets called by the runtime. Use this method to add services to the container.
  18. // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
  19. public void ConfigureServices(IServiceCollection services)
  20. {
  21. services.AddLogging(builder =>
  22. {
  23. builder.AddConsole()
  24. .AddDebug()
  25. .AddFilter<ConsoleLoggerProvider>(category: null, level: LogLevel.Debug)
  26. .AddFilter<DebugLoggerProvider>(category: null, level: LogLevel.Debug);
  27. });
  28. }
  29. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  30. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
  31. {
  32. if (env.EnvironmentName == "Development")
  33. {
  34. app.UseDeveloperExceptionPage();
  35. }
  36. #if NoOptions
  37. #region UseWebSockets
  38. app.UseWebSockets();
  39. #endregion UseWebSockets
  40. #endif
  41. #if UseOptions
  42. #region UseWebSocketsOptions
  43. var webSocketOptions = new WebSocketOptions()
  44. {
  45. KeepAliveInterval = TimeSpan.FromSeconds(120),
  46. ReceiveBufferSize = 4 * 1024
  47. };
  48. app.UseWebSockets(webSocketOptions);
  49. #endregion UseWebSocketsOptions
  50. #endif
  51. #if UseOptionsAO
  52. #region UseWebSocketsOptionsAO
  53. var webSocketOptions = new WebSocketOptions()
  54. {
  55. KeepAliveInterval = TimeSpan.FromSeconds(120),
  56. ReceiveBufferSize = 4 * 1024
  57. };
  58. webSocketOptions.AllowedOrigins.Add("https://client.com");
  59. webSocketOptions.AllowedOrigins.Add("https://www.client.com");
  60. app.UseWebSockets(webSocketOptions);
  61. #endregion UseWebSocketsOptionsAO
  62. #endif
  63. #region AcceptWebSocket
  64. app.Use(async (context, next) =>
  65. {
  66. if (context.Request.Path == "/ws")
  67. {
  68. if (context.WebSockets.IsWebSocketRequest)
  69. {
  70. WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
  71. await Echo(context, webSocket);
  72. }
  73. else
  74. {
  75. context.Response.StatusCode = 400;
  76. }
  77. }
  78. else
  79. {
  80. await next();
  81. }
  82. });
  83. #endregion AcceptWebSocket
  84. app.UseFileServer();
  85. }
  86. #region Echo
  87. private async Task Echo(HttpContext context, WebSocket webSocket)
  88. {
  89. var buffer = new byte[1024 * 4];
  90. WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
  91. while (!result.CloseStatus.HasValue)
  92. {
  93. await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
  94. result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
  95. }
  96. await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
  97. }
  98. #endregion Echo
  99. }
  100. }