C# 使用依赖项注入将令牌获取从startup.cs传递到HomeController.cs

C# 使用依赖项注入将令牌获取从startup.cs传递到HomeController.cs,c#,.net,asp.net-core,dependency-injection,asp.net-core-mvc,C#,.net,Asp.net Core,Dependency Injection,Asp.net Core Mvc,我正在尝试从Startup.cs文件为以下代码创建DI。但是作为一个新加入.net的人,我很难想出一个解决方案 var tokenAcquisition = context.HttpContext.RequestServices .GetRequiredService<ITokenAcquisition>() as ITokenAcquisition; var graphClient = GraphServiceClientFactory .GetAuthenti

我正在尝试从Startup.cs文件为以下代码创建DI。但是作为一个新加入.net的人,我很难想出一个解决方案

var tokenAcquisition = context.HttpContext.RequestServices
     .GetRequiredService<ITokenAcquisition>() as ITokenAcquisition;

var graphClient = GraphServiceClientFactory
    .GetAuthenticatedGraphClient(async () =>
    {
        return await tokenAcquisition
            .GetAccessTokenForUserAsync(GraphConstants.Scopes);
    }
);
这可在以下网址找到: 通过电子邮件搜索示例查询用户。这就是我试图实现的功能

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var user = await graphClient.Users["carvalhostephen20@hotmail.com"]
    .Request()
    .GetAsync();
将Startup.cs代码复制到控制器中会导致解决方案失败并返回以下错误页面:


对不起,我第一次问错了你的问题。因此,基本上,在调用
服务时注册
ITokenAcquisition
。AddWebAppCallsProtectedWebApi()
。尝试修改您的
Homecontroller
。删除此行:

var tokenAcquisition = this.HttpContext.RequestServices
                .GetRequiredService<ITokenAcquisition>() as ITokenAcquisition;
var-tokenAcquisition=this.HttpContext.RequestServices
.GetRequiredService()作为ITokenAcquisition;
然后改用这个实例:
\u tokenAcquisition

我也遇到过几次“没有向AcquisiteTokenSilent传递帐户或登录提示”


在我的案例中,每次发生这种情况时,解决方案都会清除完整的浏览器历史记录(包括cookie)。我没有调查确切的原因,因为这个解决方案对我来说已经足够好了,但这似乎是由于浏览器缓存了一些令牌,在将某些内容更改为令牌获取代码后需要刷新这些令牌造成的。

@lobster,瞬态对象总是新的。每次请求新对象时都会创建它们(通过DI请求实例)。如果我们想在web请求级别使用它,那么它应该是作用域生命周期(根据每个新请求而变化)。这里有更多信息-@SaiGummaluri感谢您的观察,但我指的是请求服务容器。这需要添加到startup.cs文件中,对吗?而不是以下行:
var tokenAcquisition=context.HttpContext.RequestServices.GetRequiredService()作为ITokenAcquisition
@lobstar参数部分中的sp一词是什么意思@lobstar@stephencarvalho您需要将此代码片段添加到startup.cs中,但不是相反
sp
是IServiceProvider的一个实例,您可以使用它从服务容器获取另一个依赖项
GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var user = await graphClient.Users["carvalhostephen20@hotmail.com"]
    .Request()
    .GetAsync();
var tokenAcquisition = this.HttpContext.RequestServices
                .GetRequiredService<ITokenAcquisition>() as ITokenAcquisition;