your programing

대기 후 HttpContext.Current가 null 인 이유는 무엇입니까?

lovepro 2020. 10. 7. 08:03
반응형

대기 후 HttpContext.Current가 null 인 이유는 무엇입니까?


다음 테스트 WebAPI 코드가 있으며 프로덕션에서 WebAPI를 사용하지 않지만이 질문에 대한 토론 때문에 만들었습니다. WebAPI 비동기 질문

어쨌든 문제가되는 WebAPI 메서드는 다음과 같습니다.

public async Task<string> Get(int id)
{
    var x = HttpContext.Current;
    if (x == null)
    {
        // not thrown
        throw new ArgumentException("HttpContext.Current is null");
    }

    await Task.Run(() => { Task.Delay(500); id = 3; });

    x = HttpContext.Current;
    if (x == null)
    {
        // thrown
        throw new ArgumentException("HttpContext.Current is null");
    }

    return "value";
}

두 번째 예외가 await완료되면 HttpContext.Current스레드 정적 변수가 더 이상 적절한 값으로 해석되지 않는 다른 스레드에있을 가능성이 높기 때문에 두 번째 예외가 예상됩니다 . 이제 동기화 컨텍스트를 기반으로 실제로 대기 후 동일한 스레드로 다시 돌아 가야 할 수 있지만 테스트에서 멋진 작업을 수행하지 않습니다. 이것은 단지 평범하고 순진한 await.

다른 질문에 대한 의견에서 나는 HttpContext.Current기다림 후에 해결되어야한다고 들었습니다 . 이 질문에 대해 동일한 것을 나타내는 또 다른 의견이 있습니다. 그래서 무엇이 사실입니까? 해결해야합니까? 난 더 생각하지,하지만 난이 때문에 권위있는 대답 싶어 async하고 await나는 확실한 아무것도 찾을 수없는 새로운 충분히이입니다.

요약 : HttpContext.Current잠재적 null으로 await?


ASP.NET 4.5 애플리케이션을 작성하고 4.5 를 대상으로하고 있는지 확인하십시오 . async그리고 await당신은 4.5에서 실행되지 않는 ASP.NET에 정의되지 않은 동작을 하고 새로운 "작업 친화적 인"동기화 컨텍스트를 사용하고 있습니다.

특히 다음 중 하나를 수행해야합니다.

  • 설정 httpRuntime.targetFramework하기 위해 4.5, 또는
  • 에서 appSettings로 설정 aspnet:UseTaskFriendlySynchronizationContext합니다 true.

자세한 정보는 여기에서 확인할 수 있습니다 .


@StephenCleary가 올바르게 지적했듯이 web.config에 다음이 필요합니다.

<httpRuntime targetFramework="4.5" />

이 문제를 처음 해결할 때 위의 솔루션 전체 검색을 수행하고 모든 웹 프로젝트에 있음을 확인하고 신속하게 범인으로 무시했습니다. 결국 그 검색 결과를 전체 컨텍스트에서 살펴 보게되었습니다.

<!--
  For a description of web.config changes for .NET 4.5 see http://go.microsoft.com/fwlink/?LinkId=235367.

  The following attributes can be set on the <httpRuntime> tag.
    <system.Web>
      <httpRuntime targetFramework="4.5" />
    </system.Web>
-->

도.

레슨 : 웹 프로젝트를 4.5로 업그레이드하는 경우에도 해당 설정을 수동으로 가져와야합니다.


내 테스트에 결함이 있거나 여기에 누락 된 web.config 요소가있어 대기 후 HttpContext.Current가 올바르게 해결되도록 할 수 있습니까?

Your test is not flawed and HttpContext.Current should not be null after the await because in ASP.NET Web API when you await, this will ensure that the code that follows this await is passed the correct HttpContext that was present before the await.

참고URL : https://stackoverflow.com/questions/18383923/why-is-httpcontext-current-null-after-await

반응형