2009-09-29 2 views
2

HTTP 요청에 의해 트리거 된 비동기 작업에서 사용할 HTML 블록을 생성해야합니다. HTTP 요청, HTML 블록을 매개 변수로 사용). 이미 HTML을 생성하는 .aspx 페이지가 있으며이 코드를 다시 사용하고 싶습니다..aspx 페이지를 ASP.NET 3.5 HTTP 요청 이외의 HTML 템플리트로 사용

나는 내가하고 싶은 어느 것도 세 가지 옵션을 참조하십시오

  1. 다시 쓰기 HTML을 반환하는 .NET 기능으로 .aspx 페이지에서 현재 기능을. 나는 절대적으로 필요한 경우가 아니라면 다시 쓰는 시간을 보내고 싶지 않습니다. 또한 HTML을 생성하는 .NET 코드는 .aspx 태그보다 유지 관리가 훨씬 적습니다 (예, XML 리터럴에서도 가능).
  2. HTML 블록이 필요한 경우 로컬 서버의 .aspx 페이지에 HTTP 요청을하십시오. 이것의 비효율은 나에 관한 것이 아니지만 설계 타협이 그렇습니다. 응용 프로그램이 어떻게 구성되어 있는지의 때문에 나는 쓰레기에 내 .ASPX 코드를했을 :

    경우 (localRequest)
    {doOneThing();}
    다른
    {doTheOtherThing();}

    나는하고 싶지 않습니다.

  3. 이러한 HTML 청크를 추출하기 위해 ASP.NET 응용 프로그램 호스트를 만듭니다. 나는 이것이 2의 효율성을 향상시킬 것이지만 복잡하지는 않을 것이라고 생각한다.

다른 대안이 있습니까? 이상적인 방법은 .aspx 페이지 클래스를 인스턴스화하고 조롱 된 HttpRequest 또는 HttpContext로이를 실행하는 것입니다. 이것이 완료 될 수 있으며, 번거 로움의 가치가 있습니까?

가) 어떻게 비동기 작업이 HttpContext를 유효한이 있는지 확인 않습니다

답변

3

이 문제에 대한 두 개의 관련된하지만 별개의 부품이?

b) ASPX 실행의 HTML 출력을 문자열로 반환하는 방법은 무엇입니까?

(a)의 경우 비동기 작업을 호출하는 방법에 따라 다릅니다. 불행히도 .NET에는 quite a few ways to do async operations이 있습니다. 그러나 비동기 코드에 HttpContext를 전파하려면 Event-based Asynchronous Pattern이라는 단 하나의 좋은 옵션 만 있습니다. IMHO 이벤트 기반 비동기 패턴에는 몇 가지 단점이 있지만 (예 : "대기"작업, 여러 스레드를 동기화하기 어렵고 코드를 리팩터링해야하는 등) 단점이 있습니다. ASP.NET 비동기 페이지와 완벽하게 통합되는 것은 정말 멋진 일입니다. 콜백이 제어 될 때 올바른 컨텍스트가 설정되도록합니다.

즉, ASP.NET 비동기 페이지에 대해 설정된 규칙에 따라 작업하는 경우 전파하는 컨텍스트는 작동합니다 (많은 추가 작업을 수행하지 않아도 됨). 익숙하지 않은 경우 async pages에 대한 기사가 있습니다. 유용한 정보는 another post입니다. 3 단계로 간단히 말해서, 당신 분할 페이지 처리 : 1) 장기 실행 작업 2 설정) 장기 실행 작업을 킥오프 (예 3) ASP.NET은 Page_PreRenderComplete 핸들러를 호출합니다) 비싼 데이터를 얻을 수 있습니다 모든 장기 실행 작업이 완료되면 여기에서 데이터를 바인딩하고 HTML을 렌더링 할 수 있습니다.

데이터 바인딩에서 데이터를 가져 오는 작업을 분리해야하기 때문에 기존 코드를 다시 고려해야 할 필요가 있습니다.

위의 (b)에 대해 : 일단 컨텍스트가 있으면 다른 질문은 페이지 출력을 문자열로 가져 오는 방법입니다. 이 작업을 수행하는 데는 몇 가지 방법이 있지만 가장 쉬운 방법은 사용자 정의 컨트롤 (.ASCX)에 출력 할 항목을 캡슐화 한 다음이 블로그 게시물의 지침 (http://stevesmithblog.com/blog/render-control-as-string/)을 따르는 것입니다. 데이터 바인딩이 필요한 경우 this post을 참조하십시오.

+0

매우 명확하고 잘 참조 된 대답입니다. 불행히도, 나는 당신의 파트에서 비동기 페이지 작업에 필요한 규칙에 따라 플레이하지 않는다고 생각합니다. 그러나 파트 b)에 대한 솔루션은 내가 필요한 것입니다. 많은 감사합니다. – Alex

+0

감사합니다! BTW, 위의 (b)는 비동기 스레드에서 유효한 HttpContext를 얻는 방법의 문제에 대한 마법 해결책이 아님을 명심하십시오. ASP.NET 비동기 페이지 (또는 마지막에 무거운 힘든 부분) 만 컨텍스트를 다른 스레드에 올바르게 전달할 수 있습니다. 즉, (b)를 가지고 있기 때문에 이제는 다른 스레드가 필요하지 않으면 모든 것이 설정되어 있습니다! –

+0

매우 유용한 링크, 저스틴, 감사합니다. 내가 필요한 것! – EMP