Le code ci-dessous a été ajouté à une fraîchement créé Visual Studio 2012 .NET 4.5 WebAPI projet.
Je suis en train d'affecter HttpContext.Current.User
et Thread.CurrentPrincipal
dans une méthode asynchrone. La cession de l' Thread.CurrentPrincipal
circule mal, à moins d'un await Task.Yield();
(ou autre chose asynchrone) est exécutée (passage d' true
de AuthenticateAsync()
entraînera succès).
Pourquoi est-ce?
using System.Security.Principal;
using System.Threading.Tasks;
using System.Web.Http;
namespace ExampleWebApi.Controllers
{
public class ValuesController : ApiController
{
public async Task GetAsync()
{
await AuthenticateAsync(false);
if (!(User is MyPrincipal))
{
throw new System.Exception("User is incorrect type.");
}
}
private static async Task AuthenticateAsync(bool yield)
{
if (yield)
{
// Why is this required?
await Task.Yield();
}
var principal = new MyPrincipal();
System.Web.HttpContext.Current.User = principal;
System.Threading.Thread.CurrentPrincipal = principal;
}
class MyPrincipal : GenericPrincipal
{
public MyPrincipal()
: base(new GenericIdentity("<name>"), new string[] {})
{
}
}
}
}
Notes:
- L'
await Task.Yield();
peuvent apparaître n'importe où enAuthenticateAsync()
ou il peut être déplacé enGetAsync()
après l'appel àAuthenticateAsync()
et il faudra encore réussir. -
ApiController.User
retoursThread.CurrentPrincipal
. -
HttpContext.Current.User
coule toujours correctement, même sansawait Task.Yield()
. -
Web.config
inclut<httpRuntime targetFramework="4.5"/>
ce qui impliqueUseTaskFriendlySynchronizationContext
. - J'ai demandé à une question similaire il y a quelques jours, mais ne savais pas que l'exemple était que de succès parce qu'
Task.Delay(1000)
était présent.