IIS tümleşik işlem hattında OWIN Ara Yazılımı
Tarafından Praburaj Thiagarajan, Rick Anderson
Bu makalede, IIS tümleşik işlem hattında OWIN ara yazılım Bileşenlerinin (OMC) nasıl çalıştırlanacağı ve OMC'nin üzerinde çalıştığı işlem hattı olayının nasıl ayarlanacağı gösterilmektedir. Bu öğreticiyi okumadan önce Project Katana ve OWIN Başlangıç Sınıfı Algılamaya Genel Bakış'ı gözden geçirmelisiniz. Bu öğretici Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiagarajan ve Howard Dierking ( @howard_dierking ) tarafından yazılmıştır.
OWIN ara yazılım bileşenleri (OMC'ler) öncelikli olarak sunucudan bağımsız bir işlem hattında çalışacak şekilde tasarlanmış olsa da, IIS tümleşik işlem hattında da bir OMC çalıştırmak mümkündür (klasik mod desteklenmez). Paket Yöneticisi Konsolu'ndan (PMC) aşağıdaki paketi yükleyerek IIS tümleşik işlem hattında çalışacak bir OMC oluşturulabilir:
Install-Package Microsoft.Owin.Host.SystemWeb
Bu, IIS ve System.Web dışında çalıştırılamayanlar bile tüm uygulama çerçevelerinin mevcut OWIN ara yazılım bileşenlerinden yararlanabileceği anlamına gelir.
Not
Microsoft.Owin.Security.*
Visual Studio 2013'da yeni Kimlik Sistemi ile gönderilen tüm paketler (örneğin: Tanımlama bilgileri, Microsoft Hesabı, Google, Facebook, Twitter, Taşıyıcı Belirteç, OAuth, Yetkilendirme sunucusu, JWT, Azure Active Directory ve Active Directory federasyon hizmetleri) OMC olarak yazılır ve hem şirket içinde barındırılan hem de IIS tarafından barındırılan senaryolarda kullanılabilir.
OWIN Ara Yazılımı IIS Tümleşik İşlem Hattında Nasıl Yürütülür?
OWIN konsol uygulamaları için, başlangıç yapılandırması kullanılarak oluşturulan uygulama işlem hattı, bileşenlerin yöntemi kullanılarak eklenme sırasına IAppBuilder.Use
göre ayarlanır. Yani , Katana çalışma zamanındaki OWIN işlem hattı, OMC'leri kullanılarak IAppBuilder.Use
kaydedildikleri sırayla işler. IIS tümleşik işlem hattında istek işlem hattı BeginRequest, AuthenticateRequest, AuthorizeRequest gibi işlem hattı olaylarının önceden tanımlanmış bir kümesine abone olan HttpModule'lerden oluşur. Microsoft.Owin.Host.SystemWeb nuget paketinin öğesini kaydettiğinize OwinHttpModule
dikkat edin. Genellikle dosya HttpModule
aracılığıyla Web.config
IIS'ye kaydedilir, ancak Microsoft.Owin.Host.SystemWeb
ve HttpApplication.RegisterModule(Type)
adlı PreApplicationStartMethodAttribute
bir IIS özelliğini kullanarak iis işlem hattına OwinHttpModule
dinamik olarak kaydedilir.
OMC'yi ASP.NET dünyadaki bir HttpModule ile karşılaştırırsak, OMC'nin önceden tanımlanmış doğru işlem hattı olayına kaydedilmesi gerekir. Örneğin, işlem hattındaki AuthenticateRequest aşamasına bir istek geldiğinde HttpModule MyModule
çağrılır:
public class MyModule : IHttpModule
{
public void Dispose()
{
//clean-up code here.
}
public void Init(HttpApplication context)
{
// An example of how you can handle AuthenticateRequest events.
context.AuthenticateRequest += ctx_AuthRequest;
}
void ctx_AuthRequest(object sender, EventArgs e)
{
// Handle event.
}
}
Bir OMC'nin aynı olay tabanlı yürütme sıralamasına katılması için Katana çalışma zamanı kodu başlangıç yapılandırmasında tarar ve ara yazılım bileşenlerinin her birini tümleşik bir işlem hattı olayına abone eder. Örneğin, aşağıdaki OMC ve kayıt kodu ara yazılım bileşenlerinin varsayılan olay kaydını görmenizi sağlar. (OWIN başlangıç sınıfı oluşturma hakkında daha ayrıntılı yönergeler için bkz. OWIN Başlangıç Sınıfı Algılama.)
Boş bir web uygulaması projesi oluşturun ve owin2 olarak adlandırabilirsiniz.
Paket Yöneticisi Konsolu'ndan (PMC) aşağıdaki komutu çalıştırın:
Install-Package Microsoft.Owin.Host.SystemWeb
bir
OWIN Startup Class
ekleyin ve olarak adlandırlayınStartup
. Oluşturulan kodu aşağıdakilerle değiştirin (değişiklikler vurgulanır):using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; using System.Web; using System.IO; using Microsoft.Owin.Extensions; [assembly: OwinStartup(typeof(owin2.Startup))] namespace owin2 { public class Startup { public void Configuration(IAppBuilder app) { app.Use((context, next) => { PrintCurrentIntegratedPipelineStage(context, "Middleware 1"); return next.Invoke(); }); app.Use((context, next) => { PrintCurrentIntegratedPipelineStage(context, "2nd MW"); return next.Invoke(); }); app.Run(context => { PrintCurrentIntegratedPipelineStage(context, "3rd MW"); return context.Response.WriteAsync("Hello world"); }); } private void PrintCurrentIntegratedPipelineStage(IOwinContext context, string msg) { var currentIntegratedpipelineStage = HttpContext.Current.CurrentNotification; context.Get<TextWriter>("host.TraceOutput").WriteLine( "Current IIS event: " + currentIntegratedpipelineStage + " Msg: " + msg); } } }
Uygulamayı çalıştırmak için F5'e basın.
Başlangıç yapılandırması, ilk ikisi tanılama bilgilerini görüntüleyen ve son ikisi de olaylara yanıt veren (ve tanılama bilgilerini görüntüleyen) üç ara yazılım bileşeniyle bir işlem hattı ayarlar. yöntemi, PrintCurrentIntegratedPipelineStage
bu ara yazılımının çağrıldığı tümleşik işlem hattı olayını ve bir iletiyi görüntüler. Çıkış pencereleri aşağıdakileri görüntüler:
Current IIS event: PreExecuteRequestHandler Msg: Middleware 1
Current IIS event: PreExecuteRequestHandler Msg: 2nd MW
Current IIS event: PreExecuteRequestHandler Msg: 3rd MW
Katana çalışma zamanı, OWIN ara yazılım bileşenlerinin her birini varsayılan olarak PreExecuteRequestHandler ile eşledi ve bu da PreRequestHandlerExecute IIS işlem hattı olayına karşılık gelir.
Aşama İşaretçileri
Uzantı yöntemini kullanarak işlem hattının belirli aşamalarında yürütülecek OMC'leri IAppBuilder UseStageMarker()
işaretleyebilirsiniz. Belirli bir aşamada ara yazılım bileşenleri kümesini çalıştırmak için, kayıt sırasında ayarlanan son bileşenden hemen sonra bir aşama işaretçisi ekleyin. İşlem hattının hangi aşamasında ara yazılımı yürütebileceğiniz ve sipariş bileşenlerinin çalıştırılması gereken kurallar vardır (Kurallar öğreticinin ilerleyen bölümlerinde açıklanmıştır). UseStageMarker
Aşağıda gösterildiği gibi yöntemini koda Configuration
ekleyin:
public void Configuration(IAppBuilder app)
{
app.Use((context, next) =>
{
PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
return next.Invoke();
});
app.Use((context, next) =>
{
PrintCurrentIntegratedPipelineStage(context, "2nd MW");
return next.Invoke();
});
app.UseStageMarker(PipelineStage.Authenticate);
app.Run(context =>
{
PrintCurrentIntegratedPipelineStage(context, "3rd MW");
return context.Response.WriteAsync("Hello world");
});
app.UseStageMarker(PipelineStage.ResolveCache);
}
Çağrısı, app.UseStageMarker(PipelineStage.Authenticate)
önceden kaydedilmiş tüm ara yazılım bileşenlerini (bu örnekte iki tanılama bileşenimiz) işlem hattının kimlik doğrulama aşamasında çalışacak şekilde yapılandırmaktadır. Son ara yazılım bileşeni (tanılamaları görüntüler ve isteklere yanıt verir) aşamada çalışır ResolveCache
( ResolveRequestCache olayı).
Uygulamayı çalıştırmak için F5'e basın. Çıkış penceresinde aşağıdakiler gösterilir:
Current IIS event: AuthenticateRequest Msg: Middleware 1
Current IIS event: AuthenticateRequest Msg: 2nd MW
Current IIS event: ResolveRequestCache Msg: 3rd MW
Aşama İşaretçi Kuralları
Owin ara yazılım bileşenleri (OMC), aşağıdaki OWIN işlem hattı aşama olaylarında çalışacak şekilde yapılandırılabilir:
public enum PipelineStage
{
Authenticate = 0,
PostAuthenticate = 1,
Authorize = 2,
PostAuthorize = 3,
ResolveCache = 4,
PostResolveCache = 5,
MapHandler = 6,
PostMapHandler = 7,
AcquireState = 8,
PostAcquireState = 9,
PreHandlerExecute = 10,
}
Varsayılan olarak, OMC'ler son olayda (
PreHandlerExecute
) çalışır. bu nedenle ilk örnek kodumuzda "PreExecuteRequestHandler" görüntülendi.OWIN işlem hattının
app.UseStageMarker
enum'da listelenenPipelineStage
herhangi bir aşamasında daha önce çalıştırmak üzere bir OMC kaydetmek için yöntemini kullanabilirsiniz.OWIN işlem hattı ve IIS işlem hattı sıralanır, bu nedenle çağrısının
app.UseStageMarker
sırayla olması gerekir. Olay işleyicisini, ile kaydedilen son olaydan önce gelen bir olaya ayarlayamazsınızapp.UseStageMarker
. Örneğin, çağrıldıktan sonra :app.UseStageMarker(PipelineStage.Authorize);
veya
PostAuthenticate
geçirmeAuthenticate
çağrılarıapp.UseStageMarker
gerçekleştirilmeyecek ve hiçbir özel durum oluşturulmayacak. OMC'ler varsayılan olarak olanPreHandlerExecute
en son aşamada çalışır. Aşama işaretçileri, bunları daha önce çalışacak şekilde yapmak için kullanılır. Aşama işaretleyicilerini sıra dışı olarak belirtirseniz, önceki işaretçiye yuvarlarız. Başka bir deyişle, aşama işaretçisi eklendiğinde "X aşamasından sonra çalıştır" ifadesi yer alır. OMC'nin OWIN işlem hattında ardına eklenen en erken aşama işaretçisindeki çalıştırması.Çağrıların
app.UseStageMarker
en erken aşaması kazanır. Örneğin, önceki örneğimizden gelen aramalarınapp.UseStageMarker
sırasını değiştirirseniz:public void Configuration(IAppBuilder app) { app.Use((context, next) => { PrintCurrentIntegratedPipelineStage(context, "Middleware 1"); return next.Invoke(); }); app.Use((context, next) => { PrintCurrentIntegratedPipelineStage(context, "2nd MW"); return next.Invoke(); }); app.UseStageMarker(PipelineStage.ResolveCache); app.Run(context => { PrintCurrentIntegratedPipelineStage(context, "3rd MW"); return context.Response.WriteAsync("Hello world"); }); app.UseStageMarker(PipelineStage.Authenticate); }
Çıkış penceresi şunları görüntüler:
Current IIS event: AuthenticateRequest Msg: Middleware 1 Current IIS event: AuthenticateRequest Msg: 2nd MW Current IIS event: AuthenticateRequest Msg: 3rd MW
OMC'lerin
AuthenticateRequest
tümü, olaylaAuthenticate
kaydedilen son OMC veAuthenticate
diğer tüm olaylardan önce geldiği için aşamada çalışır.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin