asp.net 코어 mvc는 의사 정적 기능을 구현합니다.
이 글은 pseudo-static 기능을 구현하기 위한 asp.net core mvc 관련 정보를 주로 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.
대규모 웹사이트 시스템에서 시스템 액세스 성능을 향상시키기 위해 쇼핑몰의 제품 세부 정보 페이지 및 뉴스 세부 정보 페이지와 같은 일부 간헐적 콘텐츠가 정적 페이지로 게시되는 경우가 많습니다. 이 정보가 게시되면 계속 사용하는 경우 변경 빈도가 그리 높지 않습니다. 동적 출력을 통해 처리하게 되면 서버에 막대한 자원 낭비가 발생하게 됩니다. 하지만 이러한 콘텐츠에 대한 정적 페이지를 독립적으로 만들 수는 없으므로 시스템에서 의사 정적 처리를 사용할 수 있습니다. 의사 정적이 무엇인지는 Baidu에서 검색할 수 있습니다. asp.net core mvc에서 pseudo-static을 구현하는 방법을 소개하겠습니다.
MVC 프레임워크에서 view는 뷰를 나타내며, 그 실행 결과는 최종적으로 클라이언트 브라우저에 출력되는 html, css, js 등의 콘텐츠입니다. 정적화를 구현하려면 뷰 실행 결과를 정적 파일로 저장하고 디스크, 분산 캐시 등 지정된 위치에 저장해야 다음 번에 저장된 내용을 직접 읽을 수 있습니다. 액세스하면 비즈니스 로직을 다시 실행할 필요가 없습니다. 그렇다면 이러한 기능을 달성하려면 asp.net core mvc가 무엇을 해야 할까요? 대답은 필터를 사용하는 것입니다. MVC 프레임워크에서는 여러 필터 유형이 제공됩니다. 여기서는 작업 필터를 사용하겠습니다. 작업 필터는 작업이 실행되기 전과 작업이 실행된 후의 두 가지 시점을 제공합니다. 작업이 실행되기 전에 먼저 정적 페이지가 생성되었는지 확인할 수 있습니다. 생성된 경우 파일 내용을 직접 읽고 출력할 수 있으며 후속 논리는 건너뜁니다. 프로덕션이 없으면 계속해서 아래로 내려가 액션이 실행된 후 이 단계에서 결과를 캡처한 다음 결과에 의해 생성된 정적 콘텐츠를 저장합니다.
그런 다음 특정 구현 코드를 살펴보겠습니다. 먼저 StaticFileHandlerFilterAttribute를 호출하는 필터 유형을 정의합니다. 이 클래스는 프레임워크에 제공된 ActionFilterAttribute에서 파생되며 기본 클래스에서 제공하는 두 가지 메서드를 재정의합니다. OnActionExecuted(액션 실행 후), OnActionExecuting(액션 실행 전), 구체적인 코드는 다음과 같습니다.
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class StaticFileHandlerFilterAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext context){} public override void OnActionExecuting(ActionExecutingContext context){} }
OnActionExecuting에서는 다음을 수행해야 합니다. 정적 콘텐츠가 생성되었는지 확인합니다. 그렇다면 직접 출력 콘텐츠를 생성하고 로직은 다음과 같이 구현됩니다.
//按照一定的规则生成静态文件的名称,这里是按照area+"-"+controller+"-"+action+key规则生成 string controllerName = context.RouteData.Values["controller"].ToString().ToLower(); string actionName = context.RouteData.Values["action"].ToString().ToLower(); string area = context.RouteData.Values["area"].ToString().ToLower(); //这里的Key默认等于id,当然我们可以配置不同的Key名称 string id = context.RouteData.Values.ContainsKey(Key) ? context.RouteData.Values[Key].ToString() : ""; if (string.IsNullOrEmpty(id) && context.HttpContext.Request.Query.ContainsKey(Key)) { id = context.HttpContext.Request.Query[Key]; } string filePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", area, controllerName + "-" + actionName + (string.IsNullOrEmpty(id) ? "" : ("-" + id)) + ".html"); //判断文件是否存在 if (File.Exists(filePath)) { //如果存在,直接读取文件 using (FileStream fs = File.Open(filePath, FileMode.Open)) { using (StreamReader sr = new StreamReader(fs, Encoding.UTF8)) { //通过contentresult返回文件内容 ContentResult contentresult = new ContentResult(); contentresult.Content = sr.ReadToEnd(); contentresult.ContentType = "text/html"; context.Result = contentresult; } } }
OnActionExecuted에는 액션 결과 유형이 ViewResult인지 확인하는 코드인 경우 이 결과를 실행하고, 위와 동일한 규칙에 따라 정적 페이지를 생성합니다
//获取结果 IActionResult actionResult = context.Result; //判断结果是否是一个ViewResult if (actionResult is ViewResult) { ViewResult viewResult = actionResult as ViewResult; //下面的代码就是执行这个ViewResult,并把结果的html内容放到一个StringBuiler对象中 var services = context.HttpContext.RequestServices; var executor = services.GetRequiredService<ViewResultExecutor>(); var option = services.GetRequiredService<IOptions<MvcViewOptions>>(); var result = executor.FindView(context, viewResult); result.EnsureSuccessful(originalLocations: null); var view = result.View; StringBuilder builder = new StringBuilder(); using (var writer = new StringWriter(builder)) { var viewContext = new ViewContext( context, view, viewResult.ViewData, viewResult.TempData, writer, option.Value.HtmlHelperOptions); view.RenderAsync(viewContext).GetAwaiter().GetResult(); //这句一定要调用,否则内容就会是空的 writer.Flush(); } //按照规则生成静态文件名称 string area = context.RouteData.Values["area"].ToString().ToLower(); string controllerName = context.RouteData.Values["controller"].ToString().ToLower(); string actionName = context.RouteData.Values["action"].ToString().ToLower(); string id = context.RouteData.Values.ContainsKey(Key) ? context.RouteData.Values[Key].ToString() : ""; if (string.IsNullOrEmpty(id) && context.HttpContext.Request.Query.ContainsKey(Key)) { id = context.HttpContext.Request.Query[Key]; } string devicedir = Path.Combine(AppContext.BaseDirectory, "wwwroot", area); if (!Directory.Exists(devicedir)) { Directory.CreateDirectory(devicedir); } //写入文件 string filePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", area, controllerName + "-" + actionName + (string.IsNullOrEmpty(id) ? "" : ("-" + id)) + ".html"); using (FileStream fs = File.Open(filePath, FileMode.Create)) { using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8)) { sw.Write(builder.ToString()); } } //输出当前的结果 ContentResult contentresult = new ContentResult(); contentresult.Content = builder.ToString(); contentresult.ContentType = "text/html"; context.Result = contentresult; }
위에서 언급한 Key에 대해 해당 속성
public string Key { get;set; }
을 직접 추가하여 사용할 수 있습니다. 이 필터를 사용하는 방법: 컨트롤러 또는 컨트롤러 메서드에 [StaticFileHandlerFilter] 속성을 추가합니다. 다른 키를 구성하려면 [StaticFileHandlerFilter(Key="set value")]
를 사용할 수 있습니다. 정적화가 구현되었지만 여전히 업데이트를 고려해야 합니다. 기사가 백그라운드에서 업데이트되면 정적 페이지를 업데이트해야 합니다. 하나는 콘텐츠가 업데이트될 때 해당 정적 페이지를 동기적으로 삭제하는 것입니다. 백그라운드에서. 여기서는 또 다른 예약 업데이트를 소개합니다. 이는 정적 페이지에 특정 유효 기간이 있으며 이 유효 기간이 지나면 자동으로 업데이트된다는 의미입니다. 이 로직을 구현하려면 OnActionExecuting 메서드에서 정적 페이지 생성 시간을 가져온 다음 이를 현재 시간과 비교하여 만료되지 않았는지 확인해야 합니다. 만료된 경우 다음 논리를 계속 실행합니다. 구체적인 코드는 다음과 같습니다.
//获取文件信息对象 FileInfo fileInfo=new FileInfo(filePath); //结算时间间隔,如果小于等于两分钟,就直接输出,当然这里的规则可以改 TimeSpan ts = DateTime.Now - fileInfo.CreationTime; if(ts.TotalMinutes<=2) { using (FileStream fs = File.Open(filePath, FileMode.Open)) { using (StreamReader sr = new StreamReader(fs, Encoding.UTF8)) { ContentResult contentresult = new ContentResult(); contentresult.Content = sr.ReadToEnd(); contentresult.ContentType = "text/html"; context.Result = contentresult; } } }
이 시점에서 pseudo-static이 달성됩니다. 현재의 처리 방식은 접속 성능을 어느 정도 향상시킬 수 있지만 대규모 포털 시스템에서는 충분하지 않을 수 있습니다. 위에서 소개한 방법에 따르면 다른 기능 확장이 가능하다. 예를 들어 정적 페이지를 생성한 후 CDN에 게시하거나 별도의 콘텐츠 서버에 게시하는 등의 작업을 수행할 수 있다. 방법이 무엇이든 구현 아이디어는 동일합니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.
의사 정적 기능을 구현하는 asp.net 코어 mvc와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C 언어에서 특수 문자는 다음과 같은 탈출 시퀀스를 통해 처리됩니다. \ n 라인 브레이크를 나타냅니다. \ t는 탭 문자를 의미합니다. char c = '\ n'과 같은 특수 문자를 나타 내기 위해 탈출 시퀀스 또는 문자 상수를 사용하십시오. 백 슬래시는 두 번 탈출해야합니다. 다른 플랫폼과 컴파일러마다 다른 탈출 시퀀스가있을 수 있습니다. 문서를 참조하십시오.

C에서 숯 유형은 문자열에 사용됩니다. 1. 단일 문자를 저장하십시오. 2. 배열을 사용하여 문자열을 나타내고 널 터미네이터로 끝납니다. 3. 문자열 작동 함수를 통해 작동합니다. 4. 키보드에서 문자열을 읽거나 출력하십시오.

C 언어 커버 산술, 할당, 조건, 논리, 비트 연산자 등의 기호의 사용 방법은 기본 수학 연산에 사용되며, 할당 연산자는 할당 및 추가, 곱하기, 분할 할당에 사용되며, 곱하기 및 분할 할당에 사용되며, 조건에 따라 조건 운영자가 사용되며, 비트 오퍼레이터에 사용되며, 스페셜 오퍼레이터는 비트 수준의 운영에 사용됩니다. 포인터, 파일 종료 마커 및 비수통 값.

C 언어에서 char와 wchar_t의 주요 차이점은 문자 인코딩입니다. char ascii를 사용하거나 ascii를 확장하고, wchar_t는 유니 코드를 사용합니다. Char는 1-2 바이트를 차지하고 WCHAR_T는 2-4 바이트를 차지합니다. Char는 영어 텍스트에 적합하며 WCHAR_T는 다국어 텍스트에 적합합니다. Char_t는 널리 지원되며, 컴파일러 및 운영 체제가 유니 코드를 지원하는지 여부에 따라 다릅니다. Char는 문자 범위가 제한되며 WCHAR_T는 더 큰 문자 범위를 가지며 특수 함수는 산술 작업에 사용됩니다.

멀티 스레딩과 비동기식의 차이점은 멀티 스레딩이 동시에 여러 스레드를 실행하는 반면, 현재 스레드를 차단하지 않고 비동기식으로 작업을 수행한다는 것입니다. 멀티 스레딩은 컴퓨팅 집약적 인 작업에 사용되며 비동기식은 사용자 상호 작용에 사용됩니다. 멀티 스레딩의 장점은 컴퓨팅 성능을 향상시키는 것이지만 비동기의 장점은 UI 스레드를 차단하지 않는 것입니다. 멀티 스레딩 또는 비동기식을 선택하는 것은 작업의 특성에 따라 다릅니다. 계산 집약적 작업은 멀티 스레딩을 사용하고 외부 리소스와 상호 작용하고 UI 응답 성을 비동기식으로 유지 해야하는 작업을 사용합니다.

C 언어에서 숯 유형 변환은 다른 유형으로 직접 변환 할 수 있습니다. 캐스팅 : 캐스팅 캐릭터 사용. 자동 유형 변환 : 한 유형의 데이터가 다른 유형의 값을 수용 할 수 있으면 컴파일러가 자동으로 변환됩니다.

char 어레이는 문자 시퀀스를 C 언어로 저장하고 char array_name [size]로 선언됩니다. 액세스 요소는 첨자 연산자를 통해 전달되며 요소는 문자열의 끝점을 나타내는 널 터미네이터 '\ 0'으로 끝납니다. C 언어는 strlen (), strcpy (), strcat () 및 strcmp ()와 같은 다양한 문자열 조작 함수를 제공합니다.

C 언어에는 내장 합계 기능이 없으므로 직접 작성해야합니다. 합계는 배열 및 축적 요소를 가로 질러 달성 할 수 있습니다. 루프 버전 : 루프 및 배열 길이를 사용하여 계산됩니다. 포인터 버전 : 포인터를 사용하여 배열 요소를 가리키며 효율적인 합계는 자체 증가 포인터를 통해 달성됩니다. 동적으로 배열 버전을 할당 : 배열을 동적으로 할당하고 메모리를 직접 관리하여 메모리 누출을 방지하기 위해 할당 된 메모리가 해제되도록합니다.
