首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0058. .Net Core WebSite網站 - 部署 gRPC聊天室至 CentOs Server

日期:2023年 12月 10日

標籤: C# Asp.net Core Web MVC Web gRPC Http CentOS Chat Room

摘要:C# 學習筆記


應用所需:1. Visual Studio 2022 以上,支援.net Core 6
範例檔案:範例檔案
解決問題:1. 將 gRPC 通訊的.Net Core WebSite 聊天室部署至 CentOs Server
基於此:範例檔案,此篇是用Http的版本
基本介紹:本篇分為二大部分。
第一部分:代碼調整
第二部分:部署 & Demo






第一部分:代碼調整

Step 1:代碼調整部分

要部署到 Server 上,需要對代碼做些調整,本篇是Http版本,在未買Https憑證的情況下,可以順利在內部系統使用。
基於範例檔案改進。


Step 2:調整初始化檔案

調整 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();




Step 3:調整控制器

調整 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
    });
}





第二部分:部署 & Demo

Step 1:發佈程式

對專案進行發佈代碼,並且更新到遠端 CentOs 系統上


Step 2:啟動網站

將檔案部署到 CentOs 上後,到該目錄下,啟動
輸入以下,啟動網站,可以得到 Http 與 Https 的路徑,連到 gRPC 仍是走Https,但我們聊天室中內部連 gRPC 所以不影響

dotnet NetCoreGRPCChattingRoomForHttpExample.dll




Step 3:Demo 結果

從我們本地,連線到該網站,一樣開啟多個聊天室,可以順利通訊。

http://192.168.51.62:5099