我有一个带有自定义身份验证方案的Web API,该方案读取身份验证令牌。身份验证可能由于多种原因而失败(401)(令牌丢失,无效,过期),因此我希望能够在HTTP响应中指示失败原因。例如401 Token has expired。
令牌在中解析和验证AuthenticationHandler<T>.HandleAuthenticateAsync。如何将失败原因从该方法传递给HandleChallengeAsync?
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
AuthenticateResult result = null;
var tokenResult = this.ParseToken(this.Request, out var token);
if (tokenResult == TokenResult.Normal)
{
result = AuthenticateResult.Success(this.ticketFactory.CreateAuthenticationTicket(token));
}
else
{
result = AuthenticateResult.Fail("Bad token");
// FIXME: Figure out how to populate the Properties property
//result.Properties.Items.Add(nameof(TokenResult), tokenResult.ToString());
}
return Task.FromResult(result);
}
Run Code Online (Sandbox Code Playgroud)
AuthenticationProperties.Items看起来是存储此类自定义数据的好地方。但是我不知道如何在其中创建AuthenticationProperties对象HandleAuthenticateAsync并将其附加到AuthenticateResult对象。有办法吗?
当我的应用处于非活动状态时,存储的通知通道URI可能会过时 - 即停止,逻辑删除或休眠.在一段时间不活动后,使用我的Web服务更新频道URI的最佳做法是什么?
网上的各种文章提到"检索"URI以便将其发送到Web服务.但据我所知,我的应用程序学习通道URI的唯一方法是通过ChannelUriUpdated事件开启HttpNotificationChannel,并且提升该事件不在我的控制之下.我的应用程序处于非活动状态时,MPNS可能已更改URI.如果应用程序无法响应ChannelUriUpdated,则URI将在我的应用程序和我的Web服务中失效.
也许HttpNotificationChannel.Find保证返回的频道始终具有最新的频道URI?
我需要为特定类自定义模型绑定,该类Foo涉及使用一些额外的后处理扩展正常绑定逻辑(例如,有条件地将空集合字段设置为空集合)。我想将此逻辑添加到模型绑定,以便结果可用于操作过滤器等。
最直接的方法是派生自ComplexTypeModelBinder和覆盖BindModelAsync。然而,不幸的是,该方法不是虚拟的。
组合是下一个选择。我正在尝试创建一个FooModelBinder具有或获取ComplexTypeModelBinder. 但是,我不知道如何注入或解析ComplexTypeModelBinder. 这可能吗?有没有更好的方法来扩展 的功能ComplexTypeModelBinder?
我正在尝试以编程方式创建一个包含两个UILabel子视图的容器视图,其行为如下:
我用numberOfLines = 0和定义了标签lineBreakMode = NSLineBreakByWordWrapping.
请注意,容器的大小是完全动态的; 它的宽度由其超视图决定,而其高度由其子视图(标签)决定.标签的大小也是动态的; 它们的宽度与容器宽度成正比,它们的高度取决于文本的长度.
我已经能够实现上述所有内容,除了最后一项,具有以下约束(伪代码).A是左侧标签,B是右侧.
最后2个约束旨在拉伸容器以适应标签的高度,但布局引擎似乎忽略了标签可能是多行的事实.也就是说,无论文本的长度如何,我总是会显示一行.
那么我需要添加/修改/删除哪些约束才能实现上述全部行为?
假设我有一个名为 Employee 的基本实体类型和一个名为 Manager 的派生实体类型。所有员工的集合都可以通过/EmployeesURL 访问。将 Manager 实例 POST 到 Members 实体集的正确方法是什么?
OData v4 协议规范规定“要在集合中创建实体,客户端将 POST 请求发送到该集合的 URL。” 但规范没有说明在存在派生类型的情况下指定 POSTed 实体的类型。
URI规范规定派生类型应使用目标 URL 上的强制转换段来寻址。例如,
POST /Employees/NS.Manager
{ "Name": "Bill Lumbergh" ... }
Run Code Online (Sandbox Code Playgroud)
同时,JSON 格式规范建议使用odata.type注释,如下所示:
POST /Employees
{ "@odata.type": "#NS.Manager", "Name": "Bill Lumbergh" ... }
Run Code Online (Sandbox Code Playgroud)
那么哪个是正确的呢?或者两者都是?
请记住,我询问的是 OData 规范,而不是特定的 OData 库/框架(例如 ASP.NET)。
为什么以下接口声明会产生无效的方差错误?
public interface ICache<in TKey, TValue>
{
TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory);
}
Run Code Online (Sandbox Code Playgroud)
编译器说:
错误 CS1961 无效方差:类型参数“TKey”必须在“ICache<TKey, TValue>.GetOrAdd(TKey, Func<TKey, TValue>)”上协变有效。'TKey' 是逆变的。
问题在于使用TKey的Func参数。但是TKey根据Func需要被用作输入。为什么它必须是协变的?