在身份验证期间使用ASP.NET WebAPI进行Thread.CurrentPrincipal设置,以便控制器稍后可以使用该ApiController.User属性.
如果该身份验证步骤变为异步(以咨询另一个系统),CurrentPrincipal则会丢失任何变异(当调用者await恢复同步上下文时).
这是一个非常简化的示例(在实际代码中,身份验证发生在动作过滤器中):
using System.Diagnostics;
using System.Security.Principal;
using System.Threading;
using System.Threading.Tasks;
public class ExampleAsyncController : System.Web.Http.ApiController
{
public async Task GetAsync()
{
await AuthenticateAsync();
// The await above saved/restored the current synchronization
// context, thus undoing the assignment in AuthenticateAsync().
Debug.Assert(User is GenericPrincipal);
}
private static async Task AuthenticateAsync()
{
// Save the current HttpContext because it's null after await.
var currentHttpContext = System.Web.HttpContext.Current;
// Asynchronously determine identity.
await Task.Delay(1000);
var …Run Code Online (Sandbox Code Playgroud) 我有一个Web API应用程序,其中控制器通过依赖注入(Unity)将服务/存储库等注入其中.让我们假设我IStuffService需要IPrincipal当前请求(或它周围的包装).
Web API的问题似乎是当前Request/User 的唯一可靠来源是Request该实例上的属性ApiController.任何静态的(无论是HttpContext.Current,CallContext.Get/SetData或Thread.Get/SetData)不能保证是相同的线程上,由于网络API的同步性质.
如何可靠地确保特定于请求的上下文通过依赖项传递,更重要的是,操作在整个操作过程中保持正确IPrincipal?
两种选择:
IPrincipal都将它作为方法的参数 - 这是最可靠的方法,但它也要求我在每个方法签名中都有这个东西container.Resolve(opType, new DependencyOverride(typeof(IPrincipal), principal))选项2意味着我的方法签名是干净的,但这也意味着我需要确保所有依赖项都使用TransientLifetimeManager,而不是Singleton甚至是Per-Thread.
有没有比我没有看到更好的解决方案?
我有一个MVC应用程序,我覆盖我的基本控制器的OnActionExecuting()方法来设置我的线程文化:
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
var langCode = GetLangCode();
Thread.CurrentThread.CurrentUICulture = new CultureInfo(langCode);
Thread.CurrentThread.CurrentCulture = new CultureInfo(langCode);
}
Run Code Online (Sandbox Code Playgroud)
当我开始异步编程时,如果我们将我们修改过的文化返回到线程池,并且在异步任务完成时调度新线程,我很好奇文化是如何持久化的?我应该知道的任何陷阱?
我刚刚开始使用Web API,虽然我发现创建方法和我需要的一些配置非常容易,但现在我遇到了一个我不知道如何解决的问题.
一些将使用我的服务的应用程序非常旧,不支持DELETE和PUT方法(例如j2me应用程序)
我发现通过传递这样的东西可以做某种方法模拟:
_method=DELETE|PUT
Run Code Online (Sandbox Code Playgroud)
但是,我不确定Web API是否能够解释这一点,此外,我不知道如何做到这一点.出于这些原因,我正在考虑使用POST方法来处理更新和删除.话虽如此,如果不使用所有标准方法,我可以期待什么并发症?
一如既往,任何帮助都将受到极大的赞赏
提前致谢.
PD如果有人知道如何_method通过路由到DELETE()或PUT()来发布POST会很棒
这真的是对这个问题的跟进.其中一个Simple Injector开发人员指出了一个关于Simple Injector的有用信息,我认为让它更易于访问是件好事.
那么,使用Web API 1和.NET 4.0支持Simple Injector是否有任何技术障碍?源代码很容易下载和编译.它似乎工作得很好.