2013-10-27 8 views
15

Wenn ich eine OWIN-Middleware mit Microsoft.Owin-Typen wie OwinMiddleware und IOwinContext erstelle, würde meine Middleware mit anderen Hosts/Servern von Microsoft zusammenarbeiten? Ich schaue auf die Middleware-Klassen für Nancy und SignalR und sie scheinen sehr unterschiedlich von der OwinMiddleware Basisklasse, die Middlewares wie die Cookie-Authentifizierung Middleware und WebApi basiert. Ich lese die Spezifikation, aber ich bin immer noch nicht klar, ob ein Nicht-Microsoft-Owin-Server mit dem OwinMiddleware- und IOwinContext-Typ arbeiten könnte, ohne von Microsoft.Owin abhängig zu sein (was vermutlich den Zweck von Owin zunichte machen würde).Sind Microsoft.Owin-Typen wie OwinMiddleware und IOwinContext mit anderen Owin-Servern inkompatibel?

Antwort

18

Wenn Sie Middleware mit dem OwinMiddleware-Basistyp erstellen, funktioniert sie standardmäßig nicht mit anderen Microsoft Owin-Servern. Aber es kann gemacht werden, mit Nicht-Microsoft-Servern zu arbeiten (SignalR funktioniert gut mit Nowin als Beispiel).

In der Standardimplementierung von IAppBuilder (https://github.com/owin/owin-hosting/blob/master/src/main/Owin.Builder/AppBuilder.cs) ist eine Signaturkonvertierungsfunktion eingebaut. Dadurch kann jeder eine Konvertierung von T -> AppFunc und AppFunc -> T registrieren. Dies bedeutet, dass Sie Middleware mit verschiedenen Signaturen kombinieren können in der gleichen Pipeline. (Ein Beispiel dafür, wie OwinMiddleware funktioniert, finden Sie unter https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin/Infrastructure/SignatureConversions.cs). Solange diese Konvertierung existiert, können Sie "rohe" Middleware (wie Nancy) nahtlos mit OwinMiddleware arbeiten. Um zu sehen, wie das funktioniert, schau mal hier:

https://github.com/owin/owin-hosting/blob/master/src/main/Owin.Builder/AppBuilder.cs#L182 (Nun, da Ihr Gehirn als explodierte ... weiter lesen)

Im Fall SignalR wir automatisch die Konvertierung in Ihrem Namen (https://github.com/SignalR/SignalR/blob/dev/src/Microsoft.AspNet.SignalR.Core/Owin/OwinExtensions.cs#L168) hinzufügen, aber es kann in jedem Code ausgeführt werden, der von OwinMiddleware abhängt, um sicherzustellen, dass der Übergang funktioniert.

Wenn Sie Microsoft.Owin.Hosting verwenden, um Ihre Anwendung zu starten, aber Sie einen Nicht-Microsoft-Webserver verwenden, erhalten Sie die Konvertierung ebenfalls kostenlos (siehe die aktuelle Readme-Datei für ein Beispiel https://github.com/Bobris/Nowin/blob/master/README.md).

Hoffe, das hilft.

+1

Danke für eine tolle Antwort und die Links! Das ist genau das Detail, das ich brauche, damit dies für mich Sinn ergibt. Wünschte nur, dass alle an einer einzigen Methodensignatur festhalten, anstatt all diese fliegenden Ninja zu machen, super menschliche Fähigkeiten der Kodierung, um von einer Signatur zu einer anderen zu konvertieren. Codierung ist hart genug, wie – enamrik

+0

OwinMiddleware ist ziemlich unnötig. Es hilft der Auffindbarkeit ein wenig und gibt Ihnen einige starke typedness, aber Sie können ziemlich die gleichen Vorteile erhalten, wenn Sie MS.Owin nur für den OwinContext verwenden und das AppFunc manuell implementieren. – davidfowl

+0

Ich habe kürzlich ein Problem darüber erstellt: http://katanaproject.codeplex.com/workitem/81 – bbaia