分享程式代碼相關筆記
目前文章總數:157 篇
最後更新:2024年 12月 07日
要部署到 Server 上,需要對代碼做些調整,本篇是Http版本,在未買Https憑證的情況下,可以順利在內部系統使用。
基於範例檔案改進。
調整 program.cs 依照1. ~ 7. 的項目依序開啟Http連線,並且使用 Kestrel Server(輕量型的跨平台Server端口)
using System.Net;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
// 1. 添加gRPC
builder.Services.AddGrpc();
builder.Services.AddCors(); // 1. 增加 CORS 服務
// 2. 取得當前gRPC Https連線配置
IConfigurationRoot baseBuilderData = new ConfigurationBuilder()
.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "Properties", "launchSettings.json"), optional: true, reloadOnChange: true)
.Build();
// 3. 啟用 Kestrel Server ,並且設定 IP 這邊為了閱讀使用HardCode,建議放進 appsetting.json 中
NetCoreGRPCChattingRoomForHttpExample.Controllers.GlobalConst.Self_GRPC_URL = "http://localhost:50051";
builder.WebHost.ConfigureKestrel((context, options) =>
{
// 3. 配置 Web Endpoint(HTTP/1.1) => 連網站用
options.Listen(IPAddress.Any, 5099, listenOptions => { });
// 4. 配置 gRPC Endpoint(HTTP/2) => 連gRPC用
options.Listen(IPAddress.Any, 50051, listenOptions =>
{
listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;
});
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
// 5. 實現重定向,讓gRPC Server 與 Web Server 走同個port
app.Use(async (context, next) =>
{
if (context.Request.Headers.ContainsKey("content-type") &&
context.Request.Headers["content-type"].ToString().StartsWith("application/grpc", StringComparison.OrdinalIgnoreCase)
)
{
context.Request.Scheme = "https";
await next();
}
else
{
await next();
}
});
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
// 6. 啟用跨域設定,走Http的情況下,便於使用
app.UseCors(builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
app.UseAuthorization();
// Configure the HTTP request pipeline.
app.UseEndpoints(endpoints =>
{
// 7. 使用不安全通道
endpoints.MapGrpcService<NetCoreGRPCChattingRoomForHttpExample.Service.ChatService>().RequireCors("AllowAll");
});
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
調整 ChatController.cs 將呼叫的方式調整,至此完成代碼異動
/// <summary>
/// 傳送訊息 + 推播給所有訂閱用戶
/// </summary>
[HttpGet]
public async Task<IActionResult> SendMessage(string user, string message)
{
if (!GlobalConst.DicMessages.ContainsKey(user))
{
GlobalConst.DicMessages.Add(user, "");
Task.Run(() => SubscribeToMessages(user));
}
var resultMessage = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + ":";
var messageResponse = new MessageResponse();
var request = new MessageRequest { Username = user, Message = message };
// 調整此段: 呼叫遠端 gRPC 傳送訊息
using (var channel = GrpcChannel.ForAddress(GlobalConst.Self_GRPC_URL))
{
var client = new ChatApp.ChatService.ChatServiceClient(channel);
using (var call = client.SendMessageAsync(request))
{
messageResponse = await call.ResponseAsync;
}
}
return Ok(new
{
time = resultMessage,
response = messageResponse
});
}
對專案進行發佈代碼,並且更新到遠端 CentOs 系統上
將檔案部署到 CentOs 上後,到該目錄下,啟動
輸入以下,啟動網站,可以得到 Http 與 Https 的路徑,連到 gRPC 仍是走Https,但我們聊天室中內部連 gRPC 所以不影響
dotnet NetCoreGRPCChattingRoomForHttpExample.dll
從我們本地,連線到該網站,一樣開啟多個聊天室,可以順利通訊。
http://192.168.51.62:5099