programing

HttpContext에 접근합니다.서로 다른 스레드의 전류

instargram 2023. 10. 9. 21:21
반응형

HttpContext에 접근합니다.서로 다른 스레드의 전류

저는 C# ASP가 있습니다.SiteCrawler.cs 이라는 클래스에서 일부 메서드를 실행하는 약 25개의 다른 스레드를 시작하는 NET 응용 프로그램입니다.

HttpContext.Current.Session사용자가 검색한 결과를 저장하고 스레드가 모두 실행되면 사용자에게 제시하고 싶습니다.내 문제는.HttpContext.Current개체가 존재하지 않으므로 생성된 스레드에서 null입니다.

응용프로그램이 다중 스레드일 때 제한이 있기 때문에 세션을 사용하지 않고 사용자/세션별 데이터를 저장하려면 어떤 다른 옵션이 있습니까?

해결책을 찾기 위해 스택 오버플로우의 모든 부분을 검색해 보았지만 아무런 운이 없었습니다.

저의 어플리케이션에는 많은 코드가 있습니다.HttpContext.Current그 코드는 수정할 수 없습니다.

worker.DoWork()아래 샘플에서 그 코드를 사용합니다.그리고 저는 그것을 각각의 스레드에서 실행해야만 했습니다.

저는 다음과 같은 해결책을 찾았습니다.

 HttpContext ctx = HttpContext.Current;
 Thread t = new Thread(new ThreadStart(() =>
                {
                    HttpContext.Current = ctx;
                    worker.DoWork();
                }));
 t.Start();
 // [... do other job ...]
 t.Join();

Fritz Onion: Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code의 기사를 보십시오.꽤 길지만, 요구 사항이 너무 사소하지는 않습니다.

또한 K. Scott Allen은 바로 이 문제에 대해 다소 짧은 글을 올렸습니다.HttpContext 작업.현재

@로리는 위에 언급을 했습니다. 특정 물체는HttpContext스레드에 전달해도 null이 됩니다.이 일이 저한테 일어난거에요.User소유물.대신 다음과 같이 User를 CurrentPrincipal 스레드에 복사할 수 있습니다.

컨트롤러 컨텍스트에서 사용자를 저장합니다.

            _user = HttpContext.Current.User;
            var processThread = new Thread(() => ThreadedCode());
            processThread.Start();

스레드에서 '스레드' 사용자를 설정합니다.

    private static void ThreadedCode()
    {
        // Workaround for HttpContext.Current.User being null.
        // Needed for CreatedBy and RevisedBy.
        Thread.CurrentPrincipal = _user;

HttpContext는 요청 기간 동안에만 사용할 수 있습니다.스레드는 요청보다 잠재적으로 훨씬 더 오래 지속될 수 있으므로 아마도 처음부터 스레드가 필요한 이유일 것입니다!:)

HttpContext를 추가하기만 하면 됩니다.클래스 SiteCrawler.cs 의 생성자에 대한 최신 정보

public class SiteCrawler
{
     HttpContext context = HttpContext.Current;

    public void Method()
    {
        context.WhateverYouWant
    }
}

데이터베이스에 저장한 다음 사용자의 브라우저가 계속 새로 고침을 하도록 하거나 ajax를 사용하거나 새로운 signalr을 사용하여 결과가 이미 db에 작성되어 있는지 확인할 수 있습니다.도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/8925227/access-httpcontext-current-from-different-threads

반응형