2012-05-29 1 views
10

나는 과 함께 jQuery을 사용했습니다. 나는 msdn을 읽었으며, 나는 IHttpHandler.IsReusable 속성에 대해 이야기하고있다.일반 HttpHandler (ashx, IHttpHandler 인터페이스)는 언제 재사용 가능합니까?

다른 요청이 IHttpHandler 인스턴스를 사용할 수 있는지 여부를 나타내는 값을 가져옵니다.

"the IHttpHandler instance."이 무슨 뜻입니까? 사람들이 모두보고 사용할 수 있도록 모두 비슷하게 만들려고합니까? 동일한 것으로 다시 사용할 수 있습니까 무엇? (QueryString을, 쿠키, 등?)

내가 작성하는 경우이 :

public class MyHttpHandler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
     context.Response.Write(DateTime.Now.Ticks.ToString());  
     } 

     public bool IsReusable 
     { 
     get { return true; } 
     } 
    } 

는 각 요청이 자신의 - - 날짜 얻을 것이다 나타납니다 - Datetime 값입니다.

답변

12

예에서 어떤 주를 관리하지 않습니다. 누구나 ProcessRequest에 전화를 걸면 원하는만큼 동일한 시간대에 새로운 DateTime을 얻을 수 있습니다. 이 한

하지만 경우 :

private DateTime _dateTime = DateTime.Now; 

public void ProcessRequest(HttpContext context) 
{ 
    context.Response.Write(_dateTime); 
} 

를 핸들러 인스턴스가 인스턴스화 된 후 지금 당신은 동일한 응답을 할 때마다 얻을 것이다. ASP.NET이 매번 새로운 것을 생성하지 않는 한.

IsReusable은 처리기 클래스가 별도의 요청간에 공유 할 수있는 상태를 관리하는지 여부를 나타낼 수 있습니다. 공유하는 것이 좋지 않은 상태를 관리하는 경우 외부에서 멱등비가 될 가능성이 없으며 스레드로부터 안전하지 않을 수도 있습니다. 특정 처리기 구현에는 출력을 결정할 때 공유 할 수없는 일부 인스턴스 수준 변수가 있으므로 동일한 입력 조건을 사용하여 ProcessRequest을 호출해도 동일한 출력이 생성되지 않을 수 있습니다. (실제로, 기술적으로 현재 구현이 그 예입니다). 이 경우 인스턴스는 "재사용 할"수 없습니다. 그리고 ASP.NET은 예측 가능성을 보장하기 위해 매번 새 인스턴스를 생성해야합니다.

상태를 관리하지 않거나 (여기에있는 예와 같이) 상태가 "확실"인 매우 간단한 핸들러가있는 경우에는 IsResuable이 무의미 해 보일 수 있습니다. 그러나 매우 복잡한 처리기 (초기화하는 데 비용이 많이 들지만 공유 할 수있는 상태를 유지하는 핸들러 일 수도 있음)를 ASP.NET에 표시하여 성능을 위해 다시 사용할 수 있도록 할 수 있습니다.

+2

나는이 일에 대한 적절한 MSDN 문서를 찾을 수 없을 수 : 또한 요청 필자이 질문에 대한/ – IrishChieftain

+0

@IrishChieftain을 (그리고 어떤 좋은 asnwer 얻을 didnt가) -lousy MSDN documenetation ... http://stackoverflow.com을/questions/8298843/registerclients 스크립트 블록 매개 변수 - 실제 시나리오에서의 사용 –

+0

Branislav의 응답을 살펴보십시오. http://stackoverflow.com/questions/1507572/streaming-databased-images-using-httphandler – IrishChieftain

0

거기에 인스턴스 변수가 있다면 나는 수많은 호출에서 공유된다는 것을 알 수있을 것입니다. 그래서 여러분의 날짜 시간이 인스턴스 변수로 설정되어 있고 그것을 여러분의 processrequest에 반환한다면 반환 할 것이라고 생각합니다. 같은 값이지만 isreusable = false 인 경우 처리기의 새 인스턴스가 만들어 지므로 그렇지 않습니다.

1

바로 대답에 대한 링크를 게시 할 미안하지만 IsReusable의 큰 설명 :

IsReusable blog post

는 본질적으로 코드가 완전히 스레드에 안전 경우, 전원을 켜 그렇지 않은 경우를 둡니다. 그게 내가 그걸 모은 것.

0

분명히 메모리에 핸들러를 유지하고 여러 요청을 처리 할 수 ​​있습니다. false로 설정하면 들어오는 각 요청에 대해 핸들러의 새 인스턴스를 만들어야합니다.

public bool IsReusable 
{ 
    get 
    { 
     return true; 
    } 
} 
+0

예 ... 알고 있습니다. 질문 제목은 "진정한 용도 ..." –

+0

우리 사이의 언어 난이도 Royi, 당신이 정확히 무엇을 의미하는지 모르겠다 고 생각할 수 있습니까? – IrishChieftain

+0

... 나는 이미 속성 의미를 알고 있습니다. . ....하지만 진정한 또는 false로 결정해야만 진짜 시나리오 (샘플) 검색 메신저 .... –