문제

나는 이것을 구글을 시도하고 조금 짧게 나왔기 때문에 여기 누군가가 그 주제에 대해 약간의 빛을 발할 수있을 것입니다.

ASP.NET에서 URL 재 작성 목적으로 "~/images"서버 경로 구문을 활용하려면 runat = "Server"속성을 사용하여 응용 프로그램의 모든 이미지 및 기타 리소스를 선언하고 싶습니다. LOCAHOST의 디버깅은 상대 경로를 사용하는 경우 (URL 재 작성을 사용할 때) 특히 어렵습니다. 이 문제를 다소 극복하기 위해 호스트 파일을 수정할 수 있지만, 우리가 작업하는 프로젝트의 양으로 인해 불가능합니다.

runat 서버에 HTML 컨트롤을 선언하면 일반적으로 데이터 지속성을 활성화하기 위해 ViewState에 추가되지만 이미지와 관련이 없거나 이에 관해서는 잘못 되었습니까?

또한 ASP 넷 런타임 엔진이 처리 및 처리 할 컨트롤이 더 많다는 것을 알고 있지만, 이것이 실제로 심각한 성능 배출입니까?

이러한 방식으로 이미지를 선언하는 데 심각한 오버 헤드가 있습니까? 그렇다면 누군가가 성능 노크의 대부분이 어디에서 나올지 정확히 설명 할 수 있습니까?

미리 감사드립니다.

도움이 되었습니까?

해결책

다음의 차이점을 요구한다고 가정합니다.

1) <img runat="server" EnableViewState="false" src="~/images/img.png" />

그리고

2) <img src='<%= ResolveUrl ("~/images/img.png") %>' />

1)을 빌드하려면 생성 된 실제 코드 (다소)는 다음과 같습니다.

System.Web.UI.HtmlControls.HtmlImage __ctrl;
__ctrl = new System.Web.UI.HtmlControls.HtmlImage();
this._bctrl_1 = __ctrl;
__ctrl.EnableViewState = false;
__ctrl.Src = "~/image.png";

그런 다음 __ctrl이 제어 트리에 추가됩니다.

__parser.AddParsedSubObject(this._bctrl_1); // _bctrl_1 is __ctrl from above

페이지 라이프 사이클 (Init, Load ...)의 모든 이벤트는이 컨트롤로 전파되며 HTML을 가져 오려면 RenderControl이 호출되며 ResolveUrl ()는 실제 URL을 얻기 위해 호출됩니다. 또한 부름을받을 것입니다.

이제 경우 2), 제어는 부모에게 정상적인 방법으로 추가되지 않지만 대신 다음과 같은 것을 얻습니다.

__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.__RenderTree));

그것은 렌더링 할 때 호출 될 대의원을 설정하고 있습니다.u003Cimg> . __rendertree에서 우리가 관심있는 태그를 작성하는 부분은 다음과 같습니다.

__output.Write("\n<img src='");
__output.Write( ResolveUrl ("~/image.png") );
__output.Write("' />\n");

그렇습니다. 1) 2)에서 실행되는 코드가 많이 실행됩니다. 이제 실제 실행 시간에 미치는 영향에 관한 한 나는 이것이 그다지 큰 거래가 아니라고 생각합니다. IMG 태그/컨트롤만으로 빈 페이지를 테스트했으며 여러 런에서의 차이는 요청 당 -0.5ms/+0.5ms 범위에있었습니다. 완전히 무시할 수 있습니다.

다른 팁

중요한 것이 있습니다 상대적인 모든 ViewState Marlarky를 끄는 것을 가정하더라도 오버 헤드. 그러나, 그 순수한 비용은 아마도 개별 사용자가 받아 들일 수 없을 것입니다.

일련의 HTML 요소를 설명하는 마크 업을 고려하면 페이지 렌더의 적절한 지점에서 전체 내용을 응답으로 매우 효율적으로 보냅니다.

모든 객체 생성, 스타일 요소의 구문 분석, 검증 등의 구문 분석 및 로컬 상태의 생성으로 전체 컨트롤로 생성되는 모든 동일한 요소와 비교하십시오. 그런 다음 코드는 로컬 상태를 취하기 위해 실행되며 ASP.NET 페이지에서 우선 동일한 HTML 마크 업을 렌더링합니다.

많은 runat = "Server"를 사용하는 메모리 및 CPU 측면에서 분명히 더 비싸다. 개별 경우 이것은 아마도 문제가되지 않지만 상당한 활동이있는 사이트의 경우 가능할 수 있습니다.

더 큰 사이트의 일부 가상 디렉토리에 배치 될 애플리케이션을 개발하는 경우 이미지에 상대 경로를 사용하십시오.

자체 사이트에 대한 애플리케이션을 개발하는 경우 프로젝트 또는 사이트 속성에서 개발자 웹 서버 범주의 가상 경로를 "/"로 수정하십시오. 이렇게하면 디버깅 할 때 URL에 추가 / MyProjectName / Part가 없습니다. 이를 통해 일부 자산 또는 이미지 폴더에 대한 절대 경로를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top