我一直在理解PredicateBuilderJoseph Albahari编写的扩展方法,我看到了这一点Expression.Invoke,说实话,我无法理解它的原因在以下方法中:
public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>>
expr1, Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2,
expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
}
Run Code Online (Sandbox Code Playgroud)
即使他解释了一下:
有趣的工作发生在And和Or方法中.我们首先使用第一个表达式的参数调用第二个表达式.Invoke表达式使用给定表达式作为参数调用另一个lambda表达式.我们可以从第一个表达式的主体和第二个表达式的调用版本创建条件表达式.最后一步是将它包装在一个新的lambda表达式中.
MSDN告诉我:
创建一个InvocationExpression,将委托或lambda表达式应用于参数表达式列表.
这对我来说很有意义.所以基本上我不必传入任何参数,如果我使用这样的表达式.
但由于某种原因,我无法理解它.也许我累了什么的.
问题:
InvocationExpression.Or<T>方法(或AndElse<T>)方法如何更好地工作?更新:
我在考虑InvocationExpression当我从工作到家时,它在我心中暗示如下:
当我们调用一个方法时,我们简单地说CallMe(phoneNumber, time);,这称为方法调用.然后,InvocationExpression应该是一个表达的表达CallMe(phoneNumber, time);.它类似于LambdaExpression表达lambda等t => t + 2.所以基本上它是一个应用于参数(而不是参数)的方法调用.因此,作为调用,不再需要参数,但可能会返回一些内容,因为参数已经应用于其参数.
有关我正在讨论的代码的更多信息,请访问http://www.albahari.com/nutshell/predicatebuilder.aspx
因此,我在设置 IdentityServer4 时遇到了承载身份验证问题。基本上,我无法调用我的 API 资源并收到 401 错误。当我使用 access_token 添加授权标头时。我能够从我的网络请求中获取数据。
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Bearer", authToken);
var content = await
client.GetStringAsync("http://localhost:5000/localapi");
}
Run Code Online (Sandbox Code Playgroud)
我获取 auth_token 的方法是将用户声明存储在由身份服务器客户端设置证明的 SecurityTokenValidated 回调中。
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = notification =>
{
var identity = notification.AuthenticationTicket.Identity;
identity.AddClaim(claim: new Claim(type: "auth_token", value:
notification.ProtocolMessage.AccessToken));
return Task.CompletedTask;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这解决了我的授权问题,但我想确保我不会通过将我的 auth_token 存储在身份声明中来打开攻击向量。谁能告诉我这是否会带来安全问题。
我担心的原因是我能够使用 Postman 创建一个简单的请求,并手动将相同的 Bearer 授权令牌粘贴到请求中,然后发送它。响应给了我“安全”的 API 数据。这对我来说,如果有人拿到了 auth_token,他们就可以访问 API(或者 Postman 可能会绕过某些东西?)。
authorization claims-based-identity bearer-token openid-connect
评估代表
我有一个表达式,我使用一个参数,我想在下面的DoSomething函数中使用它的结果.
public void DoSomething <TModel>(Expression<Func<TModel, String>> func){
}
Run Code Online (Sandbox Code Playgroud)
调用DoSomething方法
以下TModel在Names属性中有一个名称列表,我想在DoSomething方法中访问它.我无法弄清楚如何做到这一点.
DoSomething(m => m.Names);
Run Code Online (Sandbox Code Playgroud)
试图编译没有成功
...
func.Compile().Invoke([need m.Names]) in here.
Run Code Online (Sandbox Code Playgroud)
我的现实代码看起来像这样
public static HelperResult TestFor<TModel>(
ExtendedPageBaseClass<TModel> page,
Expression<Func<TModel, object>> valueField,
Expression<Func<TModel, object>> displayField,
Expression<Func<TModel, ICollection>> list,
Object defaultValue = null, String changedEvent = null)
{
var idField = valueField.GetName();
var label = displayField.GetName();
var display = page.Html.NameFor(displayField).ToString();
var data = list.Compile().Invoke(page.Html.ViewData.Model);
return IsolatedSelectorFor(page, idField, display, label, data);
}
Run Code Online (Sandbox Code Playgroud) 在Visual Studio中,当您在解决方案资源管理器中选择项目或项目项时,有时您可能想要向属性窗口(按F4时弹出的窗口)添加自定义属性。另外,要填充这些属性的值,我需要添加一个按钮以弹出一个表单,以便我可以在设计时从用户那里收集信息。
什么是最简单的实现,这样我就可以开始了?如何使用UITypeEditAttribute创建一个用户界面来收集值?