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

对于这种方法,我面临 Httpcontext 不包含 Current 的定义的问题

我添加了支持 system.web 但它也不起作用的 System.aspnetcore.selfhost nuget 包

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

4

1 回答 1

2

在 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);
        // ...
    }
}

感谢建设性的批评/建议,我认为这是一个更好的解决方案。

于 2019-09-10T10:09:09.640 回答