tutorial net mvc example asp c# asp.net-mvc owin

net - owin login c#



Uso de una carpeta wwwroot(estilo ASP.NET Core) en el proyecto ASP.NET 4.5 (3)

Aunque OWIN trabajó para mí en mi entorno de desarrollo que se ejecutó en VS 2017, no funcionó una vez implementado en Azure. También ejecutamos un SPA, y estamos almacenando la salida del paquete web en ~ / wwwroot / pero queremos que se cargue como si estuviera en la raíz del proyecto ~ / igual que .net core webapi lo hace. Lo logré usando solo la reescritura de URL que se muestra a continuación:

<system.webServer> <rewrite> <rules> <rule name="wwwRootFix" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{APPL_PHYSICAL_PATH}wwwroot/{R:1}" matchType="IsFile" /> <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" /> <add input="{REQUEST_URI}" pattern="^/(wwwroot)" negate="true" /> </conditions> <action type="Redirect" url="/wwwroot/{R:1}" /> </rule> <rule name="React Routes" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" /> <add input="{REQUEST_URI}" pattern="^/(wwwroot)" negate="true" /> </conditions> <action type="Rewrite" url="/wwwroot/index.html" /> </rule> </rules> </rewrite> </system.webServer>

La primera regla asegura que el archivo que está buscando no existe en la raíz, no es una carpeta, se encuentra en la nueva ruta, no es la carpeta wwwroot, ni es parte de la api. Si TODAS estas condiciones se cumplen, intenta cargar los datos de wwwroot.

La segunda regla verifica para asegurarse de que no está intentando cargar la api o un archivo que realmente existe en la raíz. Si se cumplen ambas condiciones, carga el documento html SPA predeterminado (en nuestro caso, usamos reaccionar).

Efectivamente, esto permite que react-router 4 maneje todas las demás rutas después de que todas las otras condiciones anteriores hayan fallado en encontrar una coincidencia, y lo hacen para que no se genere un error 404 al intentar cargar una de las rutas de react-router.

Me gusta bastante el enfoque de las nuevas aplicaciones web asp.net (asp.net 5 / core 1.0) con la carpeta wwwroot siendo la raíz y solo los archivos estáticos que se publican allí.

¿Es posible, a través del enrutamiento u otra configuración, que una carpeta wwwroot en un proyecto asp.net 4.5 se comporte de manera similar, de modo que los archivos estáticos solo se publiquen fuera de ella, y sea la "raíz" de la aplicación web para archivos estáticos?

(Parte de mi motivación para preguntar esto es que tengo una aplicación angular alojada en un proyecto asp.net 5 en VS2015, pero necesito mover esto a un proyecto asp.net 4.5, pero me gustaría mantener la estructura existente en el disco )

Intente usar OWIN

He intentado esto utilizando un proyecto de aplicación web ASP.NET 4.5 vacío y OWIN. Así que mi estructura de carpetas tiene mi aplicación angular, con un archivo principal index.html en una carpeta wwwroot en la carpeta del proyecto. No hay archivos HTML en la raíz del proyecto.

He agregado OWIN a través de nuget y el siguiente archivo de inicio:

[assembly: OwinStartup(typeof(MyApp.UI.Startup))] namespace MyApp.UI { public class Startup { public void Configuration(IAppBuilder app) { string root = AppDomain.CurrentDomain.BaseDirectory; var physicalFileSystem = new PhysicalFileSystem(Path.Combine(root, "wwwroot")); var options = new FileServerOptions { EnableDefaultFiles = true, FileSystem = physicalFileSystem }; options.StaticFileOptions.FileSystem = physicalFileSystem; options.StaticFileOptions.ServeUnknownFileTypes = false; options.DefaultFilesOptions.DefaultFileNames = new[] {"index.html"}; app.UseFileServer(options); } } }

Sin embargo, esto falla: la fuente de mi archivo index.html se carga cuando lo ejecuto, pero todos los archivos css, js, etc. a los que hace referencia fallan con un 404. Lo que es peor, si agrego gulpfile.js a la url raíz carga mi archivo gulp desde la raíz de la carpeta del proyecto. Este es precisamente el tipo de cosas que trato de evitar.

¿Algunas ideas?


Creo que tengo un método de trabajo para hacer esto ahora. Tomé un poco de googlear y experimentación, pero al final se me ocurrió el siguiente proceso:

  1. Cree un nuevo proyecto ASP.NET 4.5 en VS2015, seleccionando la plantilla vacía

  2. Agregue referencias OWIN a través de nuget ( Install-Package Microsoft.Owin.Host.SystemWeb y Microsoft.Owin.StaticFiles )

  3. Agrega un archivo de inicio similar a este:

    [assembly: OwinStartup(typeof(MyApp.Startup))] namespace MyApp.UI { public class Startup { public void Configuration(IAppBuilder app) { string root = AppDomain.CurrentDomain.BaseDirectory; var physicalFileSystem = new PhysicalFileSystem(Path.Combine(root, "wwwroot")); var options = new FileServerOptions { RequestPath = PathString.Empty, EnableDefaultFiles = true, FileSystem = physicalFileSystem }; options.StaticFileOptions.FileSystem = physicalFileSystem; options.StaticFileOptions.ServeUnknownFileTypes = false; app.UseFileServer(options); } } }

  4. Agregue lo siguiente a su archivo web.config, para evitar que IIS sirva archivos estáticos que no quiere que lo hagan, y haga que todo pase a través de la canalización OWIN:

    <system.webServer> <handlers> <remove name="StaticFile"/> <add name="Owin" verb="" path="*" type="Microsoft.Owin.Host.SystemWeb.OwinHttpHandler, Microsoft.Owin.Host.SystemWeb"/> </handlers> </system.webServer>

Siempre estoy abierto a mejores sugerencias sobre cómo hacer esto, pero al menos esto parece funcionar para mí.


Si desea utilizar IIS para esto, puede crear una regla de reescritura:

<system.webServer> <rewrite> <rules> <rule name="RewriteUnknownToIndex" patternSyntax="ECMAScript" stopProcessing="true"> <match url="^wwwroot/.*" negate="true" /> <action type="Rewrite" url="/wwwroot/index.html" /> </rule> </rules> </rewrite> </system.webServer>

También puede agregar un prefijo a la expresión regular de URL, como ^(wwwroot|api)/.* , si esta es una web-api que le gustaría alojar en / api.