簡體   English   中英

在 Asp.net Core 3.1 應用程序中處理子域

[英]Handle SubDomain in Asp.net Core 3.1 application

我正在開發一個 asp.net core 3.1 應用程序 (MVC),作為一項要求,每個帳戶都應該有它的子域(例如:mystore.domain.com)及其數據。 所以我試圖弄清楚如何在路由模式中添加子域部分,並在我的控制器中捕獲它以獲取用戶數據,並在視圖中返回它。

我做了一些研究並找到了針對 asp.net 核心版本 2 的解決方案,不幸的是,它不適用於版本 3( 例如發生了很多變化) 這篇文章

概括 :

  1. 用戶類型:mystore.domain.com 或 mystore.domain.com\\store
  2. 我捕獲子域“mystore”,在數據庫中搜索用戶數據,並呈現視圖。

您可以使用過濾器,特別是操作過濾器,它可以:

  • 在調用操作方法之前和之后立即運行代碼。
  • 可以更改傳遞給動作的參數。
  • 可以改變動作返回的結果。
  • Razor Pages 不支持。

一個例子是

public class MySampleActionFilter : IActionFilter 
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // Do something before the action executes.
        MyDebug.Write(MethodBase.GetCurrentMethod(), context.HttpContext.Request.Path);
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // Do something after the action executes.
        MyDebug.Write(MethodBase.GetCurrentMethod(), context.HttpContext.Request.Path);
    }
}

在這里,您可以准備一個范圍服務,根據服務加載用戶,然后在需要該數據的任何服務中重用它。

即使沒有過濾器,您也可以簡單地創建一個具有作用域生命周期的 UserService,在那里加載用戶並在您的服務中的任何地方使用它。

在我們的系統中,我們正在做類似的事情:

加載會話數據的服務:

public class ClientTokenService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public ClientTokenService(
        IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public Profile LoadProfile()
    {
        if (_httpContextAccessor.HttpContext.User == null)
        {
            throw new Exception("No user claims found to load Profile");
        }

        var user = _httpContextAccessor.HttpContext.User;

        var numberType = (NumberType)int.Parse(user.FindFirst("numberType").Value);
        var profileType = (PackagePlan)int.Parse(user.FindFirst("profileType").Value);
        var lineOfBusiness = (LineOfBusiness)int.Parse(user.FindFirst("lineOfBusiness").Value);

        // More stuff

        // Prepare the profile data
        return new Profile(
            user.FindFirst("number").Value,
            user.FindFirst("contractId").Value,
            numberType,
            profileType,
            user.FindFirst("cc")?.Value,
            user.FindFirst("app").Value,
            user.FindFirst("clickId")?.Value,
            user.FindFirst("wifi") != null,
            lineOfBusiness
        );
    }
}

此服務可以是瞬態的,然后是保存數據的范圍服務

public class ClientSessionContext
{
    public Profile Profile { get; }

    public ClientSessionContext(
        ClientTokenService sessionService)
    {
        Profile = sessionService.LoadProfile();
    }
}

將此服務聲明為作用域,因此此類每個請求僅初始化一次

狀態文件

services.AddScoped<ClientSessionContext>();

然后只需在需要訪問用戶數據的任何地方注入此服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM