ASP.NET'den ASP.NET Core
Isaac Levin tarafından
Bu makale, uygulamalarınızı ASP.NET'ye ASP.NET Core. Kapsamlı bir bağlantı noktası kılavuzu için ASP.NET uygulamalarınızı .NET Core'a ASP.NET e-kitabına bakın.
Önkoşullar
.NET Core SDK 2.2 veya sonraki bir
Hedef çerçeveler
ASP.NET Core projeleri geliştiricilere .NET Core, .NET Framework veya her ikisini birden hedefleme esnekliği sunar. Hangi hedef çerçevenin en uygun olduğunu belirlemek .NET Framework için bkz. .NET Core ile sunucu uygulamaları arasında seçim.
Projeleri hedef .NET Framework, projelerin tek tek paketlere NuGet gerekir.
.NET Core'u hedeflemek, meta veri paketinin özelliği sayesinde çok sayıda açık paket ASP.NET Core ortadan kaldırmaya olanak sağlar. Meta Microsoft.AspNetCore.App paketi projenize yükleyin:
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
Meta paket kullanılırken, meta pakette başvurulan hiçbir paket uygulamayla birlikte dağıtılacaktır. .NET Core Çalışma Zamanı Deposu bu varlıkları içerir ve performansı geliştirmek için önceden hazırlar. Daha Microsoft.AspNetCore.App için bkz. ASP.NET Core meta paketi.
Project yapısı farklılıkları
.csproj dosya biçimi, dosya biçimi ASP.NET Core. Bazı önemli değişiklikler şunlardır:
Dosyaların projenin bir parçası olarak kabul edilmesi için dosyaların açıkça eklenmesi gerekmez. Bu, büyük takımlarda çalışırken XML birleştirme çakışmaları riskini azaltır.
Diğer projelere YÖNELIK GUID tabanlı başvurular yoktur ve bu da dosya okunabilirliğini artırır.
Dosya, dosyanın yüklemesi kaldırılamadan Visual Studio:

Global.asax dosya değiştirme
ASP.NET Core önyüklemesi için yeni bir mekanizmayı başlattık. ASP.NET uygulamaları için giriş noktası Global.asax dosyasıdır. Yol yapılandırması, filtre ve alan kayıtları gibi görevler Global.asax dosyasında işler.
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Bu yaklaşım, uygulamayı ve uygulamaya müdahale eden bir şekilde dağıtılacağı sunucuyu doğrular. OWIN, birden çok çerçeveyi birlikte kullanmak için daha temiz bir yol sağlamak üzere bir araya geldi. OWIN, yalnızca gerekli modülleri eklemek için bir işlem hattı sağlar. Barındırma ortamı, hizmetleri ve uygulamanın istek işlem hattını yapılandırmak için bir Başlangıç işlevi alır. Startup uygulamaya bir ara yazılım kümesi kaydeden. Uygulama, her istek için mevcut bir işleyici kümesine bağlı bir listenin baş işaretçisi ile ara yazılım bileşenlerinin her birsini arar. Her ara yazılım bileşeni, istek işleme işlem hattına bir veya daha fazla işleyici ekleyebilir. Bu, listenin yeni başındaki işleyiciye bir başvuru döndürerek başarılı olur. Her işleyici, listede bir sonraki işleyiciyi hatırlamak ve bu işleyiciyi faturalamakla sorumludur. Bu ASP.NET Core, bir uygulamaya giriş noktası olur ve Startup artık Global.asax bağımlılığına sahip olmaz. OWIN'i .NET Framework işlem hattı olarak aşağıdakine benzer bir şey kullanın:
using Owin;
using System.Web.Http;
namespace WebApi
{
// Note: By default all requests go through this OWIN pipeline. Alternatively you can turn this off by adding an appSetting owin:AutomaticAppStartup with value “false”.
// With this turned off you can still have OWIN apps listening on specific routes by adding routes in global.asax file using MapOwinPath or MapOwinRoute extensions on RouteTable.Routes
public class Startup
{
// Invoked once at startup to configure your application.
public void Configuration(IAppBuilder builder)
{
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute("Default", "{controller}/{customerID}", new { controller = "Customer", customerID = RouteParameter.Optional });
config.Formatters.XmlFormatter.UseXmlSerializer = true;
config.Formatters.Remove(config.Formatters.JsonFormatter);
// config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
builder.UseWebApi(config);
}
}
}
Bu, varsayılan yollarınızı yapılandırarak varsayılan olarak Json üzerinden XmlSerialization'ı kullanır. Gerektiğinde bu işlem hattına başka bir Ara Yazılım ekleyin (yükleme hizmetleri, yapılandırma ayarları, statik dosyalar vb.).
ASP.NET Core benzer bir yaklaşım kullanır, ancak girişi işlemek için OWIN'e güvenmez. Bunun yerine, Program.cs yöntemi Main (konsol uygulamalarına benzer) aracılığıyla yapılır Startup ve bu yöntem aracılığıyla yüklenir.
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace WebApplication2
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
Startup bir yöntem Configure içermesi gerekir. içinde, Configure işlem hattına gerekli ara yazılımı ekleyin. Aşağıdaki örnekte (varsayılan web sitesi şablonundan), uzantı yöntemleri işlem hattını şu destekle yapılandırıyor:
- Hata sayfaları
- HTTP Katı Aktarım Güvenliği
- HTTPS'ye HTTP yeniden yönlendirmesi
- ASP.NET Core MVC
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseMvc();
}
Konak ve uygulama, gelecekte farklı bir platforma taşıma esnekliği sağlayan şekilde ayrı ayrıdır.
Not
Başlangıç ve Ara Yazılım için daha ayrıntılı ASP.NET Core için bkz. Başlangıç ASP.NET Core
Yapılandırmaları depolama
ASP.NET depolamayı destekler. Bu ayar, örneğin, uygulamaların dağıtılacağı ortamı desteklemek için kullanılır. Yaygın olarak kullanılan bir uygulama, tüm özel anahtar-değer çiftlerini <appSettings> dosyanınWeb.config etmektir:
<appSettings>
<add key="UserName" value="User" />
<add key="Password" value="Password" />
</appSettings>
Uygulamalar, ad alanı içinde koleksiyonunu ConfigurationManager.AppSettings kullanarak şu ayarları System.Configuration okur:
string userName = System.Web.Configuration.ConfigurationManager.AppSettings["UserName"];
string password = System.Web.Configuration.ConfigurationManager.AppSettings["Password"];
ASP.NET Core uygulamanın yapılandırma verilerini herhangi bir dosyada depolar ve ara yazılım önyüklemesi kapsamında bunları yüklerini. Proje şablonlarında kullanılan varsayılan appsettings.json dosya:
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"AppConfiguration": {
"UserName": "UserName",
"Password": "Password"
}
}
Bu dosyayı uygulamanın içindeki bir IConfiguration örneğine yükleme işlemi Startup.cs dosyasında yapılır:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
Uygulama, ayarları almak Configuration için sayfasından okur:
string userName = Configuration.GetSection("AppConfiguration")["UserName"];
string password = Configuration.GetSection("AppConfiguration")["Password"];
Bu yaklaşıma, bu değerlerle bir hizmet yüklemek için Bağımlılık Ekleme (DI) kullanma gibi süreci daha sağlam hale etmek için uzantılar vardır. DI yaklaşımı, kesin türü kesin olarak ayarlanmış bir yapılandırma nesnesi kümesi sağlar.
// Assume AppConfiguration is a class representing a strongly-typed version of AppConfiguration section
services.Configure<AppConfiguration>(Configuration.GetSection("AppConfiguration"));
Not
Yapılandırma yapılandırmaya daha ayrıntılı bir ASP.NET Core için bkz. ASP.NET Core.
Yerel bağımlılık ekleme
Büyük ve ölçeklenebilir uygulamalar geliştirmenin önemli hedeflerinden biri, bileşenlerin ve hizmetlerin gevşek bir şekilde bağlantısıdır. Bağımlılık Ekleme, bunu başarma konusunda popüler bir tekniktir ve yerel bir ASP.NET Core.
Bu ASP.NET, geliştiriciler Bağımlılık Ekleme uygulamak için bir üçüncü taraf kitaplığını bağımlıdır. Bu tür kitaplıklardan biri, MicrosoftPatterns & Uygulamaları'dır.
Unity ile Bağımlılık Ekleme ayarlama örneği, bir IDependencyResolver sarmalama UnityContainer uygulamaktır:
using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Web.Http.Dependencies;
public class UnityResolver : IDependencyResolver
{
protected IUnityContainer container;
public UnityResolver(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
public object GetService(Type serviceType)
{
try
{
return container.Resolve(serviceType);
}
catch (ResolutionFailedException)
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return container.ResolveAll(serviceType);
}
catch (ResolutionFailedException)
{
return new List<object>();
}
}
public IDependencyScope BeginScope()
{
var child = container.CreateChildContainer();
return new UnityResolver(child);
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
container.Dispose();
}
}
hizmetinizin bir örneğini oluşturun, hizmetinizi kaydedin ve bağımlılık çözümleyicisini kapsayıcınız UnityContainer HttpConfiguration için yeni UnityResolver örneğine ayarlayın:
public static void Register(HttpConfiguration config)
{
var container = new UnityContainer();
container.RegisterType<IProductRepository, ProductRepository>(new HierarchicalLifetimeManager());
config.DependencyResolver = new UnityResolver(container);
// Other Web API configuration not shown.
}
Gerektiğinde IProductRepository ekleme:
public class ProductsController : ApiController
{
private IProductRepository _repository;
public ProductsController(IProductRepository repository)
{
_repository = repository;
}
// Other controller methods not shown.
}
Bağımlılık Ekleme, ASP.NET Core bir parçası olduğundan, hizmetinizi ConfigureServices Startup.cs yöntemine ebilirsiniz:
public void ConfigureServices(IServiceCollection services)
{
// Add application services.
services.AddTransient<IProductRepository, ProductRepository>();
}
Depo, Unity'de olduğu gibi herhangi bir yere ekleme gerçek olabilir.
Not
Bağımlılık ekleme hakkında daha fazla bilgi için bkz. Bağımlılık ekleme.
Statik dosyaları hizmet etme
Web geliştirmenin önemli bir parçası, statik, istemci tarafı varlıklara hizmet etme özelliğidir. Statik dosyaların en yaygın örnekleri HTML, CSS, Javascript ve görüntülerdir. Bu dosyaların, uygulamanın yayımlanmış konuma (veya CDN) kaydederek bir istek tarafından yüklenemediklerine başvurulları gerekir. Bu işlem, ASP.NET Core.
Bu ASP.NET, statik dosyalar çeşitli dizinlerde depolanır ve görünümlerde başvurur.
Bu ASP.NET Core, aksi yapılandırılmadıkça statik dosyalar "web kökü" (< içerik kökü > /wwwroot) içinde depolanır. Dosyalar, 'den uzantı yöntemiyle istek işlem UseStaticFiles hattına Startup.Configure yüklenir:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
}
Not
Hedef .NET Framework, NuGet Microsoft.AspNetCore.StaticFiles yükleyin.
Örneğin, wwwroot/images klasöründeki bir görüntü var ya da gibi bir konumda tarayıcı tarafından http://<app>/images/<imageFileName> erişilebilir.
Not
Dosyalarda statik dosyalar sunan daha ayrıntılı bir başvuru ASP.NET Core bkz. Statik dosyalar.
Çoklu değer cookie s
Birden çok cookie değer, tek bir ASP.NET Core. Değer başına cookie bir tane oluşturun.
Kimlik cookie doğrulamaları verilerde sıkıştır ASP.NET Core
Güvenlik nedenleriyle, kimlik doğrulama cookie s ASP.NET Core ' de sıkıştırılmaz. Geliştiriciler kimlik doğrulaması kullanırken cookie , yalnızca ihtiyaçları için gerekli olan talep bilgilerinin sayısını en aza indirmelidir.
Kısmi uygulama geçişi
Kısmi uygulama geçişi yaklaşımlarından biri bir IIS alt uygulaması oluşturmak ve uygulamanın URL yapısını korurken yalnızca ASP.NET 4.x'den ASP.NET Core'ye taşımaktır. Örneğin,applicationHost.configdosyasından uygulamanın URL yapısını göz önündeapplicationHost.configdüşünün:
<sites>
<site name="Default Web Site" id="1" serverAutoStart="true">
<application path="/">
<virtualDirectory path="/" physicalPath="D:\sites\MainSite\" />
</application>
<application path="/api" applicationPool="DefaultAppPool">
<virtualDirectory path="/" physicalPath="D:\sites\netcoreapi" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
<binding protocol="https" bindingInformation="*:443:" sslFlags="0" />
</bindings>
</site>
...
</sites>
Dizin yapısı:
.
├── MainSite
│ ├── ...
│ └── Web.config
└── NetCoreApi
├── ...
└── web.config
[BIND] ve Giriş Biçimlendirenler
Önceki sürümler ASP.NET [Bind] saldırılara karşı koruma için özniteliğini kullandı. Giriş biçimlendirenler verilerde farklı ASP.NET Core. özniteliği artık JSON veya XML ayrıştırmak için giriş biçimlendirenlerle birlikte kullanılırken aşırı [Bind] postayı önlemek için tasarlanmamiştir. Bu öznitelikler, veri kaynağı içerik türüyle birlikte gönderilen form verileri olduğunda model x-www-form-urlencoded bağlamayı etkiler.
Denetleyicilere JSON bilgilerini veren ve verileri ayrıştırmak için JSON giriş Formatlayıcıları kullanan uygulamalar için, özniteliğini [Bind] özniteliği tarafından tanımlanan özelliklerle eşleşen bir görünüm modeliyle değiştirmeyi öneririz [Bind] .