小编len*_*est的帖子

如何将自定义数据传递给HandleChallengeAsync

我有一个带有自定义身份验证方案的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对象。有办法吗?

c# authentication asp.net-core asp.net-core-webapi

6
推荐指数
1
解决办法
906
查看次数

应用程序不活动后如何更新MPNS通道URI

当我的应用处于非活动状态时,存储的通知通道URI可能会过时 - 即停止,逻辑删除或休眠.在一段时间不活动后,使用我的Web服务更新频道URI的最佳做法是什么?

网上的各种文章提到"检索"URI以便将其发送到Web服务.但据我所知,我的应用程序学习通道URI的唯一方法是通过ChannelUriUpdated事件开启HttpNotificationChannel,并且提升该事件不在我的控制之下.我的应用程序处于非活动状态时,MPNS可能已更改URI.如果应用程序无法响应ChannelUriUpdated,则URI将在我的应用程序和我的Web服务中失效.

也许HttpNotificationChannel.Find保证返回的频道始终具有最新的频道URI?

c# push-notification windows-phone-7 windows-phone-7.1 mpns

5
推荐指数
1
解决办法
785
查看次数

如何扩展 ComplexTypeModelBinder

我需要为特定类自定义模型绑定,该类Foo涉及使用一些额外的后处理扩展正常绑定逻辑(例如,有条件地将空集合字段设置为空集合)。我想将此逻辑添加到模型绑定,以便结果可用于操作过滤器等​​。

最直接的方法是派生自ComplexTypeModelBinder和覆盖BindModelAsync。然而,不幸的是,该方法不是虚拟的。

组合是下一个选择。我正在尝试创建一个FooModelBinder具有或获取ComplexTypeModelBinder. 但是,我不知道如何注入或解析ComplexTypeModelBinder. 这可能吗?有没有更好的方法来扩展 的功能ComplexTypeModelBinder

c# model-binding asp.net-core-mvc asp.net-core

5
推荐指数
1
解决办法
1594
查看次数

动态UILabel,具有比例宽度和文本驱动高度

我正在尝试以编程方式创建一个包含两个UILabel子视图的容器视图,其行为如下:

  • 容器宽度固定在其超视图上; 它的高度受限于适合标签
  • 标签水平放置,标签间距(8pts)
  • 左标签宽度是容器宽度的25%
  • 正确的标签宽度填充可用空间,减去标准水平间距
  • 在文字边界处流过多行时,应该打破长文本; 两个标签必须垂直增长以适应长文本

我用numberOfLines = 0和定义了标签lineBreakMode = NSLineBreakByWordWrapping.

请注意,容器的大小是完全动态的; 它的宽度由其超视图决定,而其高度由其子视图(标签)决定.标签的大小也是动态的; 它们的宽度与容器宽度成正比,它们的高度取决于文本的长度.

我已经能够实现上述所有内容,除了最后一项,具有以下约束(伪代码).A是左侧标签,B是右侧.

  • A.top == container.top
  • B.top == container.top
  • A.leading = container.leading
  • A.trailing == B.leading - 8
  • B.trailing == container.trailing
  • A == .25*container.width
  • container.height> = A.height
  • container.height> = B.height

最后2个约束旨在拉伸容器以适应标签的高度,但布局引擎似乎忽略了标签可能是多行的事实.也就是说,无论文本的长度如何,我总是会显示一行.

那么我需要添加/修改/删除哪些约束才能实现上述全部行为?

ios autolayout

4
推荐指数
2
解决办法
1万
查看次数

如何将派生实体发布到基本实体集

假设我有一个名为 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)。

odata

2
推荐指数
1
解决办法
977
查看次数

接口方法中与委托的无效差异

为什么以下接口声明会产生无效的方差错误?

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' 是逆变的。

问题在于使用TKeyFunc参数。但是TKey根据Func需要被用作输入。为什么它必须是协变的?

c# c#-4.0

1
推荐指数
1
解决办法
165
查看次数