相关疑难解决方法(0)

设置Thread.CurrentPrincipal异步?

在身份验证期间使用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)

c# async-await asp.net-web-api

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

如何通过依赖注入传递Web API请求?

我有一个Web API应用程序,其中控制器通过依赖注入(Unity)将服务/存储库等注入其中.让我们假设我IStuffService需要IPrincipal当前请求(或它周围的包装).

Web API的问题似乎是当前Request/User 的唯一可靠来源是Request实例上的属性ApiController.任何静态的(无论是HttpContext.Current,CallContext.Get/SetDataThread.Get/SetData)不能保证是相同的线程上,由于网络API的同步性质.

如何可靠地确保特定于请求的上下文通过依赖项传递,更重要的是,操作在整个操作过程中保持正确IPrincipal

两种选择:

  1. 每个需要的方法IPrincipal都将它作为方法的参数 - 这是最可靠的方法,但它也要求我在每个方法签名中都有这个东西
  2. 将IPrincipal注入服务的ctor,使用Unity中的DependencyOverride在每个请求上激活对象图的新内容: container.Resolve(opType, new DependencyOverride(typeof(IPrincipal), principal))

选项2意味着我的方法签名是干净的,但这也意味着我需要确保所有依赖项都使用TransientLifetimeManager,而不是Singleton甚至是Per-Thread.

有没有比我没有看到更好的解决方案?

.net c# asp.net async-await asp.net-web-api

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

异步和线程文化

我有一个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)

当我开始异步编程时,如果我们将我们修改过的文化返回到线程池,并且在异步任务完成时调度新线程,我很好奇文化是如何持久化的?我应该知道的任何陷阱?

c# asp.net-mvc async-await

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

Asp.net WEB API - 如果我使用POST而不是PUT和DELETE会出现什么问题?

我刚刚开始使用Web API,虽然我发现创建方法和我需要的一些配置非常容易,但现在我遇到了一个我不知道如何解决的问题.

一些将使用我的服务的应用程序非常旧,不支持DELETE和PUT方法(例如j2me应用程序)

我发现通过传递这样的东西可以做某种方法模拟:

_method=DELETE|PUT 
Run Code Online (Sandbox Code Playgroud)

但是,我不确定Web API是否能够解释这一点,此外,我不知道如何做到这一点.出于这些原因,我正在考虑使用POST方法来处理更新和删除.话虽如此,如果不使用所有标准方法,我可以期待什么并发症?

一如既往,任何帮助都将受到极大的赞赏

提前致谢.

PD如果有人知道如何_method通过路由到DELETE()或PUT()来发布POST会很棒

c# http-put java-me http-delete asp.net-web-api

7
推荐指数
2
解决办法
1791
查看次数

是否有任何技术原因Simple Injector无法支持.NET 4.0上的Web API?

这真的是对这个问题的跟进.其中一个Simple Injector开发人员指出了一个关于Simple Injector的有用信息,我认为让它更易于访问是件好事.

那么,使用Web API 1和.NET 4.0支持Simple Injector是否有任何技术障碍?源代码很容易下载和编译.它似乎工作得很好.

c# dependency-injection simple-injector asp.net-web-api

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