다음을 통해 공유


ASP.NET MVC 및 Web API에서 ASP.NET Core MVC로 업그레이드

이 문서에서는 ASP.NET MVC 프로젝트를 ASP.NET Core MVC로 마이그레이션하는 방법을 보여줍니다. 이 프로세스에서는 ASP.NET MVC의 관련 변경 내용을 강조 표시합니다.

ASP.NET MVC에서 마이그레이션하는 것은 다단계 프로세스입니다. 이 문서에서는 다음을 다룹니다.

  • 초기 설정.
  • 기본 컨트롤러 및 뷰.
  • 정적 콘텐츠입니다.
  • 클라이언트 쪽 종속성.

구성 및 Identity 코드를 마이그레이션하려면 구성을 ASP.NET Core 로 마이그레이션하고 인증을 마이그레이션하고 Identity ASP.NET Core로 마이그레이션을 참조하세요.

Prerequisites

시작 ASP.NET MVC 프로젝트 만들기

Visual Studio에서 ASP.NET MVC 예제 프로젝트를 만들어 마이그레이션하십시오.

  1. 파일 메뉴에서 새로 만들기>프로젝트를 선택합니다.
  2. ASP.NET 웹 애플리케이션(.NET Framework)을 선택한 다음, 다음을 선택합니다.
  3. 네임스페이스가 다음 단계에서 만든 ASP.NET Core 프로젝트와 일치하게 프로젝트 WebApp1 의 이름을 지정합니다. 선택하고생성합니다.
  4. MVC를 선택한 다음 만들기를 선택합니다.

ASP.NET Core 프로젝트 만들기

마이그레이션할 새 ASP.NET Core 프로젝트를 사용하여 새 솔루션을 만듭니다.

  1. Visual Studio의 두 번째 인스턴스를 시작합니다.
  2. 파일 메뉴에서 새로 만들기>프로젝트를 선택합니다.
  3. ASP.NET Core 웹 애플리케이션을 선택한 다음, 다음을 선택합니다.
  4. 새 프로젝트 구성 대화 상자에서 프로젝트 WebApp1의 이름을 지정합니다.
  5. 동일한 프로젝트 이름을 사용하도록 위치를 이전 프로젝트와 다른 디렉터리로 설정합니다. 동일한 네임스페이스를 사용하면 두 프로젝트 간에 코드를 더 쉽게 복사할 수 있습니다. 선택하고생성합니다.
  6. 새 ASP.NET Core 웹 애플리케이션 만들기 대화 상자에서 .NET CoreASP.NET Core 3.1 선택되어 있는지 확인합니다. 웹 애플리케이션(모델View-Controller) 프로젝트 템플릿을 선택하고 만들기를 선택합니다.

MVC를 사용하도록 ASP.NET Core 사이트 구성

ASP.NET Core 3.0 이상 프로젝트에서 .NET Framework는 더 이상 지원되는 대상 프레임워크가 아닙니다. 프로젝트는 .NET Core를 대상으로 해야 합니다. MVC를 포함하는 ASP.NET Core 공유 프레임워크는 .NET Core 런타임 설치의 일부입니다. 공유 프레임워크는 프로젝트 파일에서 SDK를 Microsoft.NET.Sdk.Web 사용할 때 자동으로 참조됩니다.

<Project Sdk="Microsoft.NET.Sdk.Web">

자세한 내용은 프레임워크 참조를 참조하세요.

ASP.NET Core에서 클래스는 다음과 같습니다 Startup .

  • 를 대체합니다.Global.asax
  • 모든 앱 시작 작업을 처리합니다.

자세한 내용은 ASP.NET Core에서 앱 시작을 참조하세요.

ASP.NET Core 프로젝트에서 파일을 엽니다.Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

ASP.NET Core 앱은 미들웨어를 사용하여 프레임워크 기능을 옵트인해야 합니다. 이전 템플릿 생성 코드는 다음 서비스 및 미들웨어를 추가합니다.

  • 확장 메서드는 AddControllersWithViews 컨트롤러, API 관련 기능 및 뷰에 대한 MVC 서비스 지원을 등록합니다. MVC 서비스 등록 옵션에 대한 자세한 내용은 MVC 서비스 등록을 참조하세요.
  • 확장 메서드는 UseStaticFiles 정적 파일 처리기를 Microsoft.AspNetCore.StaticFiles추가합니다. 확장 메서드는 UseStaticFiles 앞에 UseRouting호출해야 합니다. 자세한 내용은 ASP.NET Core의 정적 파일을 참조하세요.
  • 확장 메서드는 UseRouting 라우팅을 추가합니다. 자세한 내용은 ASP.NET Core의 라우팅을 참조하세요.

이 기존 구성에는 예제 ASP.NET MVC 프로젝트를 마이그레이션하는 데 필요한 항목이 포함됩니다. ASP.NET Core 미들웨어 옵션에 대한 자세한 내용은 ASP.NET Core의 앱 시작을 참조하세요.

컨트롤러 및 뷰 마이그레이션

ASP.NET Core 프로젝트에서는 ASP.NET MVC 프로젝트에서 마이그레이션하기 위해 동일한 이름의 새 빈 컨트롤러 클래스와 뷰 클래스를 추가하여 자리 표시자로 사용합니다.

ASP.NET Core WebApp1 프로젝트에는 ASP.NET MVC 프로젝트와 동일한 이름의 최소 예제 컨트롤러 및 보기가 이미 포함되어 있습니다. 따라서 ASP.NET MVC WebApp1 프로젝트에서 마이그레이션할 ASP.NET MVC 컨트롤러 및 뷰의 자리 표시자 역할을 합니다.

  1. ASP.NET MVC HomeController 에서 메서드를 복사하여 새 ASP.NET Core HomeController 메서드를 대체합니다. 작업 메서드의 반환 형식을 변경할 필요가 없습니다. ASP.NET MVC 기본 제공 템플릿의 컨트롤러 작업 메서드 반환 형식은 ActionResultASP.NET Core MVC에서 작업 메서드가 대신 반환됩니다 IActionResult . ActionResultIActionResult를 구현합니다.
  2. ASP.NET Core 프로젝트에서 뷰/Home디렉터리를 마우스 오른쪽 단추로 클릭하고기존 항목>를 선택합니다.
  3. 기존 항목 추가 대화 상자에서 ASP.NET MVC WebApp1 프로젝트의 뷰/Home디렉터리로 이동합니다.
  4. About.cshtml, Contact.cshtml, Index.cshtmlRazor 뷰 파일을 선택한 후, 추가를 선택하여 기존 파일을 교체합니다.

자세한 내용은 ASP.NET Core MVC에서 컨트롤러로 요청 처리하기ASP.NET Core MVC에서 뷰 사용를 참조하세요.

각 메서드 테스트

각 컨트롤러 엔드포인트를 테스트할 수 있지만 레이아웃 및 스타일은 문서의 뒷부분에서 다룹니다.

  1. ASP.NET Core 앱을 실행합니다.
  2. 현재 포트 번호를 ASP.NET Core 프로젝트에서 사용되는 포트 번호로 바꿔 실행 중인 ASP.NET Core 앱의 브라우저에서 렌더링된 뷰를 호출합니다. 예: https://localhost:44375/home/about.

정적 콘텐츠 마이그레이션

ASP.NET MVC 5 이전 버전에서는 정적 콘텐츠가 웹 프로젝트의 루트 디렉터리에서 호스트되었고 서버 쪽 파일과 섞였습니다. ASP.NET Core에서 정적 파일은 프로젝트의 웹 루트 디렉터리 내에 저장됩니다. 기본 디렉터리가 {content root}/wwwroot지만 변경할 수 있습니다. 자세한 내용은 ASP.NET Core의 정적 파일을 참조하세요.

ASP.NET MVC WebApp1 프로젝트의 wwwroot 정적 콘텐츠를 ASP.NET Core WebApp1 프로젝트의 디렉터리로 복사합니다.

  1. ASP.NET Core 프로젝트에서 디렉터리를 마우스 오른쪽 단추로 wwwroot 클릭하고기존 항목>를 선택합니다.
  2. 기존 항목 추가 대화 상자에서 ASP.NET MVC WebApp1 프로젝트로 이동합니다.
  3. favicon.ico 파일을 선택한 후, 추가를 선택하여 기존 파일을 대체하십시오.

레이아웃 파일 마이그레이션

ASP.NET MVC 프로젝트 레이아웃 파일을 ASP.NET Core 프로젝트에 복사합니다.

  1. ASP.NET Core 프로젝트에서 디렉터리를 마우스 오른쪽 단추로 Views 클릭하고기존 항목>를 선택합니다.
  2. 기존 항목 추가 대화 상자에서 ASP.NET MVC WebApp1 프로젝트의 Views 디렉터리로 이동합니다.
  3. _ViewStart.cshtml 파일을 선택한 다음, 추가를 선택합니다.

ASP.NET MVC 프로젝트 공유 레이아웃 파일을 ASP.NET Core 프로젝트에 복사합니다.

  1. ASP.NET Core 프로젝트에서 디렉터리를 마우스 오른쪽 단추로 Views/Shared 클릭하고기존 항목>를 선택합니다.
  2. 기존 항목 추가 대화 상자에서 ASP.NET MVC WebApp1 프로젝트의 Views/Shared 디렉터리로 이동합니다.
  3. _Layout.cshtml 파일을 선택한 다음 추가를 선택하여 기존 파일을 대체합니다.

ASP.NET Core 프로젝트에서 파일을 엽니다 _Layout.cshtml . 아래 표시된 완료된 코드와 일치하도록 다음을 변경합니다.

아래의 완료된 코드와 일치하도록 부트스트랩 CSS 포함을 업데이트합니다.

  1. @Styles.Render("~/Content/css")를 로드하기 위해 <link>bootstrap.css 요소로 대체합니다(아래 참조).
  2. @Scripts.Render("~/bundles/modernizr")제거합니다.

부트스트랩 CSS 포함을 위한 완성된 대체 마크업:

<link rel="stylesheet"
    href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"
    integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
    crossorigin="anonymous">

아래의 완료된 코드와 일치하도록 jQuery 및 Bootstrap JavaScript 포함을 업데이트합니다.

  1. @Scripts.Render("~/bundles/jquery")<script> 요소로 대체하십시오(아래 참조).
  2. @Scripts.Render("~/bundles/bootstrap")<script> 요소로 대체하십시오(아래 참조).

jQuery 및 Bootstrap JavaScript 포함에 대한 완료된 대체 마크업:

<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"
    integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

업데이트 _Layout.cshtml 된 파일은 다음과 같습니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    <link rel="stylesheet"
          href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
          crossorigin="anonymous">
</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                    <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
                </ul>
            </div>
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>

    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"
            integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
    @RenderSection("scripts", required: false)
</body>
</html>

브라우저에서 사이트를 봅니다. 필요한 스타일을 적용하여 렌더링해야 합니다.

번들링 및 축소 구성

ASP.NET Core는 WebOptimizer 및 기타 유사한 라이브러리와 같은 여러 오픈 소스 번들링 및 축소 솔루션과 호환됩니다. ASP.NET Core는 네이티브 번들링 및 축소 솔루션을 제공하지 않습니다. 묶음 및 축소 구성에 대한 자세한 내용은 번들링 및 축소를 참조하세요.

HTTP 500 오류 해결

문제의 원인에 대한 정보가 없는 HTTP 500 오류 메시지를 발생시킬 수 있는 많은 문제가 있습니다. 예를 들어 파일에 프로젝트에 없는 네임스페이스가 포함되어 있으면 Views/_ViewImports.cshtml HTTP 500 오류가 생성됩니다. 기본적으로 ASP.NET Core 앱에서는 환경이 개발일 때, UseDeveloperExceptionPage 확장이 IApplicationBuilder에 추가되고 실행됩니다. 이 내용은 다음 코드에 자세히 설명되어 있습니다.

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

ASP.NET Core는 처리되지 않은 예외를 HTTP 500 오류 응답으로 변환합니다. 일반적으로 오류 세부 정보는 서버에 대한 잠재적으로 중요한 정보가 공개되지 않도록 이러한 응답에 포함되지 않습니다. 자세한 내용은 개발자 예외 페이지를 참조하세요.

다음 단계

  • <identity.md>

추가 리소스

이 문서에서는 ASP.NET MVC 프로젝트를 ASP.NET Core MVC 2.2로 마이그레이션하는 방법을 보여줍니다. ASP.NET MVC에서 변경된 많은 사항을 이 과정에서 강조합니다. ASP.NET MVC에서 마이그레이션하는 것은 다단계 프로세스입니다. 이 문서에서는 다음을 다룹니다.

  • 초기 설정
  • 기본 컨트롤러 및 뷰
  • 정적 콘텐츠
  • 클라이언트 쪽 종속성.

구성 및 Identity 코드를 <마이그레이션하려면 configuration.md> 및 <identity.md> 참조하세요.

Note

샘플의 버전 번호가 최신이 아닐 수 있으며 그에 따라 프로젝트를 업데이트합니다.

시작 ASP.NET MVC 프로젝트 만들기

업그레이드를 시연하기 위해 먼저 ASP.NET MVC 앱을 만듭니다. 네임스페이스가 다음 단계에서 만든 ASP.NET Core 프로젝트와 일치하게 WebApp1 이라는 이름으로 만듭니다.

Visual Studio 새 프로젝트 대화 상자

새 웹 애플리케이션 대화 상자: ASP.NET 템플릿 패널에서 선택한 MVC 프로젝트 템플릿

선택적: 솔루션의 이름을 WebApp1 에서 Mvc5로 변경합니다. Visual Studio는 새 솔루션 이름(Mvc5)을 표시하므로 다음 프로젝트에서 이 프로젝트를 더 쉽게 알릴 수 있습니다.

ASP.NET Core 프로젝트 만들기

두 프로젝트의 네임스페이스가 일치할 수 있도록 이전 프로젝트(WebApp1)와 동일한 이름으로 비어 있는 ASP.NET Core 웹앱을 새로 만듭니다. 네임스페이스가 같으면 두 프로젝트 간에 코드를 쉽게 복사할 수 있습니다. 동일한 이름을 사용하도록 이전 프로젝트와 다른 디렉터리에 이 프로젝트를 만듭니다.

새 프로젝트 대화 상자

새 ASP.NET 웹 애플리케이션 대화 상자: ASP.NET 핵심 템플릿 패널에서 선택된 빈 프로젝트 템플릿

  • 선택적:웹 애플리케이션 프로젝트 템플릿을 사용하여 새 ASP.NET Core 앱을 만듭니다. 프로젝트 이름을 WebApp1로 지정하고 개별 사용자 계정의 인증 옵션을 선택합니다. 이 앱의 이름을 FullAspNetCore로 바꿉니다. 이 프로젝트를 만들면 변환 시간이 절약됩니다. 최종 결과는 템플릿 생성 코드에서 보거나, 코드를 변환 프로젝트에 복사하거나, 템플릿에서 생성된 프로젝트와 비교할 수 있습니다.

MVC를 사용하도록 사이트 구성

  • .NET Core를 대상으로 하는 경우 Microsoft.AspNetCore.App 메타패키지가 기본적으로 참조됩니다. 이 패키지에는 MVC 앱에서 일반적으로 사용하는 패키지가 포함되어 있습니다. .NET Framework를 대상으로 하는 경우 패키지 참조는 프로젝트 파일에 개별적으로 나열되어야 합니다.

Microsoft.AspNetCore.Mvc 는 ASP.NET Core MVC 프레임워크입니다. Microsoft.AspNetCore.StaticFiles 는 정적 파일 처리기입니다. ASP.NET Core 앱은 정적 파일 제공과 같은 미들웨어를 명시적으로 옵트인합니다. 자세한 내용은 정적 파일을 참조하세요.

  • Startup.cs 파일을 열고 코드를 다음과 일치하도록 변경합니다.
public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

확장 메서드는 UseStaticFiles 정적 파일 처리기를 추가합니다. 자세한 내용은 애플리케이션 시작라우팅을 참조하세요.

컨트롤러 및 뷰 추가

이 섹션에서는 다음 섹션에서 마이그레이션된 ASP.NET MVC 컨트롤러 및 뷰에 대한 자리 표시자로 사용할 최소 컨트롤러와 뷰가 추가됩니다.

  • Controllers 디렉터리를 추가합니다.

  • HomeController.cs 디렉터리에 Controllers로 명명된 컨트롤러 클래스를 추가합니다.

MVC 컨트롤러 클래스가 선택된 새 항목 추가 대화 상자

  • Views 디렉터리를 추가합니다.

  • Views/Home 디렉터리를 추가합니다.

  • 디렉터리에 이라는 뷰를 추가합니다.

MVC 보기 페이지가 선택된 새 항목 추가 대화 상자

프로젝트 구조는 다음과 같습니다.

WebApp1의 파일 및 디렉터리를 보여 주는 솔루션 탐색기

Views/Home/Index.cshtml 파일의 내용을 다음 태그로 대체합니다.

<h1>Hello world!</h1>

앱을 실행하세요.

Microsoft Edge에서 열린 웹앱

자세한 내용은 컨트롤러 및보기를 참조하세요.

다음 기능을 사용하려면 예제 ASP.NET MVC 프로젝트에서 ASP.NET Core 프로젝트로 마이그레이션해야 합니다.

  • 클라이언트 쪽 콘텐츠(CSS, 글꼴 및 스크립트)

  • controllers

  • views

  • models

  • bundling

  • filters

  • 로그인/로그아웃 Identity (다음 자습서에서 수행).

컨트롤러 및 뷰

  • ASP.NET MVC HomeController 에서 새 HomeController메서드로 각 메서드를 복사합니다. ASP.NET MVC에서 기본 제공 템플릿의 컨트롤러 동작 메서드 반환 형식은 ActionResultASP.NET Core MVC에서 작업 메서드가 대신 반환됩니다 IActionResult . ActionResult 는 구현되므로 IActionResult작업 메서드의 반환 형식을 변경할 필요가 없습니다.

  • ASP.NET MVC 프로젝트에서 About.cshtml, Contact.cshtml, Index.cshtmlRazor 보기 파일을 ASP.NET Core 프로젝트로 복사합니다.

각 메서드 테스트

레이아웃 파일 및 스타일은 아직 마이그레이션되지 않았으므로 렌더링된 뷰에는 보기 파일의 콘텐츠만 포함됩니다. 레이아웃 파일에서 생성된 AboutContact 뷰의 링크는 아직 사용할 수 없습니다.

현재 포트 번호를 ASP.NET 핵심 프로젝트에 사용되는 포트 번호로 바꿔서 실행 중인 ASP.NET 핵심 앱의 브라우저에서 렌더링된 뷰를 호출합니다. 예: https://localhost:44375/home/about.

연락처 페이지

스타일 지정 및 메뉴 항목이 부족합니다. 스타일 지정은 다음 섹션에서 수정됩니다.

정적 콘텐츠

ASP.NET MVC 5 이하에서는 정적 콘텐츠가 웹 프로젝트의 루트에서 호스트되었고 서버 쪽 파일과 섞였습니다. ASP.NET Core에서 정적 콘텐츠는 디렉터리에 호스트 wwwroot 됩니다. ASP.NET MVC 앱 wwwroot 의 정적 콘텐츠를 ASP.NET Core 프로젝트의 디렉터리로 복사합니다. 이 샘플 변환에서는 다음을 수행합니다.

  • favicon.ico ASP.NET MVC 프로젝트의 wwwroot 파일을 ASP.NET Core 프로젝트의 디렉터리로 복사합니다.

ASP.NET MVC 프로젝트는 부트스트랩 을 스타일 지정에 사용하고 부트스트랩 파일을 ContentScripts 디렉터리에 저장합니다. ASP.NET MVC 프로젝트를 생성한 템플릿은 레이아웃 파일(Views/Shared/_Layout.cshtml)에서 부트스트랩을 참조합니다. bootstrap.jsbootstrap.css 파일을 ASP.NET MVC 프로젝트에서 새 프로젝트의 wwwroot 디렉터리로 복사할 수 있습니다. 대신 이 문서에서는 다음 섹션에서 CDN을 사용하는 부트스트랩(및 기타 클라이언트 쪽 라이브러리)에 대한 지원을 추가합니다.

레이아웃 파일 마이그레이션

  • _ViewStart.cshtml ASP.NET MVC 프로젝트의 Views 디렉터리에서 ASP.NET Core 프로젝트의 Views 디렉터리에 파일을 복사합니다. _ViewStart.cshtml ASP.NET Core MVC에서 파일이 변경되지 않았습니다.

  • Views/Shared 디렉터리를 만듭니다.

  • 선택적:_ViewImports.cshtml MVC 프로젝트의 디렉터리에서 ASP.NET Core 프로젝트의 Views 디렉터리로 복사 Views 합니다. 파일에서 네임스페이스 선언을 제거합니다 _ViewImports.cshtml . 이 파일은 _ViewImports.cshtml 모든 보기 파일에 대한 네임스페이스를 제공하고 태그 도우미를 제공합니다. 태그 도우미는 새 레이아웃 파일에 사용됩니다. 이 파일은 _ViewImports.cshtml ASP.NET Core의 새로운 파일입니다.

  • _Layout.cshtml ASP.NET MVC 프로젝트의 Views/Shared 디렉터리에서 ASP.NET Core 프로젝트의 Views/Shared 디렉터리에 파일을 복사합니다.

파일을 열고 _Layout.cshtml 다음과 같이 변경합니다(완성된 코드는 아래에 나와 있음).

  • @Styles.Render("~/Content/css")를 로드하기 위해 <link>bootstrap.css 요소로 대체합니다(아래 참조).

  • @Scripts.Render("~/bundles/modernizr")제거합니다.

  • 줄을 주석 처리하기 위해 @Html.Partial("_LoginPartial")을(를) 삽입하고, 줄을 @*...*@으로 감싸세요. 자세한 내용은 인증 마이그레이션 및 Identity ASP.NET Core를 참조하세요.

  • @Scripts.Render("~/bundles/jquery")<script> 요소로 대체하십시오(아래 참조).

  • @Scripts.Render("~/bundles/bootstrap")<script> 요소로 대체하십시오(아래 참조).

부트스트랩 CSS 포함에 대한 대체 태그:

<link rel="stylesheet"
    href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"
    integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
    crossorigin="anonymous">

jQuery 및 Bootstrap JavaScript 포함을 위한 대체 마크업:

<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"
    integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

업데이트 _Layout.cshtml 된 파일은 다음과 같습니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    <link rel="stylesheet"
          href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
          crossorigin="anonymous">
</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                    <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
                </ul>
                @*@Html.Partial("_LoginPartial")*@
            </div>
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>

    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"
            integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
            crossorigin="anonymous"></script>
    @RenderSection("scripts", required: false)
</body>
</html>

브라우저에서 사이트를 봅니다. 이제 필요한 스타일이 적용된 상태로 올바르게 로드됩니다.

  • 선택적: 새 레이아웃 파일을 사용해 보세요. FullAspNetCore 프로젝트에서 레이아웃 파일을 복사합니다. 새 레이아웃 파일은 태그 도우미를 사용하며 다른 향상된 기능도 제공합니다.

번들링 및 축소 구성

묶음 및 축소를 구성하는 방법에 대한 자세한 내용은 번들링 및 축소를 참조하세요.

HTTP 500 오류 해결

문제의 원인에 대한 정보가 없는 HTTP 500 오류 메시지를 발생시킬 수 있는 많은 문제가 있습니다. 예를 들어 파일에 프로젝트에 없는 네임스페이스가 포함되어 있으면 Views/_ViewImports.cshtml HTTP 500 오류가 생성됩니다. 기본적으로 ASP.NET Core 앱의 UseDeveloperExceptionPage 확장이 IApplicationBuilder에 추가되고, 구성이 개발인 경우 실행됩니다. 다음 코드의 예제를 참조하세요.

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

ASP.NET Core는 처리되지 않은 예외를 HTTP 500 오류 응답으로 변환합니다. 일반적으로 오류 세부 정보는 서버에 대한 잠재적으로 중요한 정보가 공개되지 않도록 이러한 응답에 포함되지 않습니다. 자세한 내용은 개발자 예외 페이지를 참조하세요.

추가 리소스

이 문서에서는 ASP.NET MVC 프로젝트를 ASP.NET Core MVC 2.1로 마이그레이션하는 방법을 보여줍니다. ASP.NET MVC에서 변경된 많은 사항을 이 과정에서 강조합니다. ASP.NET MVC에서 마이그레이션하는 것은 다단계 프로세스입니다. 이 문서에서는 다음을 다룹니다.

  • 초기 설정
  • 기본 컨트롤러 및 뷰
  • 정적 콘텐츠
  • 클라이언트 쪽 종속성.

구성 및 Identity 코드를 마이그레이션하려면 구성을 ASP.NET Core 로 마이그레이션하고 인증을 마이그레이션하고 Identity ASP.NET Core로 마이그레이션을 참조하세요.

Note

샘플의 버전 번호가 최신이 아닐 수 있으며 그에 따라 프로젝트를 업데이트합니다.

시작 ASP.NET MVC 프로젝트 만들기

업그레이드를 시연하기 위해 먼저 ASP.NET MVC 앱을 만듭니다. 네임스페이스가 다음 단계에서 만든 ASP.NET Core 프로젝트와 일치하게 WebApp1 이라는 이름으로 만듭니다.

Visual Studio 새 프로젝트 대화 상자

새 웹 애플리케이션 대화 상자: ASP.NET 템플릿 패널에서 선택한 MVC 프로젝트 템플릿

선택적: 솔루션의 이름을 WebApp1 에서 Mvc5로 변경합니다. Visual Studio는 새 솔루션 이름(Mvc5)을 표시하므로 다음 프로젝트에서 이 프로젝트를 더 쉽게 알릴 수 있습니다.

ASP.NET Core 프로젝트 만들기

두 프로젝트의 네임스페이스가 일치할 수 있도록 이전 프로젝트(WebApp1)와 동일한 이름으로 비어 있는 ASP.NET Core 웹앱을 새로 만듭니다. 네임스페이스가 같으면 두 프로젝트 간에 코드를 쉽게 복사할 수 있습니다. 동일한 이름을 사용하도록 이전 프로젝트와 다른 디렉터리에 이 프로젝트를 만듭니다.

새 프로젝트 대화 상자

새 ASP.NET 웹 애플리케이션 대화 상자: ASP.NET 핵심 템플릿 패널에서 선택된 빈 프로젝트 템플릿

  • 선택적:웹 애플리케이션 프로젝트 템플릿을 사용하여 새 ASP.NET Core 앱을 만듭니다. 프로젝트 이름을 WebApp1로 지정하고 개별 사용자 계정의 인증 옵션을 선택합니다. 이 앱의 이름을 FullAspNetCore로 바꿉니다. 이 프로젝트를 만들면 변환 시간이 절약됩니다. 최종 결과는 템플릿 생성 코드에서 보거나, 코드를 변환 프로젝트에 복사하거나, 템플릿에서 생성된 프로젝트와 비교할 수 있습니다.

MVC를 사용하도록 사이트 구성

  • .NET Core를 대상으로 하는 경우 Microsoft.AspNetCore.App 메타패키지가 기본적으로 참조됩니다. 이 패키지에는 MVC 앱에서 일반적으로 사용하는 패키지가 포함되어 있습니다. .NET Framework를 대상으로 하는 경우 패키지 참조는 프로젝트 파일에 개별적으로 나열되어야 합니다.

Microsoft.AspNetCore.Mvc 는 ASP.NET Core MVC 프레임워크입니다. Microsoft.AspNetCore.StaticFiles 는 정적 파일 처리기입니다. ASP.NET Core 앱은 정적 파일 제공과 같은 미들웨어를 명시적으로 옵트인합니다. 자세한 내용은 정적 파일을 참조하세요.

  • Startup.cs 파일을 열고 코드를 다음과 일치하도록 변경합니다.
public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

확장 메서드는 UseStaticFiles 정적 파일 처리기를 추가합니다. 확장 메서드는 UseMvc 라우팅을 추가합니다. 자세한 내용은 애플리케이션 시작라우팅을 참조하세요.

컨트롤러 및 뷰 추가

이 섹션에서는 다음 섹션에서 마이그레이션된 ASP.NET MVC 컨트롤러 및 뷰에 대한 자리 표시자로 사용할 최소 컨트롤러와 뷰가 추가됩니다.

  • Controllers 디렉터리를 추가합니다.

  • Controllers 디렉터리에 컨트롤러 클래스를 추가하고, 이를 HomeController.cs로 명명합니다.

MVC 컨트롤러 클래스가 선택된 새 항목 추가 대화 상자(ASP.NET Core 2.1 릴리스 이전)

  • Views 디렉터리를 추가합니다.

  • Views/Home 디렉터리를 추가합니다.

  • 디렉터리에 이라는 뷰를 추가합니다.

MVC 보기 페이지가 선택된 새 항목 추가 대화 상자(ASP.NET Core 2.1 릴리스 이전)

프로젝트 구조는 다음과 같습니다.

WebApp1의 파일 및 디렉터리를 보여 주는 솔루션 탐색기

Views/Home/Index.cshtml 파일의 내용을 다음 태그로 대체합니다.

<h1>Hello world!</h1>

앱을 실행하세요.

Microsoft Edge에서 열린 웹앱

자세한 내용은 컨트롤러 및보기를 참조하세요.

다음 기능을 사용하려면 예제 ASP.NET MVC 프로젝트에서 ASP.NET Core 프로젝트로 마이그레이션해야 합니다.

  • 클라이언트 쪽 콘텐츠(CSS, 글꼴 및 스크립트)

  • controllers

  • views

  • models

  • bundling

  • filters

  • 로그인/로그아웃 Identity (다음 자습서에서 수행).

컨트롤러 및 뷰

  • ASP.NET MVC HomeController 에서 새 HomeController메서드로 각 메서드를 복사합니다. ASP.NET MVC에서 기본 제공 템플릿의 컨트롤러 동작 메서드 반환 형식은 ActionResultASP.NET Core MVC에서 작업 메서드가 대신 반환됩니다 IActionResult . ActionResult 는 구현되므로 IActionResult작업 메서드의 반환 형식을 변경할 필요가 없습니다.

  • ASP.NET MVC 프로젝트에서 About.cshtml, Contact.cshtml, Index.cshtmlRazor 보기 파일을 ASP.NET Core 프로젝트로 복사합니다.

각 메서드 테스트

레이아웃 파일 및 스타일은 아직 마이그레이션되지 않았으므로 렌더링된 뷰에는 보기 파일의 콘텐츠만 포함됩니다. 레이아웃 파일에서 생성된 AboutContact 뷰의 링크는 아직 사용할 수 없습니다.

  • 현재 포트 번호를 ASP.NET 핵심 프로젝트에 사용되는 포트 번호로 바꿔서 실행 중인 ASP.NET 핵심 앱의 브라우저에서 렌더링된 뷰를 호출합니다. 예: https://localhost:44375/home/about.

연락처 페이지

스타일 지정 및 메뉴 항목이 부족합니다. 스타일 지정은 다음 섹션에서 수정됩니다.

정적 콘텐츠

ASP.NET MVC 5 이하에서는 정적 콘텐츠가 웹 프로젝트의 루트에서 호스트되었고 서버 쪽 파일과 섞였습니다. ASP.NET Core에서 정적 콘텐츠는 디렉터리에 호스트 wwwroot 됩니다. ASP.NET MVC 앱 wwwroot 의 정적 콘텐츠를 ASP.NET Core 프로젝트의 디렉터리로 복사합니다. 이 샘플 변환에서는 다음을 수행합니다.

  • favicon.ico ASP.NET MVC 프로젝트의 wwwroot 파일을 ASP.NET Core 프로젝트의 디렉터리로 복사합니다.

ASP.NET MVC 프로젝트는 부트스트랩 을 스타일 지정에 사용하고 부트스트랩 파일을 ContentScripts 디렉터리에 저장합니다. ASP.NET MVC 프로젝트를 생성한 템플릿은 레이아웃 파일(Views/Shared/_Layout.cshtml)에서 부트스트랩을 참조합니다. bootstrap.jsbootstrap.css 파일을 ASP.NET MVC 프로젝트에서 새 프로젝트의 wwwroot 디렉터리로 복사할 수 있습니다. 대신 이 문서에서는 다음 섹션에서 CDN을 사용하는 부트스트랩(및 기타 클라이언트 쪽 라이브러리)에 대한 지원을 추가합니다.

레이아웃 파일 마이그레이션

  • _ViewStart.cshtml ASP.NET MVC 프로젝트의 Views 디렉터리에서 ASP.NET Core 프로젝트의 Views 디렉터리에 파일을 복사합니다. _ViewStart.cshtml ASP.NET Core MVC에서 파일이 변경되지 않았습니다.

  • Views/Shared 디렉터리를 만듭니다.

  • 선택적:_ViewImports.cshtml MVC 프로젝트의 디렉터리에서 ASP.NET Core 프로젝트의 Views 디렉터리로 복사 Views 합니다. 파일에서 네임스페이스 선언을 제거합니다 _ViewImports.cshtml . 이 파일은 _ViewImports.cshtml 모든 보기 파일에 대한 네임스페이스를 제공하고 태그 도우미를 제공합니다. 태그 도우미는 새 레이아웃 파일에 사용됩니다. 이 파일은 _ViewImports.cshtml ASP.NET Core의 새로운 파일입니다.

  • _Layout.cshtml ASP.NET MVC 프로젝트의 Views/Shared 디렉터리에서 ASP.NET Core 프로젝트의 Views/Shared 디렉터리에 파일을 복사합니다.

파일을 열고 _Layout.cshtml 다음과 같이 변경합니다(완성된 코드는 아래에 나와 있음).

  • @Styles.Render("~/Content/css")를 로드하기 위해 <link>bootstrap.css 요소로 대체합니다(아래 참조).

  • @Scripts.Render("~/bundles/modernizr")제거합니다.

  • 줄을 주석 처리하기 위해 @Html.Partial("_LoginPartial")을(를) 삽입하고, 줄을 @*...*@으로 감싸세요. 자세한 내용은 인증 마이그레이션 및 Identity ASP.NET Core를 참조하세요.

  • @Scripts.Render("~/bundles/jquery")<script> 요소로 대체하십시오(아래 참조).

  • @Scripts.Render("~/bundles/bootstrap")<script> 요소로 대체하십시오(아래 참조).

부트스트랩 CSS 포함에 대한 대체 태그:

<link rel="stylesheet"
    href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"
    integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
    crossorigin="anonymous">

jQuery 및 Bootstrap JavaScript 포함을 위한 대체 마크업:

<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"
    integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

업데이트 _Layout.cshtml 된 파일은 다음과 같습니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    <link rel="stylesheet"
          href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
          crossorigin="anonymous">
</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                    <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
                </ul>
                @*@Html.Partial("_LoginPartial")*@
            </div>
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>

    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"
            integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
            crossorigin="anonymous"></script>
    @RenderSection("scripts", required: false)
</body>
</html>

브라우저에서 사이트를 봅니다. 이제 필요한 스타일이 적용된 상태로 올바르게 로드됩니다.

  • 선택적: 새 레이아웃 파일을 사용해 보세요. FullAspNetCore 프로젝트에서 레이아웃 파일을 복사합니다. 새 레이아웃 파일은 태그 도우미를 사용하며 다른 향상된 기능도 제공합니다.

번들링 및 축소 구성

묶음 및 축소를 구성하는 방법에 대한 자세한 내용은 번들링 및 축소를 참조하세요.

HTTP 500 오류 해결

문제의 원인에 대한 정보가 없는 HTTP 500 오류 메시지를 발생시킬 수 있는 많은 문제가 있습니다. 예를 들어 파일에 프로젝트에 없는 네임스페이스가 포함되어 있으면 Views/_ViewImports.cshtml HTTP 500 오류가 생성됩니다. 기본적으로 ASP.NET Core 앱의 UseDeveloperExceptionPage 확장이 IApplicationBuilder에 추가되고, 구성이 개발인 경우 실행됩니다. 다음 코드의 예제를 참조하세요.

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

ASP.NET Core는 처리되지 않은 예외를 HTTP 500 오류 응답으로 변환합니다. 일반적으로 오류 세부 정보는 서버에 대한 잠재적으로 중요한 정보가 공개되지 않도록 이러한 응답에 포함되지 않습니다. 자세한 내용은 개발자 예외 페이지를 참조하세요.

추가 리소스