HttpContext.Current üzerinde yoğun olarak kullanılan eski bir kitaplık kullanması gereken bir dizi ASP.NET barındırılan WebAPI hizmeti oluşturuyorum. Bir uyumsuz çağrıya katılan tüm yöntemlerde bağlamın korunmasını sağlamakta sorun yaşıyorum. Aşağıdaki kodda beklemeyle/Task.Wait ve TaskScheduler.FromCurrentSynchronizationContext() ile çeşitli varyasyonları denedim. Ben istiyorumWebAPI (Orta Güven) ile uyumsuz hale geldiğinde HttpContext'i koruyun
[HttpGet]
public Task<IEnumerable<string>> ContinueWith()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR"); //or another culture that is not the default on your machine
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
var output = new List<string> { TestOutput("Action start") };
var task = Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
return TestOutput("In Task");
}).ContinueWith(slowString =>
{
output.Add(slowString.Result);
output.Add(TestOutput("Action end"));
return output as IEnumerable<string>;
});
output.Add(TestOutput("Action Mid"));
return task;
}
private string TestOutput(string label)
{
var s = label + " ThreadID: " + Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture);
s += " " + Thread.CurrentThread.CurrentCulture.EnglishName;
s += HttpContext.Current == null ? " No Context" : " Has Context";
Debug.WriteLine(s);
return s;
}
CurrentCulture fr-FR olmasını sağlamak mümkün olacak ve HttpContext.Current o TestOutput denir her noktada boş değil hiç. Yaptığım şeyle "Görevde" araması için bunu yapmayı başaramadım. Ayrıca bazı test ipliklerimde, hiçbir zaman, yöntemin uyumsuzluğunu etkin bir şekilde kaldırdığımı gösteren hiçbir değişiklik gösterilmiyor. Kültür ve HttpContext.Current TestOutput her aramada korunur ve kodun farklı iş parçacığı üzerinde çalıştırmak için ücretsiz olmasını nasıl sağlayabilirim?
Bir kapakta HttpContext.Current yakalama ve daha sonra basit bir şekilde yeniden ayarlama benim için işe yaramaz, çünkü HttpContext.Current setter çağrılırken bir güvenlik istisnası atacak olan Medium Trust'ı desteklemem gerekiyor.
AspNetSynchronizationContext'in başka bir iş parçacığında çalıştırıldığında HttpContext gibi şeyleri korumak için özel olarak benim anlayışım vardı. Yanlış anlama mı yoksa AspNetSynchronizationContext bu durumda geçerli değil mi? – ScottS
'AspNetSynchronizationContext'' HttpContext' korur, ancak aynı anda yalnızca bir iş parçacığı istek bağlamında olabilir. Bağlamı diğer konulara koyamazsınız, ancak 'AspNetSynchronizationContext', içeriği 'bekletme' yöntemini bekledikten sonra yeniden başlatan iş parçacığı havuzu iş parçacığına eklemekten sorumludur. –
@StephenCleary - Cehaletimi bağışla ama 'Task.Factory.StartNew()' yöntemini kullanması durumunda 'CurrentCulture' iş parçacığı boyunca korunur. 'i bekliyoruz Task.Factory.StartNew (() => {doSomething();}; ' –