繁体   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