Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpContext不包含当前上下文的定义_C#_Asp.net Core 2.0 - Fatal编程技术网

C# HttpContext不包含当前上下文的定义

C# HttpContext不包含当前上下文的定义,c#,asp.net-core-2.0,C#,Asp.net Core 2.0,对于这个方法,我面临的问题是Httpcontext不包含当前 我添加了System.aspnetcore.selfhost nuget包,该包支持System.web,但也不起作用 public static IOwinContext CurrentContext { get { return HttpContext.Current.GetOwinContext(); } } 如何为ASP.NET中的此方法编写返回公共静态IOwinContext Cur

对于这个方法,我面临的问题是Httpcontext不包含当前

我添加了System.aspnetcore.selfhost nuget包,该包支持System.web,但也不起作用

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

如何为ASP.NET中的此方法编写返回
公共静态IOwinContext CurrentContext

HttpContext是一个临时对象,为每个请求创建一次;但该服务应注册为singleton(感谢@poke的评论)。在控制器外部,使用依赖注入来解决问题。定义一个类似于以下内容的静态类:

使用System.Linq;
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.Mvc;
namespace.Services
{
公共静态类MyAppContext
{
专用静态只读IHttpContextAccessor\u httpContextAccessor;
公共静态无效配置(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
// ...
}
公共静态int GetClientID()
{
int结果=0;
var claim=CurrentHttpContext.User.Claims.FirstOrDefault(c=>c.Type==“ClientID”);
如果(索赔!=null)
{
结果=转换为32(索赔值);
}
返回结果;
}
//您甚至可以公开当前的HTTP上下文
公共静态HttpContext CurrentHttpContext{get{return}\u httpContextAccessor.HttpContext;}
}
}
Startup.cs中,配置服务:

公共类启动
{
public void配置服务(IServiceCollection服务)
{
//如果使用.NET Core 2.1或更高版本,请使用:
//AddHttpContextAccessor();
services.AddSingleton();
// ...
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
//...
var ctx=app.ApplicationServices.GetRequiredService();
YourNamespace.Services.MyAppContext.Configure(ctx);
// ...
}
}

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

在ASP.NET中,HttpContext是一个临时对象,每个请求创建一次;但该服务应注册为singleton(感谢@poke的评论)。在控制器外部,使用依赖注入来解决问题。定义一个类似于以下内容的静态类:

使用System.Linq;
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.Mvc;
namespace.Services
{
公共静态类MyAppContext
{
专用静态只读IHttpContextAccessor\u httpContextAccessor;
公共静态无效配置(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
// ...
}
公共静态int GetClientID()
{
int结果=0;
var claim=CurrentHttpContext.User.Claims.FirstOrDefault(c=>c.Type==“ClientID”);
如果(索赔!=null)
{
结果=转换为32(索赔值);
}
返回结果;
}
//您甚至可以公开当前的HTTP上下文
公共静态HttpContext CurrentHttpContext{get{return}\u httpContextAccessor.HttpContext;}
}
}
Startup.cs中,配置服务:

公共类启动
{
public void配置服务(IServiceCollection服务)
{
//如果使用.NET Core 2.1或更高版本,请使用:
//AddHttpContextAccessor();
services.AddSingleton();
// ...
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
//...
var ctx=app.ApplicationServices.GetRequiredService();
YourNamespace.Services.MyAppContext.Configure(ctx);
// ...
}
}


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

System.Web
不用于ASP.NET Core,所以我不确定您在那里尝试做什么。@poke thaks评论我是ASP.NET Core的新手,所以我只是按照这篇教程说,该教程是针对ASP.NET 4的,而不是针对ASP.NET Core的。您可以将其扔掉,然后找到一个ASP.NET核心教程来学习,这样您可能会受益匪浅。:)@谢谢你的评论。如果您能给我提供asp.net核心的oauth 2.0实现代码的链接,我将不胜感激。请帮助我您应该查看ASP.NET Core文档,特别是,以了解如何将其他身份验证提供程序集成到您的应用程序中。
System.Web
未在ASP.NET Core中使用,所以我不确定你们想在那个里做什么。@poke thaks评论我是asp.net core的新手,所以我只是按照这篇文章,教程是针对asp.net 4的,不是针对asp.net core的。您可以将其扔掉,然后找到一个ASP.NET核心教程来学习,这样您可能会受益匪浅。:)@谢谢你的评论。如果您能给我提供asp.net核心的oauth 2.0实现代码的链接,我将不胜感激。请帮助我您应该查看ASP.NET核心文档,特别是,以了解如何将其他身份验证提供程序集成到应用程序中。避免访问控制器构造函数中的上下文。只有在控制器完全初始化后才能访问它。当然,这只是为了让您了解如何访问HttpContext对象。用户肯定在其代码中的其他地方调用了GetClientID()。然后在代码中明确说明这一点,以防其他人将此示例作为他们应该做的事情。@Bigabdoul。感谢您在asp.net core中发表评论。我在另一个controlleri中使用了GetClientID方法。我在aps.net core中是新手,所以我只关注此网站。请检查避免访问cons中的上下文
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**
        }
    }
}