다시로드하지 않고 .NET 웹 사이트 업데이트


13

나는의 웹 사이트 개발에 사용 PHP하고 ASP classic뭔가 필요가 변경 될 경우를. 단일 / 여러 파일을 변경하면 아무도 눈치 채지 못할 것입니다. 누군가 업로드하는 동안 변경된 파일을 요청하는 경우 아마도 0.5 초 마진과 같습니다. 문제가없는 대부분의 소규모 사이트에 적합합니다.

그러나 최신 사이트는 빌드되어 C# MVC있으며 코드를 변경할 때 웹 사이트를 다시 빌드하고 변경된 DLL파일을 업로드해야 합니다. 그러나 DLL파일 을 변경하면 웹 사이트가 다시 시작되고 모든 활성이 재설정됩니다 sessions. 또한 모든 것을 다시로드해야하며 큰 사이트에서는 모든 것을로드하는 데 몇 분이 걸릴 수 있습니다. 사이트를 탐색 한 모든 사람이 알림을 받고 다시 로그인해야합니다.

주요 사이트 업데이트는 그다지 일반적이지 않으므로 문제가되지 않습니다. 그러나 프로모션에 대한 "소규모"업데이트는 정기적입니다. '이 양식을 작성하고 3 개월 무료 멤버십을 받으십시오'또는 '... 드리프트 할 것 같아요. 일부 프로모션은 비슷하며 설정에 따라 올바른 정보를 표시하는 모듈로 처리 할 수 ​​있지만 종종 사용자 지정 코드가 필요합니다.

나는 각각의 홍보가 자신의있는 시스템의 생각 DLL인터페이스를 기반으로 파일, 다음로드 DLL사용하여 동적를 Type.GetType, Activator.CreateInstance하고 InvokeMember. 그것이 효과가 있지만 그것이 올바른 방법인지 궁금합니다.

그래서 내 질문 : .NET전체 사이트를 다시로드하고 세션을 삭제하지 않고 (재활용 응용 프로그램 풀과 같은) 사이트를 어떻게 즉시 업데이트합니까?


바운티 의견에 대한 응답으로, 내가 작업하는 대규모 웹 사이트는로드 밸런서 및 프로세스 외부 세션을 통해 코드의 큰 변경을 처리하는 것과 동일한 방식으로 코드의 작은 변경을 처리합니다. 검토 / 사인 오프 프로세스를 통해 서버에 코드를 드롭 할 수 없습니다. 나는 "큰"우리의 정의를 생각과 일치하지 않을 수 있습니다)
Zhaph - 벤 Duguid로

답변:


11

"응용 프로그램 초기화" IIS 7.5, Windows 2008 R2 (설치하기 더 어렵다) IIS 8, Windows 2012를 살펴보십시오.

앱 초기화를 통해 모든 응용 프로그램 (사이트가 아닌 응용 프로그램 풀)을 다시 시작하고 이전 응용 프로그램을 사용하면서 새 응용 프로그램 시작을 예열하면서 이전 응용 프로그램을 계속 실행할 수 있습니다. 새 응용 프로그램이 회전되면 (설정 가능한 URL로 결정) 새 응용 프로그램을 사용하기 시작하고 이전 응용 프로그램을 종료합니다. 응용 프로그램 풀을 다시 시작해도 세션이 유지되도록하는 방법과 함께 앱 초기화를 사용하면 사이트를 완벽하게 재부팅 할 수 있습니다. (Zhaph에는 머신 키에 대한 참고 사항이 있습니다.)

앱 초기화 구성에 대한 위의 링크 외에도 사이트 다시 시작이 응용 프로그램 초기화를 사용하지 않기 때문에 사이트 다시 시작이 트리거되는 항목을 살펴 보고자합니다.

DLL 업데이트가 사이트 다시 시작을 즉시 트리거하거나 web.config (사이트와 관련된 httpRuntime 및 외부 구성 파일의 높은 ChangeNotification 값)를 변경하지 않도록 IIS를 구성 할 수 있습니다.

최종 결과는 사이트를 다시 시작하지 않고도 DLL / 코드를 업데이트 한 다음 코드를 매끄럽게 변경하기 위해 AppInitialization 백그라운드를 사용 하는 을 강제로 다시 시작할 수 있다는 것입니다.

콘서트에서 이러한 작업을 수행하면 원활하게 다시 시작할 수 있습니다.


이 단계의 좋은 세트 - : 고려 확실히 뭔가
Zhaph - 벤 Duguid로

이것은 내가 찾던 것 같습니다. 시도해보고 설정하려고합니다. 감사합니다
휴고 Delsing

@HugoDelsing 희망이 당신을 위해 잘 작동합니다.
jeffreypriebe

감사합니다. 이것은 내가 결국 사용했으며 훌륭하게 작동합니다.
Hugo Delsing

@HugoDelsing 다행이 당신에게도 효과가 있다고 들었습니다.
jeffreypriebe 2019

5

요청한 내용을 처리하는 여러 가지 방법과 질문에 대한 몇 가지 다른 측면이 있습니다.

프로모션을위한 작은 업데이트 처리

실제로 여기에 오는 것은 컨텐츠 관리 시스템 또는 이와 유사한 것이므로 즉시 편집 할 수 있습니다 (Wordpress / Drupal 또는 .NET 관점 N2 CMS, Umbraco, Orchard 등). 그 길을 따라 가지 않았다면 시도해 볼 수있는 것들이 있습니다.

ASP.NET은 특정 유형의 파일 (web.config (s), 주로 폴더 /bin//app_code/폴더 의 내용)을 터치하는 경우에만 실제로 다시로드되므로 "기타 파일 변경"에 대한 구성 가능한 제한이 있습니다 (기본적으로 수정 한 후에는 사이트 내 많은 파일이 응용 프로그램 풀에서 다시 시작됩니다.- 필요에 따라 가져 와서 표시하는 NumRecompilesBeforeAppRestart정적 .html파일 (예 :)에 대해 다른 폴더를 검사 하거나 LoadControl문자열 경로를 사용하는 방법을 활용하는 작업 을 수행 할 수 있습니다. .ascx사용자 제어 및 동적으로로드합니다 - 당신이 쇼에 다른 질문이 더 적합에 StackOverflow에 대한인지를 결정하는 방법은 - 그러나 나는 명명 규칙 기반 솔루션을 권하고 싶습니다.

플러그인 기반 아키텍처를 작성하고 디렉토리 외부에서 폴더를 지정 하여 모니터링 할 수 있는 Managed Extensibility Framework (MEF-버전 4 이후 .NET 프레임 워크의 전체 부분 임) 와 같은 것을 사용하여 조사 할 수도 있습니다. /bin/새로운 .DLL-앱 다시 시작 문제를 피할 수 있는지 확인하지는 않았지만 웹 환경에서 사이트에 공통 기능을 추가하는 데 효과적이었습니다.

그것이 호소력이 없다면, 내가 생각할 수있는 유일한 다른 옵션은 클래식 ASP에서와 같이 컨트롤을 "전면 코드"로 추가하는 것입니다. 즉 <script runat="server">컴파일 된 "코드 숨김"클래스 대신 블록이 있습니다. 컨트롤을 실행하는 논리가 포함되어 있습니다-컨트롤이 즉시 컴파일 될 때 처음으로 성능이 저하되는 대신 DLL 변경이 필요 NumRecompilesBeforeAppRestart하지 않습니다. 작은 변화를 많이하고 있습니다.

앱을 다시 시작할 때 세션을 어떻게 유지합니까?

이는 해결하기 쉬운 문제 일 수 있으며 다음 세 가지 주요 단계가 포함됩니다.

  1. MachineKey (IIS7이지만 여전히 8을 유지) 를 일정한 값으로 구성 AutoGenerate하십시오. 이는 AppPool이 재활용 될 때 동일한 키를 사용하므로 이전부터 세션 쿠키, viewstate 등을 해독 할 수 있음을 의미합니다. 재활용.
  2. 어느 설치 국가 서버 또는 세션 상태를 저장하기위한 데이터베이스를 구성합니다 .
  3. web.config에서 SessionState 요소 를 사용 하거나 사용하지 InProc않도록 전환 합니다.StateServerSQLServer

이렇게하면 앱을 다시 시작한 후에도 지속되는 영구 세션이 생깁니다. 그러나 이것들은 "무료"가 아닙니다. 세션에 저장 한 모든 것은 직렬화 할 수 있어야하며, 각 페이지로드에 이제 추가 네트워크 트립이 필요하고 세션 데이터를 공개해야하기 때문에 약간의 성능 저하가 발생합니다.

그러나 배포 후 응용 프로그램을 다시 시작하는 데 "몇 분"이 걸리는 위치에 있으면로드 균형 조정 환경으로 이동하거나 최소한 핫 스왑 가능한 준비 / 라이브 설정으로 이동하는 것이 좋습니다 (Azure / AWS / etc에서 제공하는 것과 같은)-이 방법으로 서버를 업데이트하는 동안 서버를 오프라인 상태로 만들거나 새 코드로 준비한 다음 스왑 할 수 있습니다-공유 주소 지정 단계를 수행 한 경우 세션 (위 참조)은 사용자에게 영향을 미치지 않고 정상적으로 작동합니다.


긴 답변 주셔서 감사합니다. 불행히도 CMS내가 원하는 것이 아닙니다. 콘텐츠를 변경하고 싶지 않고 코드를 변경하고 싶습니다. 세션에 대한 부분은 단지 예일뿐입니다. DLL파일을 다시로드 할 때 사이트를 1-2 분 동안 다운시키는 문제는 해결되지 않습니다 . 그 MEF부분은 흥미로 웠지만 내가 생각한 시스템에 대한 타사 솔루션입니다. 노력에 +1하지만 불행히도 실제로 내 질문에 대한 답변은 아닙니다.
휴고 Delsing

1
MEF는 MS에 의해 릴리스되었으며 v4 이후 .NET 프레임 워크의 전체 부분이되었습니다. 새로운 컨트롤에 프론트 인 코드를 사용해 보거나,로드 밸런싱 / 스테이징 라이브 설정을 채택하여 서버를 가동 한 후 스왑 할 수 있습니다.
Zhaph-Ben Duguid

1
Application Initialization을 사용하는 대체 솔루션을 설명했습니다. 이점은 특수한로드 밸런싱 또는 동적로드 제어없이 모든 코드 및 서버 설정이 "정상"이므로 실행 환경이 더 단순 해집니다. 물론로드 밸런싱 / 스테이지 라이브 설정은 다른 이유로 유용 할 수 있습니다.
jeffreypriebe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.