iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
1
Modern Web

.Net Core 網站開發 101系列 第 17

App States 工作階段與應用程式狀態 - 2/2

昨天看了兩種常用的儲存狀態的方式,今天來說明剩下幾種

  • Cookie
  • Session
  • TempData
  • Query String & Hidden Fields
  • HttpContext.Items
  • 快取
  • 依賴注入

TempData

ASP.NET Core 會在 Controller 中曝露 TempData 屬性。此屬性會保留資料直到資料被讀取,或者用 KeepPeek 方法在讀取後保留資料。如果需要在請求重新導向後保留資料,TempData 是不錯的方法。TempData 是由 ITempDataProvider 的實作提供,目前 ASP.NET Core 框架中提供 CookieSession 的實作,預設是使用 Cookie,要使用 Session 除了在昨天範例中的設定外,還需要額外設定:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddSessionStateTempDataProvider();
}

使用 TempData 的方式跟使用 Dictionary<string, object> 的方式相同。

TempData["TempDate"] = DateTime.Now;

var tempDate = TempData["TempDate"];

Query String & Hidden Fields

利用 HTTP GET 或 POST 的方式保留並傳送資料,在需要持續使用狀態資料時很實用。因為用這種方式保留的資料是公開的形式,絕對不要用這種方式來保留敏感資料。除此之外也要注意 CSRF 的問題。

HttpContext.Items

是一個 Dictionary<object,object> 物件,用來在單一個請求中儲存資料,在請求 pipeline 結束後清除。需要在不同中介層中傳遞資料時很實用。

如果要使用字串作為索引鍵,需要注意索引鍵重複的問題。要避免這個問題,可以用一個物件來做為索引鍵,參考官方文件的範例:

public class HttpContextItemsMiddleware
{
    private readonly RequestDelegate _next;
    public static readonly object HttpContextItemsMiddlewareKey = new Object();

    public HttpContextItemsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        httpContext.Items[HttpContextItemsMiddlewareKey] = "Stored Value in Middleware";

        await _next(httpContext);
    }
}

public static class HttpContextItemsMiddlewareExtensions
{
    public static IApplicationBuilder 
        UseHttpContextItemsMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<HttpContextItemsMiddleware>();
    }
}

快取

篇幅太多了,明天再談XD

依賴注入

把包含資料的服務加入服務容器:

public class StatesInjection
{
    public string InjectedState { get; set; }
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(new StatesInjection {InjectedState = "Injected State"});
    }
}

public class ApplicationStatesController : Controller
{
    private readonly StatesInjection _injection;

    public ApplicationStatesController(StatesInjection injection)
    {
        _injection = injection;
    }
}

參考資料


上一篇
App States 工作階段與應用程式狀態 - 1/2
下一篇
Caching 快取
系列文
.Net Core 網站開發 10131

尚未有邦友留言

立即登入留言