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
'programing' 카테고리의 다른 글
| 문자열에서 공백을 지정하는 가장 좋은 방법입니다.분할 작업입니다. (0) | 2023.04.25 |
|---|---|
| Git에 사용자 이름과 비밀번호를 저장하는 방법은 무엇입니까? (0) | 2023.04.20 |
| C# / WPF에서 애니메이션을 중지하는 방법 (0) | 2023.04.20 |
| Kotlin 목록과 배열 유형의 차이 (0) | 2023.04.20 |
| 열에 대한 이유가 집계 함수 또는 GROUP BY 절에 포함되어 있지 않으므로 선택 목록에 유효하지 않습니다. (0) | 2023.04.20 |



