猿问

如何在 LINQ 的 where 子句中更新全局变量?

由于您对问题的描述有限,我已经设置了一个演示应用程序,我在其中实现OAuthAuthorizationServerProvider为 Provider forOAuthAuthorizationServerOptions和 override GrantResourceOwnerCredentialsandValidateClientAuthentication


  public void Configuration(IAppBuilder app)

    {

        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions

        {

            Provider = new ApplicationOAuthBearerAuthenticationProvider()

        });

        app.Use<AuthenticationResponseMiddleware>();

        var options = new OAuthAuthorizationServerOptions

        {

            AllowInsecureHttp = true,

            TokenEndpointPath = new PathString("/api/xxxx"),

            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 

            Provider = new OwinAuthorisationProvider()


        };

        app.UseOAuthAuthorizationServer(options);


    }

还尝试AuthorizeAttribute在配置类中自定义并添加为过滤器.Filters.Add(new AuthorizeAttribute());


在AuthenticationResponseMiddleware我继承OwinMiddleware的public override async Task Invoke(IOwinContext context)方法中,请检查请求的流程。


它OAuthBearerAuthenticationProvider首先在RequestToken方法中命中,然后在OwinMiddleware类中命中,在进入任何 DelegatingHandler管道之前,大部分身份验证都是在此层中实现的。


检查后请评论您的发现,同时我也修改API并更新您,希望它可以帮助您。


森栏
浏览 96回答 2
2回答

米琪卡哇伊

只需调用ToArray()或ToList()实际执行设置的代码flag:var newList = list.Where(item =>{&nbsp; &nbsp; flag = true;&nbsp; &nbsp; return item == "2";}).ToArray();Where在实际枚举列表之前,不会评估传递给方法的谓词。

胡子哥哥

Linq 查询是惰性的,所以在您枚举 newList 之前,您不会看到任何变化,因为您的 where 尚未执行。var list = new List<string> { "1", "2", "3", "4", "5" };bool flag = false;var newList = list.Where(item =>{&nbsp; &nbsp; flag = true;&nbsp; &nbsp; return item == "2";});Console.WriteLine(flag); // Flag is still false.foreach (var item in newList) {&nbsp; // It doesn't matter what we do here, just that we enumerate the list.}Console.Write(flag); // Flag is now true.foreach 导致执行位置并设置您的标志。顺便说一句,我真的建议不要使用 where 谓词来产生副作用,但这就是你要做的。
随时随地看视频慕课网APP
我要回答