Visual Studio 2013용 ASP.NET 및 Web Tools 릴리스 정보

작성자: Microsoft

이 문서에서는 Visual Studio 2013 대한 ASP.NET 및 Web Tools 릴리스에 대해 설명합니다.

콘텐츠

Visual Studio 2013 대한 ASP.NET 및 Web Tools 새로운 기능

설치 참고 사항

Visual Studio 2013 ASP.NET 및 Web Tools 기본 설치 관리자에 번들로 제공됩니다. 여기에서 다운로드할 수 있습니다.

설명서

Visual Studio 2013 ASP.NET 및 Web Tools 대한 자습서 및 기타 정보는 ASP.NET 웹 사이트에서 확인할 수 있습니다.

소프트웨어 요구 사항

ASP.NET 및 Web Tools Visual Studio 2013 필요합니다.

Visual Studio 2013 대한 ASP.NET 및 Web Tools 새로운 기능

다음 섹션에서는 릴리스에 도입된 기능에 대해 설명합니다.

하나의 ASP.NET

Visual Studio 2013 릴리스를 통해 ASP.NET 기술을 사용하는 환경을 통합하여 원하는 기술을 쉽게 혼합하고 일치시킬 수 있도록 한 걸음 더 나아갔습니다. 예를 들어 MVC를 사용하여 프로젝트를 시작하고 나중에 프로젝트에 Web Forms 페이지를 쉽게 추가하거나 Web Forms 프로젝트에서 Web API를 스캐폴드할 수 있습니다. 한 가지 ASP.NET 개발자가 ASP.NET 좋아하는 일을 더 쉽게 수행할 수 있도록 하는 것입니다. 어떤 기술을 선택하든 One ASP.NET 신뢰할 수 있는 기본 프레임워크를 기반으로 빌드하고 있다는 확신을 가질 수 있습니다.

새 웹 프로젝트 환경

Visual Studio 2013 새 웹 프로젝트를 만드는 환경을 향상시켰습니다. 새 ASP.NET 웹 프로젝트 대화 상자에서 원하는 프로젝트 유형을 선택하고, 모든 기술 조합(Web Forms, MVC, Web API)을 구성하고, 인증 옵션을 구성하고, 단위 테스트 프로젝트를 추가할 수 있습니다.

새 ASP.NET 프로젝트

새 대화 상자를 사용하면 많은 템플릿에 대한 기본 인증 옵션을 변경할 수 있습니다. 예를 들어 ASP.NET Web Forms 프로젝트를 만들 때 다음 옵션 중에서 선택할 수 있습니다.

  • 인증 없음
  • 개별 사용자 계정(ASP.NET 멤버 자격 또는 소셜 공급자 로그인)
  • 조직 계정(인터넷 애플리케이션의 Active Directory)
  • Windows 인증(인트라넷 애플리케이션의 Active Directory)

인증 옵션

웹 프로젝트를 만드는 새 프로세스에 대한 자세한 내용은 Visual Studio 2013 ASP.NET 웹 프로젝트 만들기를 참조하세요. 새 인증 옵션에 대한 자세한 내용은 이 문서의 뒷부분에 있는 ASP.NET ID 를 참조하세요.

ASP.NET 스캐폴딩

ASP.NET 스캐폴딩은 ASP.NET 웹 애플리케이션을 위한 코드 생성 프레임워크입니다. 데이터 모델과 상호 작용하는 프로젝트에 상용구 코드를 쉽게 추가할 수 있습니다.

이전 버전의 Visual Studio에서는 스캐폴딩이 ASP.NET MVC 프로젝트로 제한되었습니다. Visual Studio 2013 사용하면 이제 Web Forms 포함하여 모든 ASP.NET 프로젝트에 스캐폴딩을 사용할 수 있습니다. Visual Studio 2013 현재 Web Forms 프로젝트에 대한 페이지 생성을 지원하지 않지만 프로젝트에 MVC 종속성을 추가하여 Web Forms 스캐폴딩을 계속 사용할 수 있습니다. Web Forms 페이지 생성에 대한 지원은 향후 업데이트에서 추가될 예정입니다.

스캐폴딩을 사용하는 경우 필요한 모든 종속성이 프로젝트에 설치되어 있는지 확인합니다. 예를 들어 ASP.NET Web Forms 프로젝트로 시작한 다음 스캐폴딩을 사용하여 Web API 컨트롤러를 추가하는 경우 필요한 NuGet 패키지 및 참조가 프로젝트에 자동으로 추가됩니다.

Web Forms 프로젝트에 MVC 스캐폴딩을 추가하려면 새 스캐폴드 항목을 추가하고 대화 상자 창에서 MVC 5 종속성을 선택합니다. MVC를 스캐폴딩하는 두 가지 옵션이 있습니다. 최소 및 전체. 최소를 선택하면 ASP.NET MVC에 대한 NuGet 패키지 및 참조만 프로젝트에 추가됩니다. 전체 옵션을 선택하면 최소 종속성뿐만 아니라 MVC 프로젝트에 필요한 콘텐츠 파일이 추가됩니다.

비동기 컨트롤러 스캐폴딩 지원은 Entity Framework 6의 새로운 비동기 기능을 사용합니다.

자세한 내용 및 자습서는 ASP.NET 스캐폴딩 개요를 참조하세요.

브라우저 링크 기능을 사용하면 도구 모음에서 단추를 클릭하여 여러 브라우저를 Visual Studio에 연결하고 모두 새로 고칠 수 있습니다. 모바일 에뮬레이터를 포함하여 여러 브라우저를 개발 사이트에 연결하고 새로 고침을 클릭하여 모든 브라우저를 동시에 새로 고칠 수 있습니다. 또한 Browser Link는 개발자가 브라우저 링크 확장을 작성할 수 있도록 API를 노출합니다.

새로 고침 아이콘이 강조 표시되고 드롭다운 메뉴에서 브라우저 링크 대시보드가 강조 표시된 Visual Studio 메뉴의 스크린샷

개발자가 브라우저 링크 API를 활용할 수 있게 함으로써 Visual Studio와 연결된 브라우저 간의 경계를 넘나드는 매우 고급 시나리오를 만들 수 있습니다. Web Essentials는 API를 활용하여 Visual Studio와 브라우저의 개발자 도구 간에 통합된 환경을 만들고, 모바일 에뮬레이터를 원격으로 제어하는 등의 작업을 수행합니다.

Visual Studio 웹 편집기 향상된 기능

Visual Studio 2013 웹 애플리케이션의 Razor 파일 및 HTML 파일에 대한 새 HTML 편집기가 포함되어 있습니다. 새 HTML 편집기에서는 HTML5를 기반으로 하는 단일 통합 스키마를 제공합니다. 자동 중괄호 완성, jQuery UI 및 AngularJS 특성 IntelliSense, 특성 IntelliSense 그룹화, ID 및 클래스 이름 Intellisense 및 향상된 성능, 서식 및 SmartTags를 포함한 기타 개선 사항이 있습니다.

다음 스크린샷은 HTML 편집기에서 부트스트랩 특성 IntelliSense를 사용하는 방법을 보여 줍니다.

HTML 편집기에서 Intellisense

Visual Studio 2013 CoffeeScript 및 LESS 편집기가 모두 기본 제공됩니다. LESS 편집기에서는 CSS 편집기에서 제공하는 모든 멋진 기능을 제공하며 체인의 모든 LESS 문서에서 변수 및 믹싱에 대한 특정 Intellisense를 @import 제공합니다.

Visual Studio의 Azure App Service Web Apps 지원

.NET 2.2용 Azure SDK와 Visual Studio 2013 서버 Explorer 사용하여 원격 웹앱과 직접 상호 작용할 수 있습니다. Azure 계정에 로그인하고, 새 웹앱을 만들고, 앱을 구성하고, 실시간 로그를 보는 등의 작업을 수행할 수 있습니다. SDK 2.2가 릴리스된 후 곧 Azure에서 원격으로 디버그 모드로 실행할 수 있습니다. Azure App Service Web Apps 대한 대부분의 새로운 기능은 .NET용 Azure SDK의 현재 릴리스를 설치할 때 Visual Studio 2012에서도 작동합니다.

자세한 내용은 다음 자료를 참조하세요.

웹 게시 개선 사항

Visual Studio 2013 새롭고 향상된 웹 게시 기능을 포함합니다. 다음은 몇 가지 옵션입니다.

ASP.NET 웹 배포에 대한 자세한 내용은 ASP.NET 사이트를 참조하세요.

NuGet 2.7

NuGet 2.7에는 NuGet 2.7 릴리스 정보에서 자세히 설명하는 다양한 새로운 기능 집합이 포함되어 있습니다.

또한 이 버전의 NuGet은 패키지를 다운로드하기 위해 NuGet의 패키지 복원 기능에 대한 명시적 동의를 제공할 필요가 없습니다. 이제 NuGet을 설치하여 동의(및 NuGet 기본 설정 대화 상자의 연결된 확인란)가 부여됩니다. 이제 패키지 복원은 기본적으로 작동합니다.

ASP.NET 웹 양식

하나의 ASP.NET

Web Forms 프로젝트 템플릿은 새로운 One ASP.NET 환경과 원활하게 통합됩니다. MVC 및 Web API 지원을 Web Forms 프로젝트에 추가할 수 있으며 One ASP.NET 프로젝트 만들기 마법사를 사용하여 인증을 구성할 수 있습니다. 자세한 내용은 Visual Studio 2013 ASP.NET 웹 프로젝트 만들기를 참조하세요.

ASP.NET ID

Web Forms 프로젝트 템플릿은 새 ASP.NET ID 프레임워크를 지원합니다. 또한 템플릿은 이제 Web Forms 인트라넷 프로젝트 만들기를 지원합니다. 자세한 내용은 Visual Studio 2013 ASP.NET 웹 프로젝트 만들기의인증 방법을 참조하세요.

부트스트랩

Web Forms 템플릿은 부트스트랩을 사용하여 손쉽게 사용자 지정할 수 있는 세련되고 반응성이 뛰어난 모양과 느낌을 제공합니다. 자세한 내용은 Visual Studio 2013 웹 프로젝트 템플릿의 부트스트랩을 참조하세요.

ASP.NET MVC 5

하나의 ASP.NET

웹 MVC 프로젝트 템플릿은 새로운 One ASP.NET 환경과 원활하게 통합됩니다. One ASP.NET 프로젝트 만들기 마법사를 사용하여 MVC 프로젝트를 사용자 지정하고 인증을 구성할 수 있습니다. MVC 5를 ASP.NET 대한 소개 자습서는 ASP.NET MVC 5를 사용하는 시작 찾을 수 있습니다.

MVC 4 프로젝트를 MVC 5로 업그레이드하는 방법에 대한 자세한 내용은 ASP.NET MVC 4 및 Web API 프로젝트를 ASP.NET MVC 5 및 Web API 2로 업그레이드하는 방법을 참조하세요.

ASP.NET ID

MVC 프로젝트 템플릿은 인증 및 ID 관리에 ASP.NET ID를 사용하도록 업데이트되었습니다. Facebook 및 Google 인증 및 새 멤버 자격 API를 포함하는 자습서는 Facebook 및 Google OAuth2를 사용하여 ASP.NET MVC 5 앱 만들기 및 OpenID 로그온 및인증 및 SQL DB를 사용하여 ASP.NET MVC 앱 만들기 및 Azure App Service 배포에서 찾을 수 있습니다.

부트스트랩

MVC 프로젝트 템플릿은 부트스트랩 을 사용하여 손쉽게 사용자 지정할 수 있는 세련되고 반응성이 뛰어난 모양과 느낌을 제공하도록 업데이트되었습니다. 자세한 내용은 Visual Studio 2013 웹 프로젝트 템플릿의 부트스트랩을 참조하세요.

인증 필터

인증 필터는 ASP.NET MVC 파이프라인에서 권한 부여 필터 이전에 실행되고 모든 컨트롤러에 대해 작업별, 컨트롤러별 또는 전역적으로 인증 논리를 지정할 수 있도록 하는 ASP.NET MVC의 새로운 종류의 필터입니다. 인증 필터는 요청의 자격 증명을 처리하고 해당 보안 주체를 제공합니다. 인증 필터는 권한 없는 요청에 대한 응답으로 인증 문제를 추가할 수도 있습니다.

필터 재정의

이제 재정의 필터를 지정하여 지정된 작업 메서드 또는 컨트롤러에 적용되는 필터를 재정의할 수 있습니다. 재정의 필터는 지정된 scope(작업 또는 컨트롤러)에 대해 실행해서는 안 되는 필터 형식 집합을 지정합니다. 이렇게 하면 전역적으로 적용되는 필터를 구성한 다음 특정 전역 필터를 특정 작업 또는 컨트롤러에 적용하지 않도록 제외할 수 있습니다.

특성 라우팅

ASP.NET MVC는 이제 의 작성자인 Tim McCall의 http://attributerouting.net기여 덕분에 특성 라우팅을 지원합니다. 특성 라우팅을 사용하면 작업 및 컨트롤러에 주석을 추가하여 경로를 지정할 수 있습니다.

ASP.NET Web API 2

특성 라우팅

이제 ASP.NET Web API 의 작성http://attributerouting.net자인 Tim McCall의 기여 덕분에 특성 라우팅을 지원합니다. 특성 라우팅을 사용하면 다음과 같이 작업 및 컨트롤러에 주석을 추가하여 Web API 경로를 지정할 수 있습니다.

[RoutePrefix("orders")] 
public class OrdersController : ApiController 
{ 
    [Route("{id}")] 
    public Order Get(int id) { } 
    [Route("{id}/approve")] 
    public Order Approve(int id) { } 
}

특성 라우팅을 사용하면 웹 API의 URI를 더 잘 제어할 수 있습니다. 예를 들어 단일 API 컨트롤러를 사용하여 리소스 계층 구조를 쉽게 정의할 수 있습니다.

public class MoviesController : ApiController 
{ 
    [Route("movies")] 
    public IEnumerable<Movie> Get() { } 
    [Route("actors/{actorId}/movies")] 
    public IEnumerable<Movie> GetByActor(int actorId) { } 
    [Route("directors/{directorId}/movies")] 
    public IEnumerable<Movie> GetByDirector(int directorId) { } 
}

특성 라우팅은 선택적 매개 변수, 기본값 및 경로 제약 조건을 지정하기 위한 편리한 구문도 제공합니다.

// Optional parameter
[Route("people/{name?}")]
// Default value
[Route("people/{name=Dan}")]
// Constraint: Alphabetic characters only. 
[Route("people/{name:alpha}")]

특성 라우팅에 대한 자세한 내용은 Web API 2의 특성 라우팅을 참조하세요.

OAuth 2.0

Web API 및 단일 페이지 애플리케이션 프로젝트 템플릿은 이제 OAuth 2.0을 사용하여 권한 부여를 지원합니다. OAuth 2.0은 보호된 리소스에 대한 클라이언트 액세스 권한을 부여하는 프레임워크입니다. 브라우저 및 모바일 디바이스를 비롯한 다양한 클라이언트에서 작동합니다.

OAuth 2.0에 대한 지원은 전달자 인증 및 권한 부여 서버 역할 구현을 위해 Microsoft OWIN 구성 요소에서 제공하는 새로운 보안 미들웨어를 기반으로 합니다. 또는 Windows Server 2012 R2의 Azure Active Directory 또는 ADFS와 같은 조직 권한 부여 서버를 사용하여 클라이언트에 권한을 부여할 수 있습니다.

OData 개선 사항

$select, $expand, $batch 및 $value 지원

ASP.NET Web API OData는 이제 $select, $expand 및 $value 대한 전폭적인 지원을 제공합니다. 변경 집합의 요청 일괄 처리 및 처리에 $batch 사용할 수도 있습니다.

$select 및 $expand 옵션을 사용하면 OData 엔드포인트에서 반환되는 데이터의 모양을 변경할 수 있습니다. 자세한 내용은 Web API OData에서 $select 및 $expand 지원 소개를 참조하세요.

향상된 확장성

이제 OData 포맷터를 확장할 수 있습니다. Atom 항목 메타데이터를 추가하고, 명명된 스트림 및 미디어 링크 항목을 지원하고, instance 주석을 추가하고, 링크 생성 방법을 사용자 지정할 수 있습니다.

형식 없는 지원

이제 엔터티 형식에 대한 CLR 형식을 정의할 필요 없이 OData 서비스를 빌드할 수 있습니다. 대신 OData 컨트롤러는 OData 포맷터 serialize/deserialize인 IEdmObject의 인스턴스를 사용하거나 반환할 수 있습니다.

기존 모델 다시 사용

기존 EDM(엔터티 데이터 모델)이 이미 있는 경우 이제 새 엔터티 데이터 모델을 빌드하는 대신 직접 다시 사용할 수 있습니다. 예를 들어 Entity Framework를 사용하는 경우 EF에서 빌드하는 EDM을 사용할 수 있습니다.

일괄 처리 요청

요청 일괄 처리는 여러 작업을 단일 HTTP POST 요청으로 결합하여 네트워크 트래픽을 줄이고 더 원활하고 덜 번잡한 사용자 인터페이스를 제공합니다. 이제 ASP.NET Web API 요청 일괄 처리에 대한 몇 가지 전략을 지원합니다.

  • OData 서비스의 $batch 엔드포인트를 사용합니다.
  • 여러 요청을 단일 MIME 다중 파트 요청으로 패키지합니다.
  • 사용자 지정 일괄 처리 형식을 사용합니다.

요청 일괄 처리를 사용하도록 설정하려면 일괄 처리기가 있는 경로를 Web API 구성에 추가하기만 하면 됩니다.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
        config.Routes.MapHttpBatchRoute( 
            routeName: "WebApiBatch", 
            routeTemplate: "api/batch", 
            batchHandler: new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer)); 
    } 
}

요청 또는 실행 여부를 순차적으로 또는 순서대로 제어할 수도 있습니다.

이식 가능한 ASP.NET Web API 클라이언트

이제 ASP.NET Web API 클라이언트를 사용하여 Windows 스토어 및 Windows Phone 8개 애플리케이션에서 작동하는 이식 가능한 클래스 라이브러리를 만들 수 있습니다. 클라이언트와 서버에서 공유할 수 있는 이식 가능한 포맷터를 만들 수도 있습니다.

향상된 테스트 용이성

Web API 2를 사용하면 API 컨트롤러를 훨씬 쉽게 단위 테스트할 수 있습니다. 요청 메시지 및 구성을 사용하여 API 컨트롤러를 인스턴스화한 다음 테스트하려는 작업 메서드를 호출하기만 하면 됩니다. 또한 링크 생성을 수행하는 작업 메서드의 경우 UrlHelper 클래스를 쉽게 모의할 수 있습니다.

IHttpActionResult

이제 IHttpActionResult를 구현하여 Web API 작업 메서드의 결과를 캡슐화할 수 있습니다. Web API 작업 메서드에서 반환된 IHttpActionResult는 ASP.NET Web API 런타임에서 실행되어 결과 응답 메시지를 생성합니다. Web API 구현의 단위 테스트를 간소화하기 위해 모든 Web API 작업에서 IHttpActionResult를 반환할 수 있습니다. 편의를 위해 특정 상태 코드, 형식이 지정된 콘텐츠 또는 콘텐츠 협상 응답을 반환하는 결과를 포함하여 많은 IHttpActionResult 구현이 기본 제공됩니다.

HttpRequestContext

HttpRequestContext 는 요청에 연결되었지만 요청에서 즉시 사용할 수 없는 상태를 추적합니다. 예를 들어 HttpRequestContext 를 사용하여 경로 데이터, 요청과 연결된 보안 주체, 클라이언트 인증서, UrlHelper 및 가상 경로 루트를 가져올 수 있습니다. 단위 테스트를 위해 HttpRequestContext를 쉽게 만들 수 있습니다.

요청의 보안 주체는 Thread.CurrentPrincipal을 사용하는 대신 요청과 함께 전달되므로 이제 웹 API 파이프라인에 있는 동안 요청의 수명 동안 보안 주체를 사용할 수 있습니다.

CORS

브록 앨런의 또 다른 훌륭한 기여 덕분에 ASP.NET 이제 CORS(원본 간 요청 공유)를 완전히 지원합니다.

브라우저 보안은 웹 페이지에서 다른 도메인으로 AJAX 요청을 수행하지 못하도록 방지합니다. CORS 는 서버가 동일한 원본 정책을 완화할 수 있는 W3C 표준입니다. CORS를 사용하면 서버에서 명시적으로 일부 원본 간 요청을 허용하는 한편 다른 요청은 거부할 수 있습니다.

이제 Web API 2는 실행 전 요청의 자동 처리를 포함하여 CORS를 지원합니다. 자세한 내용은 ASP.NET 웹 API에서 크로스-원본 리소스 요청 사용을 참조하세요.

인증 필터

인증 필터는 ASP.NET Web API 파이프라인에서 권한 부여 필터 이전에 실행되고 모든 컨트롤러에 대해 작업별 인증 논리, 컨트롤러별 또는 전역으로 지정할 수 있는 ASP.NET Web API 새로운 종류의 필터입니다. 인증은 요청의 자격 증명을 필터링하고 해당 보안 주체를 제공합니다. 인증 필터는 권한 없는 요청에 대한 응답으로 인증 문제를 추가할 수도 있습니다.

필터 재정의

이제 재정의 필터를 지정하여 지정된 작업 메서드 또는 컨트롤러에 적용되는 필터를 재정의할 수 있습니다. 재정의 필터는 지정된 scope(작업 또는 컨트롤러)에 대해 실행해서는 안 되는 필터 형식 집합을 지정합니다. 이렇게 하면 전역 필터를 추가한 다음 특정 작업 또는 컨트롤러에서 일부를 제외할 수 있습니다.

OWIN 통합

이제 ASP.NET Web API OWIN을 완전히 지원하며 모든 OWIN 지원 호스트에서 실행할 수 있습니다. OWIN 인증 시스템과의 통합을 제공하는 HostAuthenticationFilter 도 포함되어 있습니다.

OWIN 통합을 사용하면 SignalR과 같은 다른 OWIN 미들웨어와 함께 자체 프로세스에서 Web API를 자체 호스팅할 수 있습니다. 자세한 내용은 OWIN을 사용하여 Self-Host ASP.NET Web API 참조하세요.

ASP.NET SignalR 2.0

다음 섹션에서는 SignalR 2.0의 기능에 대해 설명합니다.

기존 1.x 프로젝트를 SignalR 2.0으로 업그레이드하는 방법의 예는 SignalR 1.x 프로젝트 업그레이드를 참조하세요.

OWIN 기반 빌드

SignalR 2.0은 OWIN(.NET용 오픈 웹 인터페이스)을 기반으로 완전히 빌드되었습니다. 이 변경으로 인해 웹 호스팅 및 자체 호스팅 SignalR 애플리케이션 간에 SignalR 설정 프로세스가 훨씬 더 일관되지만 여러 API 변경이 필요했습니다.

MapHubs 및 MapConnection은 이제 MapSignalR입니다.

OWIN 표준과의 호환성을 위해 이러한 메서드의 이름이 로 변경 MapSignalR되었습니다. MapSignalR 매개 변수 없이 호출하면 모든 허브(버전 1.x에서와 같이 MapHubs )가 매핑됩니다. 개별 PersistentConnection 개체를 매핑하려면 연결 형식을 형식 매개 변수로 지정하고 연결의 URL 확장을 첫 번째 인수로 지정합니다.

메서드는 MapSignalR Owin 시작 클래스에서 호출됩니다. Visual Studio 2013 Owin 시작 클래스에 대한 새 템플릿을 포함합니다. 이 템플릿을 사용하려면 다음을 수행합니다.

  1. 프로젝트를 마우스 오른쪽 단추로 클릭
  2. 추가, 새 항목... 을 선택합니다.
  3. Owin Startup 클래스를 선택합니다. 새 클래스 이름을 Startup.cs로 지정합니다.

웹 애플리케이션에서 메서드를 포함하는 MapSignalR Owin 시작 클래스는 아래와 같이 Web.Config 파일의 애플리케이션 설정 노드에 있는 항목을 사용하여 Owin의 시작 프로세스에 추가됩니다.

자체 호스팅 애플리케이션에서 Startup 클래스는 메서드의 WebApp.Start 형식 매개 변수로 전달됩니다.

SignalR 1.x의 허브 및 연결 매핑(웹 애플리케이션의 전역 애플리케이션 파일에서):

protected void Application_Start(object sender, EventArgs e) 
{
    // Map all hubs to "/signalr"
    RouteTable.Routes.MapHubs();
    // Map the Echo PersistentConnection to "/echo"
    RouteTable.Routes.MapConnection<myconnection>("echo", "/echo");
}

Owin Startup 클래스 파일에서 SignalR 2.0의 허브 및 연결 매핑:

using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(MyWebApplication.Startup))]

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Map all hubs to "/signalr"
            app.MapSignalR();
            // Map the Echo PersistentConnection to "/echo"
            app.MapSignalR<echoconnection>("/echo");
        }
    }
}

자체 호스팅 애플리케이션에서 Startup 클래스는 아래와 같이 메서드의 WebApp.Start 형식 매개 변수로 전달됩니다.

string url = "http://localhost:8080";
using (WebApp.Start<startup>(url))
{
    Console.WriteLine("Server running on {0}", url);
    Console.ReadLine();
}

도메인 간 지원

SignalR 1.x에서 도메인 간 요청은 단일 EnableCrossDomain 플래그로 제어되었습니다. 이 플래그는 JSONP 및 CORS 요청을 모두 제어했습니다. 유연성을 높이기 위해 모든 CORS 지원이 SignalR의 서버 구성 요소에서 제거되었으며(브라우저에서 지원하는 것으로 감지된 경우 JavaScript 클라이언트는 CORS를 정상적으로 사용함) 이러한 시나리오를 지원하기 위해 새로운 OWIN 미들웨어를 사용할 수 있게 되었습니다.

SignalR 2.0에서 클라이언트에 JSONP가 필요한 경우(이전 브라우저에서 도메인 간 요청을 지원하려면) 아래와 같이 개체true를 로 HubConfiguration 설정 EnableJSONP 하여 명시적으로 사용하도록 설정해야 합니다. JSONP는 CORS보다 안전하지 않으므로 기본적으로 사용하지 않도록 설정됩니다.

SignalR 2.0에서 새 CORS 미들웨어를 추가하려면 아래 섹션과 같이 프로젝트에 라이브러리를 추가하고 Microsoft.Owin.Cors SignalR 미들웨어 앞에 를 호출 UseCors 합니다.

프로젝트에 Microsoft.Owin.Cors 추가: 이 라이브러리를 설치하려면 패키지 관리자 콘솔에서 다음 명령을 실행합니다.

Install-Package Microsoft.Owin.Cors

이 명령은 2.0.0 버전의 패키지를 프로젝트에 추가합니다.

UseCors 호출

다음 코드 조각은 SignalR 1.x 및 2.0에서 도메인 간 연결을 구현하는 방법을 보여 줍니다.

SignalR 1.x에서 도메인 간 요청 구현(전역 애플리케이션 파일에서)

protected void Application_Start(object sender, EventArgs e) 
{
    var hubConfiguration = new HubConfiguration();
    hubConfiguration.EnableCrossDomain = true;
    RouteTable.Routes.MapHubs(hubConfiguration);
}

SignalR 2.0에서 도메인 간 요청 구현(C# 코드 파일에서)

다음 코드에서는 SignalR 2.0 프로젝트에서 CORS 또는 JSONP를 사용하도록 설정하는 방법을 보여 줍니다. 이 코드 샘플에서는 및 를 대신 MapSignalR사용 MapRunSignalR 하므로 CORS 미들웨어는 CORS 지원이 필요한 SignalR 요청에 대해서만 실행되므로(에 지정된 MapSignalR경로의 모든 트래픽이 아니라) Map 전체 애플리케이션이 아닌 특정 URL 접두사에 대해 실행해야 하는 다른 미들웨어에도 사용할 수 있습니다.

using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Owin;

[assembly: OwinStartup(typeof(MyWebApplication.Startup))]

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Branch the pipeline here for requests that start with "/signalr"
            app.Map("/signalr", map =>
            {
                // Setup the CORS middleware to run before SignalR.
                // By default this will allow all origins. You can 
                // configure the set of origins and/or http verbs by
                // providing a cors options with a different policy.
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration 
                {
                    // You can enable JSONP by uncommenting line below.
                    // JSONP requests are insecure but some older browsers (and some
                    // versions of IE) require JSONP to work cross domain
                    // EnableJSONP = true
                };
                // Run the SignalR pipeline. We're not using MapSignalR
                // since this branch already runs under the "/signalr"
                // path.
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}

MonoTouch 및 MonoDroid를 통한 iOS 및 Android 지원

Xamarin 라이브러리의 MonoTouch 및 MonoDroid 구성 요소를 사용하여 iOS 및 Android 클라이언트에 대한 지원이 추가되었습니다. 사용 방법에 대한 자세한 내용은 Xamarin 구성 요소 사용을 참조하세요. 이러한 구성 요소는 SignalR RTW 릴리스를 사용할 수 있는 경우 Xamarin Store 에서 사용할 수 있습니다.

### 이식 가능한 .NET 클라이언트

플랫폼 간 개발을 용이하게 하기 위해 Silverlight, WinRT 및 Windows Phone 클라이언트는 다음 플랫폼을 지원하는 단일 이식 가능한 .NET 클라이언트로 대체되었습니다.

  • NET 4.5
  • Silverlight 5
  • WinRT(Windows 스토어 앱용.NET)
  • Windows Phone 8

새 Self-Host 패키지

이제 SignalR Self-Host(웹 서버에서 호스트되는 것이 아니라 프로세스 또는 다른 애플리케이션에서 호스트되는 SignalR 애플리케이션)을 더 쉽게 시작할 수 있는 NuGet 패키지가 있습니다. SignalR 1.x로 빌드된 자체 호스트 프로젝트를 업그레이드하려면 Microsoft.AspNet.SignalR.Owin 패키지를 제거하고 Microsoft.AspNet.SignalR.SelfHost 패키지를 추가합니다. 자체 호스트 패키지 시작에 대한 자세한 내용은 자습서: SignalR 자체 호스트를 참조하세요.

이전 버전과 호환되는 서버 지원

이전 버전의 SignalR에서는 클라이언트와 서버에서 사용되는 SignalR 패키지의 버전이 동일해야 했습니다. 업데이트하기 어려운 두꺼운 클라이언트 애플리케이션을 지원하기 위해 SignalR 2.0은 이제 이전 클라이언트에서 최신 서버 버전 사용을 지원합니다. 참고: SignalR 2.0은 최신 클라이언트가 있는 이전 버전으로 빌드된 서버를 지원하지 않습니다.

.NET 4.0에 대한 서버 지원이 제거됨

SignalR 2.0은 .NET 4.0과의 서버 상호 운용성에 대한 지원을 중단했습니다. .NET 4.5는 SignalR 2.0 서버와 함께 사용해야 합니다. SignalR 2.0용 .NET 4.0 클라이언트는 여전히 있습니다.

클라이언트 및 그룹 목록에 메시지 보내기

SignalR 2.0에서는 클라이언트 및 그룹 ID 목록을 사용하여 메시지를 보낼 수 있습니다. 다음 코드 조각은 이 작업을 수행하는 방법을 보여 줍니다.

PersistentConnection을 사용하여 클라이언트 및 그룹 목록에 메시지 보내기

using Microsoft.AspNet.SignalR;
using System.Collections.Generic;
public class ChatConnection : PersistentConnection
{
    static List<string> ConnectionIds = new List<string>();
    static List<string> groups = new List<string>{"chatGroup", "chatGroup2"};
    protected override System.Threading.Tasks.Task OnReceived(IRequest request, string connectionId, string data)
    {
        Connection.Send(ConnectionIds, data);
        Groups.Send(groups, data);
        return base.OnReceived(request, connectionId, data);
    }
    protected override System.Threading.Tasks.Task OnConnected(IRequest request, string connectionId)
    {
        ConnectionIds.Add(connectionId);
        Groups.Add(connectionId, "chatGroup");
        return base.OnConnected(request, connectionId);
    }
    protected override System.Threading.Tasks.Task OnDisconnected(IRequest request, string connectionId)
    {
        ConnectionIds.Remove(connectionId);
        return base.OnDisconnected(request, connectionId);
    }
}

허브를 사용하여 클라이언트 및 그룹 목록에 메시지 보내기

using Microsoft.AspNet.SignalR;
using System.Collections.Generic;
public class ChatHub : Hub
{
    static List<string> ConnectionIds = new List<string>();
    static List<string> groups = new List<string> { "chatGroup", "chatGroup2" };
    public void Send(string name, string message)
    {
        // Call the broadcastMessage method to update clients.
        Clients.Clients(ConnectionIds).broadcastMessage(name, message);
        Clients.Groups(groups).broadcastMessage(name, message);
    }
    public override System.Threading.Tasks.Task OnConnected()
    {
        ConnectionIds.Add(Context.ConnectionId);
        Groups.Add(Context.ConnectionId, "chatGroup");
        return base.OnConnected();
    }
    public override System.Threading.Tasks.Task OnDisconnected()
    {
        ConnectionIds.Remove(Context.ConnectionId);
        return base.OnDisconnected();
    }
}

특정 사용자에게 메시지 보내기

이 기능을 사용하면 사용자가 새 인터페이스 IUserIdProvider를 통해 IRequest를 기반으로 하는 userId를 지정할 수 있습니다.

IUserIdProvider 인터페이스

public interface IUserIdProvider
{
    string GetUserId(IRequest request);
}

기본적으로 사용자의 IPrincipal.Identity.Name 사용자 이름으로 사용하는 구현이 있습니다.

허브에서는 새 API를 통해 이러한 사용자에게 메시지를 보낼 수 있습니다.

Clients.User API 사용

public class MyHub : Hub
{
    public void Send(string userId, string message)
    {
        Clients.User(userId).send(message);
    }
}

향상된 오류 처리 지원

이제 사용자는 허브 호출에서 HubException 을 throw할 수 있습니다. HubException의 생성자는 문자열 메시지와 개체 추가 오류 데이터를 사용할 수 있습니다. SignalR은 예외를 자동으로 직렬화하고 허브 메서드 호출을 거부/실패하는 데 사용되는 클라이언트로 보냅니다.

자세한 허브 예외 표시 설정은 HubException이 클라이언트로 다시 전송되는 것과 관련이 없습니다. 항상 전송됩니다.

클라이언트에 HubException을 보내는 방법을 보여 주는 서버 쪽 코드

public class MyHub : Hub
{
    public void Send(string message)
    {
        if(message.Contains("<script>"))
        {
            throw new HubException("This message will flow to the client", new { user = Context.User.Identity.Name, message = message });
        }

        Clients.All.send(message);
    }
}

서버에서 보낸 HubException에 응답하는 것을 보여 주는 JavaScript 클라이언트 코드

myHub.server.send("<script>")
            .fail(function (e) {
                if (e.source === 'HubException') {
                    console.log(e.message + ' : ' + e.data.user);
                }
            });

서버에서 보낸 HubException에 응답하는 것을 보여 주는 .NET 클라이언트 코드

try
{
    await myHub.Invoke("Send", "<script>");
}
catch(HubException ex)
{
    Conosle.WriteLine(ex.Message);
}

허브의 보다 쉬운 단위 테스트

SignalR 2.0에는 모의 클라이언트 쪽 호출을 더 쉽게 만들 수 있는 Hubs에 라는 IHubCallerConnectionContext 인터페이스가 포함되어 있습니다. 다음 코드 조각은 xUnit.net 및moq에서 인기 있는 테스트 하네스와 함께 이 인터페이스를 사용하는 방법을 보여 줍니다.

xUnit.net 사용하여 SignalR 단위 테스트

[Fact]
public void HubsAreMockableViaDynamic()
{
    bool sendCalled = false;
    var hub = new MyHub();
    var mockClients = new Mock<IHubCallerConnectionContext>();
    hub.Clients = mockClients.Object;
    dynamic all = new ExpandoObject();
    all.send = new Action<string>(message =>
    {
        sendCalled = true;
    });
    mockClients.Setup(m => m.All).Returns((ExpandoObject)all);
    hub.Send("foo");
    Assert.True(sendCalled);
}

moq를 사용한 단위 테스트 SignalR

[Fact]
public interface IClientContract
{
    void send(string message);
}
public void HubsAreMockableViaType()
{
    var hub = new MyHub();
    var mockClients = new Mock<IHubCallerConnectionContext>();
    var all = new Mock<IClientContract>();
    hub.Clients = mockClients.Object;
    all.Setup(m => m.send(It.IsAny<string>())).Verifiable();
    mockClients.Setup(m => m.All).Returns(all.Object);
    hub.Send("foo");
    all.VerifyAll();

JavaScript 오류 처리

SignalR 2.0에서 모든 JavaScript 오류 처리 콜백은 원시 문자열 대신 JavaScript 오류 개체를 반환합니다. 이를 통해 SignalR은 더 풍부한 정보를 오류 처리기로 흐를 수 있습니다. 오류의 속성에서 내부 예외를 source 가져올 수 있습니다.

Start.Fail 예외를 처리하는 JavaScript 클라이언트 코드

connection.start().fail(function(e) {
    console.log('The error is: ' + e.message);
});

ASP.NET ID

새 ASP.NET 멤버 자격 시스템

ASP.NET ID는 ASP.NET 애플리케이션에 대한 새로운 멤버 자격 시스템입니다. ASP.NET ID를 사용하면 사용자별 프로필 데이터를 애플리케이션 데이터와 쉽게 통합할 수 있습니다. ASP.NET ID를 사용하면 애플리케이션에서 사용자 프로필에 대한 지속성 모델을 선택할 수도 있습니다. NoSQL 데이터 저장소(예: Azure Storage 테이블)를 비롯하여 SQL Server 데이터베이스나 다른 데이터 저장소에 데이터를 저장할 수 있습니다. 자세한 내용은 Visual Studio 2013 ASP.NET 웹 프로젝트 만들기의개별 사용자 계정을 참조하세요.

클레임 기반 인증

이제 ASP.NET 사용자의 ID가 신뢰할 수 있는 발급자의 클레임 집합으로 표시되는 클레임 기반 인증을 지원합니다. 사용자는 애플리케이션 데이터베이스에서 유지 관리되는 사용자 이름 및 암호를 사용하거나 소셜 ID 공급자(예: Microsoft 계정, Facebook, Google, Twitter)를 사용하거나 Azure Active Directory 또는 ADFS(Active Directory Federation Services)를 통해 조직 계정을 사용하여 인증할 수 있습니다.

Azure Active Directory 및 Windows Server Active Directory 통합

이제 인증에 Azure Active Directory 또는 AD(Windows Server Active Directory)를 사용하는 ASP.NET 프로젝트를 만들 수 있습니다. 자세한 내용은 Visual Studio 2013 ASP.NET 웹 프로젝트 만들기의조직 계정을 참조하세요.

OWIN 통합

이제 ASP.NET 인증은 모든 OWIN 기반 호스트에서 사용할 수 있는 OWIN 미들웨어를 기반으로 합니다. OWIN에 대한 자세한 내용은 다음 Microsoft OWIN 구성 요소 섹션을 참조하세요 .

Microsoft OWIN 구성 요소

OWIN(Open Web Interface for .NET)은 .NET 웹 서버와 웹 애플리케이션 간의 추상화 를 정의합니다. OWIN은 웹 애플리케이션을 서버에서 분리하여 웹 애플리케이션을 호스트에 관계 없이 만듭니다. 예를 들어 IIS에서 OWIN 기반 웹 애플리케이션을 호스트하거나 사용자 지정 프로세스에서 자체 호스팅할 수 있습니다.

Microsoft OWIN 구성 요소(Katana 프로젝트라고도 함)에 도입된 변경 내용에는 새 서버 및 호스트 구성 요소, 새 도우미 라이브러리 및 미들웨어, 새 인증 미들웨어가 포함됩니다.

OWIN 및 Katana에 대한 자세한 내용은 OWIN 및 Katana의 새로운 기능 을 참조하세요.

참고: OWIN 애플리케이션은 IIS 클래식 모드에서 실행할 수 없습니다. 통합 모드에서 실행해야 합니다.

참고: OWIN 애플리케이션은 완전 신뢰로 실행되어야 합니다.

새 서버 및 호스트

이 릴리스에서는 자체 호스트 시나리오를 사용하도록 새 구성 요소가 추가되었습니다. 이러한 구성 요소에는 다음 NuGet 패키지가 포함됩니다.

  • Microsoft.Owin.Host.HttpListener. HttpListener를 사용하여 HTTP 요청을 수신 대기하고 OWIN 파이프라인으로 보내는 OWIN 서버를 제공합니다.
  • Microsoft.Owin.Hosting 콘솔 애플리케이션 또는 Windows 서비스와 같은 사용자 지정 프로세스에서 OWIN 파이프라인을 자체 호스트하려는 개발자를 위한 라이브러리를 제공합니다.
  • OwinHost. 사용자 지정 호스트 애플리케이션을 작성하지 않고도 OWIN 파이프라인을 래핑 Microsoft.Owin.Hosting 하고 자체 호스팅할 수 있는 독립 실행형 실행 파일을 제공합니다.

또한 패키지는 Microsoft.Owin.Host.SystemWeb 이제 미들웨어가 SystemWeb 서버에 힌트를 제공할 수 있도록 하여 특정 ASP.NET 파이프라인 단계에서 미들웨어를 호출해야 함을 나타냅니다. 이 기능은 ASP.NET 파이프라인에서 초기에 실행되어야 하는 인증 미들웨어에 특히 유용합니다.

도우미 라이브러리 및 미들웨어

OWIN 사양의 함수 및 형식 정의만 사용하여 OWIN 구성 요소를 작성할 수 있지만 새 Microsoft.Owin 패키지는 사용자에게 친숙한 추상화 집합을 제공합니다. 이 패키지는 여러 이전 패키지(예: Owin.Extensions, Owin.Types)를 다른 OWIN 구성 요소에서 쉽게 사용할 수 있는 잘 구성된 단일 개체 모델로 결합합니다. 실제로 대부분의 Microsoft OWIN 구성 요소는 이제 이 패키지를 사용합니다.

참고

OWIN 애플리케이션은 IIS 클래식 모드에서 실행할 수 없습니다. 통합 모드에서 실행해야 합니다.

참고

OWIN 애플리케이션은 완전 신뢰로 실행되어야 합니다.

이 릴리스에는 실행 중인 OWIN 애플리케이션의 유효성을 검사하는 미들웨어와 오류를 조사하는 데 도움이 되는 오류 페이지 미들웨어가 포함된 Microsoft.Owin.Diagnostics 패키지도 포함되어 있습니다.

인증 구성 요소

다음 인증 구성 요소를 사용할 수 있습니다.

  • Microsoft.Owin.Security.ActiveDirectory. 온-프레미스 또는 클라우드 기반 디렉터리 서비스를 사용하여 인증을 사용하도록 설정합니다.
  • Microsoft.Owin.Security.Cookies 쿠키 를 사용하여 인증을 사용하도록 설정합니다. 이 패키지의 이름은 이전에 로 지정되었습니다 Microsoft.Owin.Security.Forms.
  • Microsoft.Owin.Security.Facebook은 Facebook 의 OAuth 기반 서비스를 사용하여 인증을 사용하도록 설정합니다.
  • Microsoft.Owin.Security.Google은 Google 의 OpenID 기반 서비스를 사용하여 인증을 사용하도록 설정합니다.
  • Microsoft.Owin.Security.Jwt JWT 토큰을 사용하여 인증을 사용하도록 설정합니다.
  • Microsoft.Owin.Security.MicrosoftAccount Microsoft 계정을 사용하여 인증을 사용하도록 설정합니다.
  • Microsoft.Owin.Security.OAuth. 전달자 토큰을 인증하기 위한 미들웨어뿐만 아니라 OAuth 권한 부여 서버를 제공합니다.
  • Microsoft.Owin.Security.Twitter는 Twitter 의 OAuth 기반 서비스를 사용하여 인증을 사용하도록 설정합니다.

이 릴리스에는 원본 간 HTTP 요청을 처리하기 위한 미들웨어가 포함된 패키지도 포함되어 Microsoft.Owin.Cors 있습니다.

참고

JWT 서명에 대한 지원은 최종 버전의 Visual Studio 2013 제거되었습니다.

Entity Framework 6

Entity Framework 6의 새로운 기능 및 기타 변경 내용 목록은 Entity Framework 버전 기록을 참조하세요.

ASP.NET Razor 3

ASP.NET Razor 3에는 다음과 같은 새로운 기능이 포함되어 있습니다.

  • 탭 편집 지원. 이전에는 Tab 키 유지 옵션을 사용할 때 Visual Studio에서 문서 서식 지정 명령, 자동 입력 및 자동 서식 지정이 제대로 작동하지 않았습니다. 이 변경은 탭 서식 지정을 위해 Razor 코드에 대한 Visual Studio 서식을 수정합니다.
  • 링크를 생성할 때 URL 다시 쓰기 규칙을 지원합니다.
  • 보안 투명 특성 제거.

    참고

    이는 호환성이 손상되는 변경이며 Razor 3이 MVC4 이하와 호환되지 않는 반면 Razor 2는 MVC5 또는 MVC5에 대해 컴파일된 어셈블리와 호환되지 않습니다.

=======

ASP.NET 앱 일시 중단

ASP.NET 앱 일시 중단은 단일 컴퓨터에서 많은 수의 ASP.NET 사이트를 호스팅하기 위한 사용자 환경 및 경제 모델을 근본적으로 변경하는 .NET Framework 4.5.1의 판도를 바꾸는 기능입니다. 자세한 내용은 ASP.NET 앱 일시 중단 – 반응형 공유 .NET 웹 호스팅을 참조하세요.

알려진 문제 및 호환성이 손상되는 변경

이 섹션에서는 Visual Studio 2013 대한 ASP.NET 및 Web Tools 알려진 문제 및 호환성이 손상되는 변경에 대해 설명합니다.

NuGet

  • SLN 파일을 사용하는 경우 Mono에서 새 패키지 복원이 작동하지 않습니다. 향후 nuget.exe 다운로드 및 NuGet.CommandLine 패키지 업데이트에서 수정될 예정입니다.
  • 새 패키지 복원은 Wix 프로젝트에서 작동하지 않습니다. 향후 nuget.exe 다운로드 및 NuGet.CommandLine 패키지 업데이트에서 수정될 예정입니다.

ASP.NET Web API

  1. ODataQueryOptions<T>.ApplyTo(IQueryable)는 및 $expand에 대한 $select 지원을 추가했기 때문에 항상 반환 IQueryable<T> 되지는 않습니다.

    에 대한 ODataQueryOptions<T> 이전 샘플은 항상 반환 값을 에서 로 ApplyToIQueryable<T>캐스팅했습니다. 이는 이전에 지원한 쿼리 옵션($filter, $orderby, , $skip$top)이 쿼리의 모양을 변경하지 않기 때문에 이전에 작동했습니다. 이제 지원 $select 되며 $expand 의 반환 값 ApplyTo 이 항상 그런 것은 IQueryable<T> 아닙니다.

    // Sample ODataQueryOptions<T> usage from earlier
    public IQueryable<Customer> Get(ODataQueryOptions<Customer> query)
    {
        IQueryable<customer> result="query.ApplyTo(_customers)" as iqueryable<customer>; return result;
    }
    

    이전의 샘플 코드를 사용하는 경우 클라이언트가 및 $expand을 보내지 $select 않는 경우 계속 작동합니다. 그러나 지원 $select$expand 하려는 경우 해당 코드를 이 코드로 변경해야 합니다.

    public IHttpActionResult Get(ODataQueryOptions<Customer> query)
    {
        IQueryable result = query.ApplyTo(_customers);
        return Ok(result, result.GetType());
    }
     
    private IHttpActionResult Ok(object content, Type type)
    {
        Type resultType = typeof(OkNegotiatedContentResult<>).MakeGenericType(type);
        return Activator.CreateInstance(resultType, content, this) as IHttpActionResult;
    }
    
  2. Batch 요청 중에 Request.Url 또는 RequestContext.Url이 null입니다.

    일괄 처리 시나리오에서는 Request.Url 또는 RequestContext.Url에서 액세스할 때 UrlHelper가 null입니다.

    이 문제의 해결 방법은 다음 예제와 같이 UrlHelper의 새 instance 만드는 것입니다.

    UrlHelper의 새 instance 만들기

    if (RequestContext.Url == null)
    {
        RequestContext.Url = new UrlHelper(Request);
    }
    

ASP.NET MVC

  1. MVC5 및 OrgAuth를 사용하는 경우 AntiForgerToken 유효성 검사를 수행하는 보기가 있는 경우 보기에 데이터를 게시할 때 다음 오류가 발생할 수 있습니다.

    오류:

    '/' 애플리케이션의 서버 오류.

    제공된 ClaimsIdentity에 또는 형식 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifierhttps://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider 의 클레임이 없습니다. 클레임 기반 인증에서 위조 방지 토큰 지원을 사용하도록 설정하려면 구성된 클레임 공급자가 생성하는 ClaimsIdentity 인스턴스에서 이러한 클레임을 모두 제공하는지 확인하세요. 구성된 클레임 공급자가 다른 클레임 형식을 고유 식별자로 사용하는 경우 정적 속성 AntiForgeryConfig.UniqueClaimTypeIdentifier를 설정하여 구성할 수 있습니다.

    해결 방법:

    Global.asax에 다음 줄을 추가하여 수정합니다.

    AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;

    이 문제는 다음 릴리스에 대해 수정될 예정입니다.

  2. MVC4 앱을 MVC5로 업그레이드한 후 솔루션을 빌드하고 시작합니다. 다음 오류가 표시됩니다.

    [A] System.Web.WebPages.Razor.Configuration.HostSection은 [B]System.Web.WebPages.Razor.Configuration.HostSection으로 캐스팅할 수 없습니다. 형식 A는 위치 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'의 컨텍스트 'Default'에서 'System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'에서 시작됩니다. B형식은 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\6d05bbd0\e8b5908e\assembly\dl3\c9cbca63\f8910382_6273ce01\System.Web.WebPages.Razor.dll' 컨텍스트 'Default'의 'System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'에서 시작됩니다.

    위의 오류를 해결하려면 프로젝트의 모든 Web.config 파일(Views 폴더에 있는 파일 포함)을 열고 다음을 수행합니다.

    1. "System.Web.Mvc" 버전 "4.0.0.0"의 모든 항목을 "5.0.0.0"으로 업데이트합니다.

    2. "System.Web.Helpers", "System.Web.WebPages" 및 "System.Web.WebPages.Razor"의 모든 버전 "2.0.0.0"을 "3.0.0.0"으로 업데이트합니다.

      예를 들어 위의 내용을 변경한 후에는 어셈블리 바인딩이 다음과 같이 표시됩니다.

      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
      

      MVC 4 프로젝트를 MVC 5로 업그레이드하는 방법에 대한 자세한 내용은 ASP.NET MVC 4 및 Web API 프로젝트를 ASP.NET MVC 5 및 Web API 2로 업그레이드하는 방법을 참조하세요.

  3. jQuery Unobtrusive Validation과 함께 클라이언트 쪽 유효성 검사를 사용하는 경우 type='number'가 있는 HTML 입력 요소에 대한 유효성 검사 메시지가 잘못된 경우가 있습니다. 유효한 숫자가 필요하다는 올바른 메시지 대신 잘못된 숫자를 입력하면 필요한 값("나이 필드가 필수")에 대한 유효성 검사 오류가 표시됩니다.

    이 문제는 일반적으로 만들기 및 편집 보기에서 정수 속성이 있는 모델의 스캐폴드된 코드에서 찾을 수 있습니다.

    이 문제를 해결하려면 편집기 도우미를 다음에서 변경합니다.

    @Html.EditorFor(person => person.Age)

    대상:

    @Html.TextBoxFor(person => person.Age)

  4. ASP.NET MVC 5는 더 이상 부분 신뢰를 지원하지 않습니다. MVC 또는 WebAPI 이진 파일에 연결하는 프로젝트는 SecurityTransparent 특성 및 AllowPartiallyTrustedCallers 특성을 제거해야 합니다. 이러한 특성을 제거하면 다음과 같은 컴파일러 오류가 제거됩니다.

    Attempt by security transparent method ‘MyComponent' to access security critical type 'System.Web.Mvc.MvcHtmlString' failed. Assembly 'PagedList.Mvc, Version=4.3.0.0, Culture=neutral, PublicKeyToken=abbb863e9397c5e1' is marked with the AllowPartiallyTrustedCallersAttribute, and uses the level 2 security transparency model. Level 2 transparency causes all methods in AllowPartiallyTrustedCallers assemblies to become security transparent by default, which may be the cause of this exception.

    이에 따른 부작용으로 동일한 애플리케이션에서 4.0 및 5.0 어셈블리를 사용할 수 없습니다. 모든 항목을 5.0으로 업데이트해야 합니다.

Facebook 권한 부여가 있는 SPA 템플릿은 웹 사이트가 인트라넷 영역에서 호스트되는 동안 IE에서 불안정을 일으킬 수 있습니다.

SPA 템플릿은 Facebook을 사용하여 외부 로그인을 제공합니다. 템플릿을 사용하여 만든 프로젝트가 로컬로 실행 중인 경우 로그인하면 IE가 충돌할 수 있습니다.

해결책:

  1. 인터넷 영역에서 웹 사이트를 호스트합니다. 또는

  2. IE 이외의 브라우저에서 시나리오를 테스트합니다.

Web Forms 스캐폴딩

Web Forms 스캐폴딩은 VS2013에서 제거되었으며 Visual Studio에 대한 향후 업데이트에서 사용할 수 있습니다. 그러나 MVC 종속성을 추가하고 MVC에 대한 스캐폴딩을 생성하여 Web Forms 프로젝트 내에서 스캐폴딩을 계속 사용할 수 있습니다. 프로젝트에는 Web Forms 및 MVC의 조합이 포함됩니다.

Web Forms 프로젝트에 MVC를 추가하려면 새 스캐폴드된 항목을 추가하고 MVC 5 종속성을 선택합니다. 스크립트와 같은 모든 콘텐츠 파일이 필요한지 여부에 따라 최소 또는 전체를 선택합니다. 그런 다음 프로젝트에 보기 및 컨트롤러를 만드는 MVC에 대한 스캐폴드된 항목을 추가합니다.

MVC 및 Web API 스캐폴딩 - HTTP 404, 찾을 수 없음 오류

프로젝트에 스캐폴드된 항목을 추가할 때 오류가 발생하면 프로젝트가 일관되지 않은 상태로 남을 수 있습니다. 스캐폴딩이 변경된 일부 변경 내용은 롤백되지만 설치된 NuGet 패키지와 같은 다른 변경 내용은 롤백되지 않습니다. 라우팅 구성 변경 내용이 롤백되면 스캐폴드된 항목으로 이동할 때 사용자에게 HTTP 404 오류가 표시됩니다.

해결 방법:

  • MVC에 대한 이 오류를 해결하려면 새 스캐폴드된 항목을 추가하고 MVC 5 종속성(최소 또는 전체)을 선택합니다. 이 프로세스는 프로젝트에 필요한 모든 변경 내용을 추가합니다.

  • Web API에 대한 이 오류를 해결하려면 다음을 수행합니다.

    1. WebApiConfig 클래스를 프로젝트에 추가합니다.

      public static class WebApiConfig
      {
          public static void Register(HttpConfiguration config)
          {
              config.MapHttpAttributeRoutes();
              config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );
          }
      }
      
      Public Module WebApiConfig
          Public Sub Register(ByVal config As HttpConfiguration)
              config.MapHttpAttributeRoutes()
              config.Routes.MapHttpRoute(
                name:="DefaultApi",
                routeTemplate:="api/{controller}/{id}",
                defaults:=New With {.id = RouteParameter.Optional}
              )
          End Sub
      End Module
      
    2. 다음과 같이 Global.asax의 Application_Start 메서드에서 WebApiConfig.Register를 구성합니다.

      public class WebApiApplication : System.Web.HttpApplication
      {
          protected void Application_Start()
          {
              GlobalConfiguration.Configure(WebApiConfig.Register);    
          }
      }
      
      Public Class WebApiApplication
           Inherits System.Web.HttpApplication
       
           Sub Application_Start()     
             GlobalConfiguration.Configure(AddressOf WebApiConfig.Register)       
           End Sub
      End Class