programing

Http Context가 되는 이유대기 후 현재 null입니까?

jooyons 2023. 4. 20. 21:14
반응형

Http Context가 되는 이유대기 후 현재 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확실한 건 찾을 수 없을 정도로 새롭습니다.

?DR: : tHttpContext.Currentnull잠 an an await

ASP를 쓰고 있는지 확인하십시오.NET 4.5 어플리케이션 및 타깃 4.5. async ★★★★★★★★★★★★★★★★★」awaitASP에서 정의되지 않은 동작이 있습니다.4.5에서 실행 중이며 새로운 "태스크 친화적인" 동기화 컨텍스트를 사용하지 않는 한 NET.

특히 다음 중 하나가 필요합니다.

  • ★★httpRuntime.targetFramework로로 합니다.4.5 「」
  • 고객님의 고객명appSettings , set , syslogsaspnet:UseTaskFriendlySynchronizationContext로로 합니다.true.

자세한 내용은 이쪽에서 확인하실 수 있습니다.

@StepenCleary가 올바르게 지적한 바와 같이 web.config에는 다음 사항이 필요합니다.

<httpRuntime targetFramework="4.5" />

처음 트러블 슈팅을 실시했을 때, 상기의 솔루션 전체를 검색해, 모든 Web 프로젝트에 그것이 존재하는 것을 확인하고, 곧바로 그 원인을 밝혀냈습니다.결국 이러한 검색 결과를 전체적인 맥락에서 살펴봐야겠다는 생각이 들었습니다.

<!--
  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로 업그레이드하는 경우에도 수동으로 설정을 해야 합니다.

나는 최근에 이 문제에 부딪쳤다.Stephen이 지적한 바와 같이 타깃 프레임워크는 이 문제를 야기할 수 있습니다.

제 경우 웹 API는 버전 4.6.2로 이행되었지만 실행 시 타깃 프레임워크가 웹 구성에 지정되어 있지 않기 때문에 기본적으로는 <시스템> 내에 없습니다.web > 태그:

실행 중인 프레임워크버전이 의심되면 다음 행을 Web API 메서드에 추가하여 실행 시 현재 로드되어 있는 유형을 확인하고 레거시 구현이 아님을 확인하는 중단점을 설정하십시오.

다음과 같이 표시됩니다(AspNetSynchronizationContext).

여기에 이미지 설명 입력

LegazyAspNetSynchronizationContext(타깃 프레임워크를 추가하기 전에 확인한 내용) 대신:

여기에 이미지 설명 입력

소스 코드(https://referencesource.microsoft.com/#system.web/LegacyAspNetSynchronizationContext.cs)에 접속하면, 이 인터페이스의 레거시 실장에서는 비동기 지원이 결여되어 있는 것을 알 수 있습니다.

여기에 이미지 설명 입력

저는 문제의 근원을 찾기 위해 많은 시간을 보냈고 스티븐의 답변이 많은 도움이 되었습니다.이 답변으로 문제에 대한 추가 정보가 제공되기를 바랍니다.

테스트에 결함이 있는지, 아니면 HttpContext를 만드는 web.config 요소가 누락되어 있는지 확인합니다.대기 후 현재 해결 방법이 올바릅니까?

테스트에 결함이 없고 HttpContext가 있습니다.ASP에서는 대기 후에 전류가 null이 되어서는 안 됩니다.대기할 때 NET Web API를 사용하면 대기 전에 존재했던 올바른 HttpContext가 이 대기 후에 전달됩니다.

web.config의 관점에서는 앞의 답변이 정곡을 찌른다고 코멘트를 하고 싶습니다만, IIS 로부터 이 기능을 무효로 할 수 있는 설정이 있습니다.<httpRuntime targetFramework="4.5" />.

말은, 여기서의 설정입니다.<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

<httpRuntime targetFramework="4.5" />이 설정을 구성하려면 IIS의 모든 설정에 의해 덮어쓰게 됩니다.

SynchronizationContext 유형을 디버깅하거나 기록하다가 레거시 유형인 경우 IIS 또는 호스팅 사이트 수준에서 설정을 확인할 수 있습니다.

LegacyAspNetSynchronizationContext를 생성합니다.

Web.config:

    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="aspnet:UseLegacyEncryption" value="true" />
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.8" />
    <httpRuntime targetFramework="4.5" />
  </system.web>

여기에 이미지 설명 입력

AspNetSynchronizationContext를 생성합니다(필요한 내용은 다음과 같습니다).

    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
    <add key="aspnet:UseLegacyEncryption" value="true" />
    <add key="aspnet:UseLegacyMachineKeyEncryption" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.8" />
    <httpRuntime targetFramework="4.5" />
  </system.web>

*여기서 IIS에는 덮어쓰기 설정이 없습니다.

서 을 다 .HttpContext.Current무효로 하다

.net Framework 4.6.1 / MVC

하고 HttpContext.Current App_Data

이 문제를 해결한 방법은 다음과 같습니다.

나는 지금 막 전류를 얻었다.HttpContext.Current변수에서 리셋한 후, 내 후에 리셋합니다.await콜을 클릭합니다.

var tempHttpContextCurrent = System.Web.HttpContext.Current;

var report = await reportingUtilities.GetReport(reportId, currentUserRubixId).ConfigureAwait(false);

// reset the HttpContext.Current after the await call.
System.Web.HttpContext.Current = tempHttpContextCurrent;

내 경우 스택의 시작에서 기다리는 것을 잊은 것이 문제였고, 내 컨스트럭터 액션 메서드의 설명성

메모: IHtpContextAccessor에서 net core 5.0 사용

그래서 문제는 암호에 있었고...

[HttpPost]
public async Task AnyAction()
{
    await service.MethodReturningTask(); //await was not
}

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

반응형