ASP.NET Core and Angular 2 - Sergey Drozdov....
Transcript of ASP.NET Core and Angular 2 - Sergey Drozdov....
-
ASP.NET Core and Angular 2
Learn how to connect ASP.NET Core and Angular 2 to build a powerful and dynamic applications from scratch with this guide to cutting-edge web development
Valerio De Sanctis
BIRMINGHAM - MUMBAI
-
ASP.NET Core and Angular 2
Copyright 2016 Packt Publishing
All rights reserved. No part of this book may be reproduced, stored in a retrieval system, ortransmitted in any form or by any means, without the prior written permission of thepublisher, except in the case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of theinformation presented. However, the information contained in this book is sold withoutwarranty, either express or implied. Neither the author, nor Packt Publishing, and itsdealers and distributors will be held liable for any damages caused or alleged to be causeddirectly or indirectly by this book.
Packt Publishing has endeavored to provide trademark information about all of thecompanies and products mentioned in this book by the appropriate use of capitals.However, Packt Publishing cannot guarantee the accuracy of this information.
First published: October 2016
Production reference: 2061016
Published by Packt Publishing Ltd.Livery Place35 Livery StreetBirmingham B3 2PB, UK.ISBN 978-1-78646-568-9
www.packtpub.com
http://www.packtpub.com
-
Credits
Author Valerio De Sanctis
Copy Editor Safis Editing
Reviewer Vincent Maverick Durano
Project Coordinator Ulhas Kambali
Commissioning Editor Edward Gordon
Proofreader Safis Editing
Acquisition Editor Reshma Raman
Indexer Mariammal Chettiyar
Content Development Editor Onkar Wani
Production Coordinator Arvindkumar Gupta
Technical Editor Shivani K. Mistry
Cover Work Arvindkumar Gupta
-
About the AuthorValerio De Sanctis is a skilled IT professional with more than 12 years of experience in leadprogramming, web-based development, and project management using ASP.NET, PHP,and Java. He previously held senior positions at a range of financial and insurancecompanies, most recently serving as Chief Technology Officer and Chief Operating Officerat a leading after-sales and IT service provider for many top-tier life and non-life insurancegroups.
During the course of his career Valerio De Sanctis helped many private organizations toimplement and maintain .NET based solutions, working side by side with many IT industryexperts and leading several frontend, backend and UX development teams. He designed thearchitecture and actively oversaw the development of a wide number of corporate-levelweb application projects for high-profile clients, customers and partners including LondonStock Exchange Group, Zurich Insurance Group, Allianz, Generali, Harmonie Mutuelle,Honda Motor, FCA Group, Luxottica, ANSA, Saipem, ENI, Enel, Terna, Banzai Media,Virgilio.it, Repubblica.it, and Corriere.it.
He is an active member of the Stack Exchange Network, providing advices and tips for.NET, JavaScript, HTML5 and Web related topics on the StackOverflow, ServerFault, andSuperUser communities. Most of his projects and code samples are available under open-source licenses on GitHub, BitBucket, NPM, CocoaPods, JQuery Plugin Registry, andWordPress Plugin Repository.
He also runs an IT-oriented, web-focused blog at www.ryadel.com featuring news, reviews,code samples and guides to help developers and enthusiasts worldwide.
I would like to thank those who supported me in writing this book: my beloved andbeautiful wife for her awesome encouragement and invaluable support; my children Violaand Daniele; my parents and my sister for always being there in times of need; my ITcolleagues and partners in Ryadel, Teleborsa and Assirecre Group for their enduringfriendship. A special thanks to Vincent Maverick Durano for helping me to work throughsoftware and UI issues to determine if they were bugs or user errors, and to all PacktPublishing folks who worked hard to bring this book to life.
http://www.ryadel.com
-
About the ReviewerVincent Maverick Durano works as a Technical Lead Developer in a research anddevelopment company, focusing mainly on web and mobile technologies. His explorationinto programming began at the age of 15; Turbo PASCAL, C, C++, JAVA, VB6, ActionScripts and a variety of other equally obscure acronyms, mainly as a hobby. After severaldetours, he is now on the VB.NET to C# channel. He now works on ASP.NET, C#, MSSQL,EF, LINQ, AJAX, JavaScript, JQuery, Angular, HTML5, and CSS which go together likecoffee crumble ice cream. He's an eight-time Microsoft MVP, two-time C# Corner MVP,Microsoft Influencer, Dzone MVB, and a regular contributor at CodeASP.net in which healso moderate, CodeProject, C# Corner, AspSnippets, and Xamarin but more often at theofficial Microsoft ASP.NET community site where he became one of the All-Time TopAnswerer with ALL-STAR recognition level (the highest attainable level with 100,000+points). He authored a few e-books for C# Corner: GridView Control Pocket Guide,ASP.NET MVC5: Beginners Guide and is now working on a new e-book entitled ASP.NETCore and Angular 2 Code Venture. He runs a blog at h t t p : / / p r o u d m o n k e y . a z u r e w e b s i t e s. n e t / and created a few open-source projects that is hosted in Codeplex and GitHub.
http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/http://proudmonkey.azurewebsites.net/
-
www.PacktPub.comFor support files and downloads related to your book, please visit www.PacktPub.com.
Did you know that Packt offers eBook versions of every book published, with PDF andePub files available? You can upgrade to the eBook version at www.PacktPub.com and as aprint book customer, you are entitled to a discount on the eBook copy. Get in touch with usat [email protected] for more details.
At www.PacktPub.com, you can also read a collection of free technical articles, sign up for arange of free newsletters and receive exclusive discounts and offers on Packt books andeBooks.
h t t p s : / / w w w . p a c k t p u b . c o m / m a p t
Get the most in-demand software skills with Mapt. Mapt gives you full access to all Packtbooks and video courses, as well as industry-leading tools to help you plan your personaldevelopment and advance your career.
Why subscribe?Fully searchable across every book published by PacktCopy and paste, print, and bookmark contentOn demand and accessible via a web browser
http://www.PacktPub.comhttp://www.PacktPub.comhttp://www.PacktPub.comhttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapthttps://www.packtpub.com/mapt
-
Table of ContentsPreface 1Chapter 1: Getting Ready 8
Two players one goal 9What's new in Angular 2? 9The ASP.NET Core revolution 10
The field of choice single-page application 11Common features of a competitive SPA 11Product owner expectations 12
A sample single-page application project 14The vision 15Core requirements 16
Preparing the workspace 17Setting up the project 17Package and resource managers 20Installing the packages 21
NuGet and ASP.NET 21Project.json 22Startup.cs 23Testing the HTTP request pipeline 24Newtonsoft.Json 27
JavaScript, TypeScript, or Dart? 28Adding the tsconfig.json file 29Introducing NPM 32Working with Gulp 34
Dependent tasks 38Using Grunt instead of Gulp 39
Adding Angular 2 42Using NPM 42Adding Typings 45Using a CDN 47
Upgrading the typescriptServices.js file 47Setting up the client code 48
The component file 48A word on components and modules 50
The module file 50The bootstrap file 52The module loader configuration file 52
Why use a dynamic module loader? 54
-
[ ii ]
The index.html file 55First run 57
Caching issues 59The new ASP.NET Core configuration pattern 60
A faster alternative using scaffolding tools 62The reasons to say no (not yet) 63A quick scaffolding sample 63
References 64Suggested topics 65Summary 65
Chapter 2: ASP.NET Controllers and Server-Side Routes 66Data flow 67
The role of the ViewModel 69Our first Controller 69
The ItemViewModel 71The ItemsController 72
Understanding routes 76Defining routing 76
Routing through the ages 76Handling routes in ASP.NET Core 78
Convention-based routing 79Attribute-based routing 80Three choices to route them all 80
Adding more routes 80The dummy data provider 84
Dealing with single items 84Suggested topics 91Summary 91
Chapter 3: Angular 2 Components and Client-Side Routing 92Master-detail binding 94
The Item class 94The ItemService class 95The ItemListComponent class 98
A quick implementation test 101The ItemDetailComponent class 105
Adding the @angular/forms library 107Updating the root module 108Connecting the dots 109
Testing it up 111Adding additional lists 112
-
[ iii ]
Multiple component instances 113Two-way data binding 117
Disabling two-way data binding 118Client-side routing 119
Adding the @angular/router library 119PathLocationStrategy versus HashLocationStrategy 121
Refactoring our app 122Adding the AppRouting scheme 123Adding the HomeComponent 125Adding new components 127
AboutComponent 127LoginComponent 128PageNotFoundComponent 128
Updating the root module 129Revising the master-detail strategy 130
Adding the ItemDetail route 131Changing the ItemListComponent 131Updating the ItemDetailComponent 133
Full routing test 136Handling rewrites in ASP.NET Core 139
Showing the issue 140Understanding the causes 140Implementing the fix 141Validating the outcome 143
Suggested topics 143Summary 143
Chapter 4: The Data Model 145Getting ready 145
Installing the EntityFramework Core 146Data modeling approaches 149
The model-first approach 149Pros 150Cons 151
The database-first approach 151Pros 152Cons 152
The code-first approach 152Pros 153Cons 153
Making a choice 153Creating entities 154
Items 154Comments 157Users 160
-
[ iv ]
Defining relationships 161Setting up DbContext 164
Database initialization strategies 166Choosing the database engine 167
Updating appsettings.json 168Creating the database 169
Updating Startup.cs 169Configuring the EF tools 169Adding the initial migration 170
Understanding migrations 171Implementing a data seed strategy 172
Creating a DbSeeder class 173Private members 179Constructor 179Public methods 179Seed methods 180Utility methods 180
Adding the DbSeeder to Startup.cs 181Handling exceptions 182
Seeding the database 183Updating the ItemsController 184
Installing TinyMapper 185Implementing the mapping 186
Testing the data provider 191Suggested topics 192Summary 193
Chapter 5: Persisting Changes 194Add, update, and delete items 194
Updating the Web API 195Adapting the client 198
Improving the ItemService 198Updating the GUI 201
Add new 201Update and Delete 204Testing it out 206Adding a new test 209Update test 211Delete test 213
Splitting the ItemDetail component 214Adding the ItemDetailView component 216Refactoring ItemDetail into ItemDetailEdit 218Updating the Root module 219
-
[ v ]
Updating the Routes 219Tracking the outdated references 221Implementing the tab menu 222
Template 223Class code 224Styles 225
Testing it out 228Suggested topics 231Summary 232
Chapter 6: Applying Styles 233How bad is it, doc? 233Introducing LESS 234
Style sheet languages 234CSS 235
CSS code sample 235What is LESS and why to use it 236
Import directives 238Nested selectors 239Mixins 240Extend pseudo-class 241
LESS docs and support 242Systematically Awesome Style Sheets, Stylus, and other alternatives 242
Configuring LESS 243Adding the LESS file 243Updating Gulp script 244Linking the stylesheet 247Testing it up 248
DIY versus framework-based styling 249Do it yourself approach 249
Pros 249Cons 250
Framework-based approach 250Pros 250Cons 251
Conclusions 251Adding Bootstrap 252
Choosing a native directives module 253Installing ng2-bootstrap 254
Applying styles 256Main navigation bar 256
Detecting the active route 259
-
[ vi ]
Welcome View 262Item Detail View 269
Display mode 269Edit mode 272
Conclusions 281Suggested topics 281Summary 282
Chapter 7: Authentication and Authorization 283Do we really need these? 284Authentication 284
Third-party authentication 285Authorization 285
Third-party authorization 286Proprietary or third-party? 287Choosing an authentication mode 288Installing AspNetCore.Identity 288
Adding the package 289Updating the project classes 290
ApplicationDbContext.cs 290ApplicationUser.cs 291Startup.cs 292DbSeeder.cs 293
Updating the database 296Authentication methods 298
Sessions 298Tokens 300Signatures 302Two-factor 302Conclusions 302
Implementing JSON web token authentication 303JWT provider 304
Private members 305Static members 305Constructor 306Public methods 307Private methods 307Extension methods 309Full source code 310
Adding the middleware to the pipeline 313Angular 2 login form 315
Adding styles 318
-
[ vii ]
Updating the root module file 319UI and validation test 321
AuthService component 324Updating the AppModule 326Updating the LoginComponent 327Login test 329
AuthHttp wrapper 331Adding authorization rules 333
Adapting the client 333Testing the client 336
Protecting the server 338Retrieving the user ID 339Authorization test 340
Suggested topics 342Summary 342
Chapter 8: Third-Party Authentication and External Providers 343Introducing OpenID connect servers 344Installing OpenIddict 344
Adding MyGet to the package sources 345Installing the OpenIddict package 347Updating ApplicationUser and ApplicationDbContext 348Adding a new migration 348Updating the DbSeeder 349
Moving literal values to appsettings.json 350Configuring the Startup class 352Updating the Web.Config rewrite rules 357Seeding the database 358
External authentication providers 358OAuth2 authorization flow 359Facebook 359
Creating a Facebook App 360Storing the keys in App settings 362Adding the Facebook middleware 363Adding the AccountsController 365
BaseController 366AccountsController 368Namespaces 369Class declaration 369Constructor 369ExternalLogin 370ExternalLoginCallBack 371Logout 374
Updating the ItemsController 374
-
[ viii ]
Configuring the client 376Updating the LoginComponent 376Updating the AuthService 378Updating the AppComponent 379Understanding zones 381
Testing it out 382Google 384Twitter 388
Elevated permissions request 390Troubleshooting 391
Conclusions 392Suggested topics 393Summary 393
Chapter 9: User Registration and Account Edit 394User Registration 394
UserViewModel 395AccountsController 395
Get 396Add 397
E-mail confirmation 398Update 399Delete 401
User class 402AuthService 402UserEditComponent 403Connecting the dots 409
Updating the root module 409Implementing the route 409Adding the Register link 410Defining the styles 411Updating the menu 412
Testing it out 413Edit Account 416
Two routes, one component 416Adapting the UserEditComponent 417Updating the navigation menu 421
Adding styles 422Final test 423
Conclusions 425Suggested topics 426Summary 426
Chapter 10: Finalization and Deployment 427
-
[ ix ]
Switching to SQL Server 427Installing SQL Server 2016 Express 428Installing SQL Server Management Studio 429
Configuring the database 429Changing the authentication mode 431Adding the OpenGameList database 431Adding the OpenGameList login 431Mapping the login to the database 432Adding a SQL Server connection string 433Creating an application settings file for production 434
Updating AppSettings 435Updating external providers 436Configuring the publishOptions 436Checking the Startup class 437Updating the launchSettings.json 437
Publishing our native web application 438Creating a Publish profile 439
File System Publish profile 440FTP Publish profile 440
Configuring IIS 442Installing the ASP.NET Core module for IIS 442Adding the website 443Configuring the Application Pool 445
Firing up the engine 446Troubleshooting 448
The Kestrel test 449Suggested topics 450Summary 451
Index 452
-
PrefaceIt is common knowledge among many seasoned web developers that building a websitefrom scratch 15 years ago was a rather simple task. To begin with, we didnt have to dealwith the insane amount of screen resolutions brought by big-size monitors, ultra-highresolutions, and mobile devices; we could avoid the urge of learning a lot of (back then)"experimental" stuff such as AJAX, JSON, and XMLHttpRequest, as the establishedDHTML-based techniques we already knew were more than enough to get the job done;our simple, quick 'n' dirty JavaScript hacks could easily shine among friends and colleagueswithout being embarrassed by cross-platform JS libraries such as jQuery (2006); we didnthave to implement time-consuming and/or knowledge-demanding features such as loginwith Facebook, Sharing buttons, SEO meta tags, Twitter Cards and RSS feeds because theywere either not there yet or not so important. On top of all that, there still werent that manyfully-featured, great-looking, award-winning CMS solutions such as Drupal (2001),Wordpress (2003), and Joomla (2005) to compare our results with.
Sounds pretty reasonable, right? Except its not. The Web is always changing, just like therest of the world: the complexity level of the average website is constantly increasingbecause the usage is more diversified, widespread and intense, however, such growingexcitement was also a great thing for those who wanted to make a living out on buildingweb applications, assuming they had the guts to keep studying, communicating, and livingthe blowing storm of new technologies behind these winds of change. As seasoneddevelopers, we should be able to cope with such simple, yet inevitable truth, adaptingourselves before and better than our customers instead of being trampled by theirincreasing demands.
The main purpose of this book is to demonstrate that is still possible to develop great webapplications from scratch, providing that we use the proper tools and have the patience tounderstand how we can blend them together to achieve what we want. Luckily enough, theinsane amount of additional work required nowadays can be mitigated by a lot of powerfulframeworks that make their way through the development scene: were talking of server-side runtime environments like ASP.NET and Node.js and also of many client-sideframeworks such as Bootstrap, jQuery, React, AngularJS and Angular 2. We chose to focuson two of them ASP.NET Core to cover the server-side aspects, Angular 2 to deal with theclient-side not only for their stunning set of features and elegant design, but also becausethey happen to have something revolutionary in common: they are both a complete rewriteof their massively-popular previous installments, who played a leading role in theirrespective field.
-
Preface
[ 2 ]
Why a development team should do that? Whats the purpose of reinvent their own widely-acknowledged wheel despite it still rocks? The answer most likely lies in what we saidearlier: in an ever-changing world such as the one were living in we need to be humble andwise enough to keep moving forward, embracing sometimes even enforcing the iterativeprocesses required to forge better tools for building a more complex, yet also more enticingWorld Wide Web.
The guys behind ASP.NET and Angular were brave enough to accept the challenge: after afew months of unstable releases and breaking interface changes it definitely seems that theirchoice was worth the effort, as theyre about to hit a decisive score.
What about you?
What this book coversChapter 1, Getting Ready, introduces the ASP.NET Core and Angular 2 frameworks,explaining how they can effectively be used to build a feature-rich, modern SPA. It thenenumerates the core aspects of a common SPA project, which will be addressed throughoutthe following chapters. The last part covers the required steps for setting up a .NET CoreWeb Application project, together with its required packages and components, up to abuildable and running app skeleton.
Chapter 2, ASP.NET Controllers and Server-Side Routes, explains how we can interchangeJson data between a server-side .NET Controller and a client-side Angular 2 Component.The reader will learn how to handle the HTTP request-response cycle and also how toconfigure the improved routing logic built upon the .NET Core pipeline.
Chapter 3, Angular 2 Components and Client-Side Routing, focuses about the client-sideaspects of our SPA: the reader will learn how to fetch JSON objects with Angular 2 coreclasses and show the retrieved data on screen using the Angular 2 Template Syntax. We willalso explain how the client-side routing works in a SPA and what we need do to implementa viable routing pattern for our project using the PathLocationStrategy.
Chapter 4, The Data Model, is dedicated to the building of a proper, DBMS-based DataModel using Entity Framework Core. The reader will learn how to install and properlyconfigure the required EF Core packages: we will also explain how to properly implementthem to build a list of Entities and persist them into a stable Database structure using theCode-First approach.
-
Preface
[ 3 ]
Chapter 5, Persisting Changes, will explain how to update the application code to make fullusage of the EF Core entities defined in Chapter 4, The Data Model. The reader will learnhow to fetch and persist the application data by using the Database instead of the samplemocking methods.
Chapter 6, Applying Styles, will introduce LESS, a powerful dynamic stylesheet languagethat can be compiled into CSS. After a brief overview of the LESS language syntax, thereader will learn how to add, implement and compile LESS scripts within the applicationproject to greatly improve the front-end UI.
Chapter 7, Authentication and Authorization, will guide the reader through the most relevantauth-related concepts for building a web application. The reader will learn how toimplement a sample Token-based authentication provider and also how to properly addand configure it throughout the existing Entity Framework entities, .NET core services andHTTP middleware list.
Chapter 8, Third-Party Authentication and External Providers, further expands theauthentication and authorization topics introducing OpenIddict, an open-source .NETlibrary based upon the AspNet OpenID Connect Server (ASOS) that can be used to handleinternal and external auth providers. The reader will learn how to install OpenIddict andconfigure it to support Facebook, Google and Twitter authentication.
Chapter 9, User Registration and Account Edit, is dedicated to account-related features suchas user registration and edit account mechanism. The reader will learn how to properlyhandle such requests by implementing a dedicated .NET Core Controller together with aversatile Angular 2 Model-Driven form.
Chapter 10, Finalization and Deployment, describes the most common tasks to publish apotentially shippable web application onto a production server. The reader will learn howto replace its localDb instance with an external SQL Server, create FTP and FileSystempublishing profiles, upload their compiled application to an external server and configure itto run under IIS using the .NET Core Windows Server Hosting bundle; he will also learnhow to deal with the most common issues with the help of some .NET Core specifictroubleshooting techniques.
-
Preface
[ 4 ]
What you need for this bookWindows 7 SP1 or newer, up to and including Windows 10.Visual Studio 2015 with Update 3 (or newer): any version will work, includingthe freely available Community Edition.Microsoft SQL Server 2014 (o newer) for Chapter 10, Finalization and Deploymentonly: any version will work, including the freely available Express Edition.Windows Server 2008 R2 (or newer) for Chapter 10, Finalization and Deploymentonly.All ASP.NET, Angular 2, JavaScript and CSS packages used throughout the bookare open-source and freely available for download using Visual Studio packagemanagers such as NuGet, MyGet, NPM and Bower.
Who this book is forThis book is for seasoned ASP.NET developers who already know about ASP.NET Coreand Angular 2, but want to blend them together to craft a production-ready SPA.
ConventionsIn this book, you will find a number of text styles that distinguish between different kindsof information. Here are some examples of these styles and an explanation of their meaning.
Code words in text, database table names, folder names, filenames, file extensions,pathnames, dummy URLs, user input, and Twitter handles are shown as follows: "We caninclude other contexts through the use of the include directive."
A block of code is set as follows:
-
Preface
[ 5 ]
When we wish to draw your attention to a particular part of a code block, the relevant linesor items are set in bold:
org.springframework spring-webmvc 4.2.2.RELEASE
Any command-line input or output is written as follows:
Java(TM) SE Runtime Environment (build 1.8.0_91-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
New terms and important words are shown in bold. Words that you see on the screen, forexample, in menus or dialog boxes, appear in the text like this: "Click on the Java Platform(JDK) 8u91/8u92 download link"
Warnings or important notes appear in a box like this.
Tips and tricks appear like this.
Reader feedbackFeedback from our readers is always welcome. Let us know what you think about thisbookwhat you liked or disliked. Reader feedback is important for us as it helps usdevelop titles that you will really get the most out of.
To send us general feedback, simply e-mail [email protected], and mention thebook's title in the subject of your message.
If there is a topic that you have expertise in and you are interested in either writing orcontributing to a book, see our author guide at www.packtpub.com/authors.
mailto:[email protected]://www.packtpub.com/books/info/packt/authors
-
Preface
[ 6 ]
Customer supportNow that you are the proud owner of a Packt book, we have a number of things to help youto get the most from your purchase.
Downloading the example codeYou can download the example code files for this book from your account at h t t p : / / w w w . pa c k t p u b . c o m. If you purchased this book elsewhere, you can visit h t t p : / / w w w . p a c k t p u b . co m / s u p p o r t and register to have the files e-mailed directly to you.
You can download the code files by following these steps:
Log in or register to our website using your e-mail address and password.1.Hover the mouse pointer on the SUPPORT tab at the top.2.Click on Code Downloads & Errata.3.Enter the name of the book in the Search box.4.Select the book for which you're looking to download the code files.5.Choose from the drop-down menu where you purchased this book from.6.Click on Code Download.7.
You can also download the code files by clicking on the Code Files button on the book'swebpage at the Packt Publishing website. This page can be accessed by entering the book'sname in the Search box. Please note that you need to be logged in to your Packt account.
Once the file is downloaded, please make sure that you unzip or extract the folder using thelatest version of:
WinRAR / 7-Zip for WindowsZipeg / iZip / UnRarX for Mac7-Zip / PeaZip for Linux
The code bundle for the book is also hosted on GitHub at h t t p s : / / g i t h u b . c o m / P a c k t P u b li s h i n g / A S P d o t N E T - C o r e - a n d - A n g u l a r - 2. We also have other code bundles from our richcatalog of books and videos available at h t t p s : / / g i t h u b . c o m / P a c k t P u b l i s h i n g /. Checkthem out!
http://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.comhttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttp://www.packtpub.com/supporthttps://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/ASPdotNET-Core-and-Angular-2https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/https://github.com/PacktPublishing/
-
Preface
[ 7 ]
Downloading the color images of this book We also provide you with a PDF file that has color images of the screenshots/diagrams usedin this book. The color images will help you better understand the changes in the output.You can download this file fromhttps://www.packtpub.com/sites/default/files/downloads/ASPdotNETCoreAndAngular2
_ColorImages.pdf.
ErrataAlthough we have taken every care to ensure the accuracy of our content, mistakes dohappen. If you find a mistake in one of our booksmaybe a mistake in the text or thecodewe would be grateful if you could report this to us. By doing so, you can save otherreaders from frustration and help us improve subsequent versions of this book. If you findany errata, please report them by visiting h t t p : / / w w w . p a c k t p u b . c o m / s u b m i t - e r r a t a,selecting your book, clicking on the Errata Submission Form link, and entering the detailsof your errata. Once your errata are verified, your submission will be accepted and theerrata will be uploaded to our website or added to any list of existing errata under theErrata section of that title.
To view the previously submitted errata, go to h t t p s : / / w w w . p a c k t p u b . c o m / b o o k s / c o n t e nt / s u p p o r t and enter the name of the book in the search field. The required information willappear under the Errata section.
PiracyPiracy of copyrighted material on the Internet is an ongoing problem across all media. AtPackt, we take the protection of our copyright and licenses very seriously. If you comeacross any illegal copies of our works in any form on the Internet, please provide us withthe location address or website name immediately so that we can pursue a remedy.
Please contact us at [email protected] with a link to the suspected pirated material.
We appreciate your help in protecting our authors and our ability to bring you valuablecontent.
QuestionsIf you have a problem with any aspect of this book, you can contact usat [email protected], and we will do our best to address the problem.
https://www.packtpub.com/sites/default/files/downloads/ASPdotNETCoreAndAngular2_ColorImages.pdfhttps://www.packtpub.com/sites/default/files/downloads/ASPdotNETCoreAndAngular2_ColorImages.pdfhttps://www.packtpub.com/sites/default/files/downloads/ASPdotNETCoreAndAngular2_ColorImages.pdfhttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttp://www.packtpub.com/submit-erratahttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supporthttps://www.packtpub.com/books/content/supportmailto:[email protected]:[email protected]
-
1Getting Ready
ASP.NET Core MVC is a web framework, built on top of the core .NET framework,specifically made for building efficient web applications and APIs that will be able to bereached by a massive range of clients including web browsers, mobile devices, smart TVs,web-based home automation tools, and more.
Angular 2 is the second major installment of AngularJS, a world-renowned developmentframework born with the idea of giving the coder the toolbox needed to build reactive,cross-platform web-based apps, which are optimized for desktop and mobile: it features astructure-rich templating approach which is based upon a natural, easy-to-write, andreadable syntax.
These two frameworks were put together with the same assumption in mind: the HTTPprotocol is not limited to serving web pages, it can be also used as a viable platform to buildweb-based APIs to effectively send and receive data. This theory has slowly made its waythrough the first 20 years of the World Wide Web and is now an undeniable, widelyacknowledged statement, and also a fundamental pillar of almost every modern webdevelopment approach.
As for the reasons behind this perspective switch, there are plenty of good reasons for it, themost important of them being related to the intrinsic characteristics of the HTTP protocol. Itis simple to use, flexible enough to match most development needs in the always-changingenvironment which the World Wide Web happens to be, not to mention how universal ithas become nowadays, almost any platform that you can think of has an HTTP library, soHTTP services can reach a broad range of clients, including browsers, mobile devices, andtraditional desktop applications.
-
Getting Ready
[ 9 ]
Two players one goalFrom the perspective of a fully-functional web-based application, we could say that theWeb API interface provided with the ASP.NET Core framework is a programmatic set ofserver-side handlers used by the server to expose a number of hooks and/or endpoints to adefined request-response message system, typically expressed in structured markuplanguages such as JSON or XML. This exposition is provided using the HTTP protocolthanks to a publicly available web server (typically IIS). Similarly, Angular can be describedas a modern, feature-rich client-side library that gives the browser the ability to bind inputand/or output parts of an HTML web page to a flexible, reusable, and easily testableJavaScript model.
These assumptions allow us to answer a simple, yet inevitable question: can we puttogether the server-side strengths of ASP.NET Core's Web API capabilities with thefrontend capabilities of the Angular library in order to build a modern, feature-rich, andproduction-ready web application?
The answer, in short, is yes. In the following chapters, we'll see how we can do that byanalyzing all the fundamental aspects of a well-written, properly designed web-basedproduct and how ASP.NET Core and/or Angular can be used to handle each one of them.
What's new in Angular 2?The new major version of Angular is a complete rewrite of the previous one, entirely basedupon TypeScript and ECMAScript 6 specifications. The choice of not making it backwardcompatible with the previous installment clearly demonstrates the intention of the authorsto adopt a completely new approach, any developer who already knows AngularJS willundoubtedly face a huge number of breaking changes, not only in the code syntax but alsoin the way of thinking and designing your client app. Angular 2 is highly modular, entirelycomponent-based, features a new and improved dependency injection model and has themain goal of being able to easily integrate with other server-side and client-sideframeworks.
However, the most important reason why we're picking Angular 2 over other excellent JSlibraries such as ReactJS and EmberJS is the fact that it arrives with a huge stack offeatures out of the box, making it way simpler to use than the aforementioned competitors.If we combine that with the consistency given by TypeScript language we could very wellsay that, despite being the youngster, Angular 2 has embraced the framework approachmore convincingly than the others. That's a great reason to invest in it, hoping it will keepup with these compelling promises.
-
Getting Ready
[ 10 ]
The ASP.NET Core revolutionSummarizing what has happened in the ASP.NET world within the last year is not an easytask, in short, we could say that we're undoubtedly facing the most important series ofchanges in the .NET Framework since the year it came to life. ASP.NET Core is a completere-implementation of ASP.NET, which unites all the previous web application technologiessuch as MVC, Web API and Web Pages into a single programming module, formerly known as MVC6. The new framework introduces a fully featured cross-platformcomponent, also known as .NET Core, shipped with a brand new open source .NETCompiler Platform (currently known as Roslyn), a cross-platform runtime (known asCoreCLR), and an improved x64 Just-In-Time compiler (RyuJIT).
You might be wondering what happened to ASP.NET 5 and Web API 2, asthese used to be quite popular names until mid-2016.ASP.NET 5 was the original name of ASP.NET Core, before the developerschose to rename it to emphasize the fact that it is a complete rewrite. Thereasons for that, together with the Microsoft vision about the new product,are further explained in the following blog post from Scott Hanselman thatanticipated the changes on January 16, 2016:h t t p : / / w w w . h a n s e l m a n . c o m / b l o g / A S P N E T 5 I s D e a d I n t r o d u c i n g A S P N E T C or e 1 A n d N E T C o r e 1 . a s p x
For those who don't know, Scott Hanselman has been the outreach andcommunity manager for .NET/ASP.NET/IIS/Azure and Visual Studiosince 2007.Additional information regarding the perspective switch is also availablein the following article by the senior Microsoft developer (and NuGetProgram Manager) Jeffrey T. Fritz:h t t p s : / / b l o g s . m s d n . m i c r o s o f t . c o m / w e b d e v / 2 1 6 / 2 / 1 / a n - u p d a t e - o n - as p - n e t - c o r e - a n d - n e t - c o r e /
As for Web API 2, it was a dedicated framework for building HTTPservices returning pure JSON or XML data instead of web pages. Initiallyborn as an alternative to the MVC platform, it has been merged with thelatter into the new, general-purpose web application framework known asMVC6, which is now shipped as a separate module of ASP.NET Core.
http://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttp://www.hanselman.com/blog/ASPNET5IsDeadIntroducingASPNETCore10AndNETCore10.aspxhttps://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-core-and-net-core/https://blogs.msdn.microsoft.com/webdev/2016/02/01/an-update-on-asp-net-co