2013-09-28 5 views
2

Web Forms 프로젝트를 만들면 코드 숨김이 IIS 서버에서 처리되는 DLL로 컴파일됩니다. Javascript를 사용하면 브라우저에서이를 해석하므로 Chrome 개발자 도구 또는 소스를 검사하여 찾을 수 있습니다.면도기 코드는 어디에 있습니까?

그러나 Razor 구문을 사용하여 ASP.NET 웹 페이지를 만들면 어디에서나 코드를 찾을 수 없습니다. 컴파일 할 필요가 없으므로 DLL에 저장되지 않으므로 Chrome의 검사 도구를 사용하여 DLL의 추적을 찾을 수 없습니다.

그래서 면도기 코드는 어디로 이동합니까?

답변

8

실제로 런타임에 컴파일됩니다.

C:\Windows\Microsoft.NET\Framework64\<version>\Temporary ASP.NET Files\<app>\ 

또한 귀하의 의견에 오류를 감지 할 수있는 프로젝트의 나머지와 함께 컴파일을 활성화 할 수 있습니다 : 당신은 컴파일 된 웹 형태로 배치되어 같은 장소에서 생성 된 코드 파일 및 임시 DLL을 찾을 수 있습니다. 참조 : Can Razor views be compiled?. 이것은 (내 경험으로) 솔루션의 컴파일 시간을 증가 시키지만, 런타임까지는 눈에 띄지 않는 오류를 감지하는 데는 좋습니다. 필요할 때 스위치를 켭니다.

면도기 파서/생성기 코드는 System.Web.Razor 프로젝트/어셈블리에 포함되어 있습니다 (MVC 소스의 일부로 사용 가능). 최종 결과는 C# 클래스이므로 C# 컴파일러는 다른 클래스와 마찬가지로 처리 할 것입니다.

보기 용으로 생성 된 코드는 다음과 같습니다 (내 프로젝트 중 하나의 "재설정 암호"페이지에서 발췌 한 것).

namespace ASP { 
    using System; 
    using System.Collections.Generic; 
    using System.IO; 
    using System.Linq; 
    using System.Net; 
    using System.Web; 
    using System.Web.Helpers; 
    using System.Web.Security; 
    using System.Web.UI; 
    using System.Web.WebPages; 
    using System.Web.Mvc; 
    using System.Web.Mvc.Ajax; 
    using System.Web.Mvc.Html; 
    using System.Web.Routing; 

    public class _Page_Areas_Anonymous_Views_Home_ResetPassword_cshtml : System.Web.Mvc.WebViewPage<Web.UI.Areas.Anonymous.ResetPasswordViewModel> { 

#line hidden 

     public _Page_Areas_Anonymous_Views_Home_ResetPassword_cshtml() { 
     } 

     protected ASP.global_asax ApplicationInstance { 
      get { 
       return ((ASP.global_asax)(Context.ApplicationInstance)); 
      } 
     } 

     public override void Execute() { 

    const string title = "Reset Password"; 
    ViewBag.Title = title; 


BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 302, 63, true); 

WriteLiteral("</h1>\r\n   </div>\r\n  </div>\r\n </div>\r\n <div"); 

EndContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 302, 63, true); 

BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 365, 12, true); 

WriteLiteral(" class=\"two\""); 

EndContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 365, 12, true); 

BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 377, 15, true); 

WriteLiteral(">\r\n  <div"); 

EndContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 377, 15, true); 

BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 392, 19, true); 

WriteLiteral(" class=\"banner-box\""); 

EndContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 392, 19, true); 

BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 411, 5, true); 

WriteLiteral(">\r\n\r\n"); 

      #line default 
      #line hidden 

      using(@Html.BeginForm("ResetPassword", "Home", FormMethod.Post, new { id = "main-form" })) 
      { 

       Write(Html.ValidationSummary()); 

// etc. etc. Even simple views result in a large code file 
2

당신이 면도기, 기존의 코드 숨김 (별도의 파일)을 사용하거나 인라인 HTML 및 C#, 더 또는 덜 같은 일이 일어나고으로 .aspx로 여부. 그것은 모두 서버 측 코드로 변환되어 서버 측에서 실행되며 런타임시 HTML (및 소스 페이지에는 표시되지 않는 삽입 된 자바 스크립트)을 방출합니다. 원본 페이지의 HTML은 클라이언트에 보낼 페이지를 생성 할 때 서버 쪽 코드에서 사용하는 텍스트 청크가됩니다.

일반적으로 서버는 페이지를 컴파일하고 컴파일 된 코드를 실행합니다. "해석 된"것으로 보이는 것은 실제로 첫 번째 페이지로드시에 JIT 파일로 컴파일되고 후속 페이지로드를 위해 메모리에 캐시됩니다.

사이트의 임의의 페이지에 대해 컴파일 된 결과가 없다면 아마 페이지가 JIT (just-in-time) 컴파일되고 실제로 dll에 쓰여지지 않았기 때문일 수 있습니다.

+0

사실, dll은 JIT 컴파일 프로세스의 결과로 생성됩니다. 아무것도 메모리에 캐시되지 않습니다. –

관련 문제