2011-08-09 10 views
6

앱이 두 개의 스레드로 분리됩니다. 메인 웹 앱 및 비동기 이벤트 처리에 사용되는 보조 스레드. 보조 스레드는 내부에 주 앱의 완전한 URL (추가 경로 인수 포함)이 포함 된 이메일을 전송해야하는 이벤트를받습니다.ASP.NET MVC의 백그라운드 스레드에서 응용 프로그램 URL을 해결하려면 어떻게합니까?

예 : http://Server.com/App/RouteData?AdditionalArguments

물론 요청이 없으므로 백그라운드 스레드는 HttpContext.Current를 사용하여 URL을 해결할 수 없습니다. HttpRequest, HttpContext 없음 ...

ASP.NET을 (MVC를 사용하는 경우에도) URL을 작성하는 데 사용하는 대부분의 메소드가 HttpContext에 의존한다는 사실을 발견했습니다. HttpContext 또는 그 파생물을 사용하지 않고 ASP.NET에서 완전한 응용 프로그램 URL을 작성하는 방법이 있습니까?

UrlHelper.GetApplicationtUrl() 

어떤 아이디어 :

내가 좋아하는 스레드 안전한 방법을 찾고 있어요? 귀하의 제안은 높이 평가됩니다.

답변

1

이 정확한 문제가있었습니다. 나는 web.config 파일에 URL을 저장하는 것을 끝내었다. 그래서 같은 광산을했다 :

<appSettings> 
    <!-- Urls --> 
    <add key="AppDomain" value="http://localhost:1273/" /> 
    <add key="ConfirmUrl" value="http://localhost:1273/Auth/Confirm/?code={0}" /> 
</appSettings> 

및 서비스 계층이처럼 전화 : 방금 구성 파일을 사용할 수없는 경우 스레드를 만들 때

string confirmUrl = string.Format(ConfigurationManager.AppSettings["ConfirmUrl"], confirmCode); 
+0

많은 실험을 거친 끝에 이것이 최상의 솔루션이라는 것을 알았습니다. Application_Start에서 System.Web.Mvc.UrlHelper를 사용하여 응용 프로그램 URL을 찾은 다음이를 싱글 톤의 정적 변수에 할당하거나 종속성 삽입을 사용하여 생성자 인수로 전달합니다. 그러나 예측할 수없는 오류는로드 균형 조정을 위해 프록시 서버베이스 URL을받는 것과 같이이 솔루션을 사용하여 작동합니다. 대상 서버 주소 (및 프로토콜)가 항상 런타임에 결정될 수 없기 때문에 구성이 최상의 솔루션 인 것처럼 보입니다. 미리 설정하는 것이 가장 좋습니다. Thanks Shawn :) – Nautic20

0

,의 ThreadStart 대리자를 사용 새로운 스레드에 필요한 기본 정보를 제공합니다.

+0

나는 이것에 대해서도 생각했다. 그러나 웹 요청이 아닌 다른 것이 service method를 호출하면 어떨까? 또는 창백한 푸른 하늘을위한 작업자 역할과 같은 것입니다. (글쎄, 내 경우 어쨌든). –

+0

@Shawn Mclean과 동의합니다. 이 경로에서 상황에 접근하면 기본 URL을 가져 오는 HttpContext를 호출하는 이상적인 시점은 ThreadStart가 아니기 때문입니다. 그 이유는이 시간에 사용할 수없는 리소스가 있다고 가정하기 때문입니다. Application_Start에서 기본 URL을 얻는 것이 더 좋아졌습니다. 이는 요청 중에 발생하며 이벤트를 이벤트 핸들러에 등록 할 때와 같은 시간입니다. – Nautic20

관련 문제