簡體   English   中英

HttpContext不包含Current的定義

[英]HttpContext doess not contain definition for Current

public static IOwinContext CurrentContext
{
    get
    {
        return HttpContext.Current.GetOwinContext();
    }
}

對於這種方法,我面臨的問題是Httpcontext不包含Current的定義。

我已經添加了System.aspnetcore.selfhost nuget軟件包,該軟件包支持system.web,但它也無法正常工作

public static class OwinContextExtensions
{

    public static int GetClientID()
    {
        int result = 0;
        var claim = CurrentContext.Authentication.User.Claims.FirstOrDefault(c => c.Type == "ClientID");

        if (claim != null)
        {
            result = Convert.ToInt32(claim.Value);
        }
        return result;
    }

    public static IOwinContext CurrentContext
    {
        get
        {
            **return HttpContext.Current.GetOwinContext();//here getting error**
        }
    }
}

如何編寫此方法的返回值public static IOwinContext CurrentContext

在ASP.NET中, HttpContext是一個臨時對象,該對象為每個請求創建一次; 但該服務應注冊為單身人士(感謝@poke進行此評論)。 在控制器外部,使用依賴注入來解決問題。 定義類似於以下內容的靜態類:

using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace YourNamespace.Services
{
    public static class MyAppContext
    {
        private static readonly IHttpContextAccessor _httpContextAccessor;

        public static void Configure(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
            // ...
        }

        public static int GetClientID()
        {
            int result = 0;
            var claim = CurrentHttpContext.User.Claims.FirstOrDefault(c => c.Type == "ClientID");
            if (claim != null)
            {
                result = Convert.ToInt32(claim.Value);
            }
            return result;
        }

        // You can even expose the current HTTP context
        public static HttpContext CurrentHttpContext { get { return _httpContextAccessor.HttpContext; } }
    }
}

Startup.cs中 ,配置服務:

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        // if using .NET Core 2.1 or above use:
        // services.AddHttpContextAccessor();
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        // ...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //...
        var ctx = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        YourNamespace.Services.MyAppContext.Configure(ctx);
        // ...
    }
}

感謝建設性的批評家/建議,我認為這是一個更好的解決方案。

暫無
暫無

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

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