2017-09-28 7 views
0

Au moment de servir l'application avec des fichiers statiques .NET de base, je suis incapable de changer l'URL dans le navigateur. Ce faisant, on me donne lade base .NET, Angular2, NancyFX - 404 changer l'URL dans le navigateur

404 - Not Found

page d'erreur de Nancy.

La seule URL qui fonctionne est l'URL de base, localhost: 5000. Changer l'URL pour localhost: 5000/réservations me donne 404. Appuyez sur F5 quand pas sur l'URL de base se traduira également par un 404.

Si j'utilise l'URL de browsersync, localhost: 4200, tout fonctionne et je peux changer le URL et appuyez sur F5 sans 404. C'est ce que je fais lors du développement, mais pas quand il est déployé sur le serveur en utilisant IIS.

Exécution de l'application dans IIS express

  1. ng build (les fichiers sont copiés wwwroot avec index.html)

  2. début IIS express

Startup.cs

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddEnvironmentVariables(); 
     Configuration = builder.Build(); 

     env.ConfigureNLog("nlog.config"); 
    } 

    public IConfiguration Configuration { get; } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddAuthentication(IISDefaults.AuthenticationScheme); 

     services.AddMvc(config => 
     { 
      var policy = new AuthorizationPolicyBuilder() 
       .RequireAuthenticatedUser() 
       .Build(); 
      config.Filters.Add(new AuthorizeFilter(policy)); 
     }); 

     services.AddMvc(); 

     services.InjectServices(); 

     services.AddOptions(); 

     services.Configure<Endpoints>(Configuration.GetSection("Endpoints")); 

     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

     services.AddSingleton<IConfiguration>(Configuration); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     app.Use(async (context, next) => 
     { 
      await next(); 
      if (!context.Request.Path.Value.StartsWith("/api/")) 
      { 
       context.Request.Path = "/index.html"; 
       await next(); 
      } 
     }); 

     app.UseDefaultFiles(); 

     app.UseStaticFiles(); 

     loggerFactory.AddNLog(); 

     app.AddNLogWeb(); 

     app.UseOwin(x => x.UseNancy(new NancyOptions 
     { 
      Bootstrapper = new Bootstrapper(app) 
     })); 
    } 
} 

Bootstrapper.cs

public class Bootstrapper : DefaultNancyBootstrapper 
{ 
    readonly IApplicationBuilder _app; 

    public Bootstrapper(IApplicationBuilder app) 
    { 
     _app = app; 
    } 

    protected override void ConfigureApplicationContainer(TinyIoCContainer container) 
    { 
     base.ConfigureApplicationContainer(container); 

     container.Register<IOptions<Endpoints>>(_app.ApplicationServices.GetService<IOptions<Endpoints>>()); 

     container.Register<IReservationService>(_app.ApplicationServices.GetService<IReservationService>()); 
    } 
} 

wwwroot

enter image description here

index.html

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>XXX</title> 
    <base href="/"> 
    <meta name="viewport" content="width=device-width,initial-scale=1"> 
    <link rel="icon" type="image/x-icon" href="XXX"> 
    <link href="styles.61cc257ef8131303860b.bundle.css" rel="stylesheet" /> 
</head> 
<body> 
    <app-root></app-root> 
    <script type="text/javascript" src="inline.f68c652d205feae6e02a.bundle.js"></script> 
    <script type="text/javascript" src="polyfills.756a44edc7e0a68ce65c.bundle.js"></script> 
    <script type="text/javascript" src="vendor.940a3ce39a746f717f7b.bundle.js"></script> 
    <script type="text/javascript" src="main.d5f9dd82a3600822cae2.bundle.js"></script> 
</body> 
</html> 

Je comprends qu'il ya un problème avec la gestion du contenu statique du serveur, mais je ne peux pas sembler figurer dehors.

Comment puis-je naviguer dans l'aide de l'URL du navigateur lors de l'hébergement de l'application angulaire dans .NET Core?

Mise à jour 1:

Après avoir ajouté:

PerformPassThrough = (context => context.Response.StatusCode == HttpStatusCode.NotFound) 

le 404 message d'erreur disparaît, mais la page est maintenant vide sans aucun message d'erreur, sauf la 404 dans la console ..

enter image description here

Répondre

0
  1. modifié Startup.cs
  2. module Ajouté qui retourne index.html pour toutes les demandes.
  3. Chemin d'accès racine configuré dans bootstrapper.cs.

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    //For serving index.html on baseurl - this can we done in AppNancyModule aswell: Get("/", _ => View["index"]); 
    app.UseDefaultFiles(); 

    app.UseStaticFiles(); 

    loggerFactory.AddNLog(); 

    app.AddNLogWeb(); 

    app.UseOwin(x => x.UseNancy(new NancyOptions 
    { 
     Bootstrapper = new Bootstrapper(app, env) 
    })); 
} 

AppNancyModule

public class AppNancyModule : NancyModule 
{ 
    public AppNancyModule() 
    { 
     //Get("/", _ => View["index"]); 

     Get(@"^(.*)$", _ => View["index"]); 
    } 
} 

Bootstrapper.cs

public class AppRootPathProvider : IRootPathProvider 
{ 
    private readonly IHostingEnvironment _environment; 

    public AppRootPathProvider(IHostingEnvironment environment) 
    { 
     _environment = environment; 
    } 
    public string GetRootPath() 
    { 
     return _environment.WebRootPath; 
    } 
} 

public class Bootstrapper : DefaultNancyBootstrapper 
{ 
    readonly IApplicationBuilder _app; 

    protected override IRootPathProvider RootPathProvider { get; } 

    public Bootstrapper(IApplicationBuilder app, IHostingEnvironment environment) 
    { 
     RootPathProvider = new AppRootPathProvider(environment); 
     _app = app; 
    } 

    protected override void ConfigureApplicationContainer(TinyIoCContainer container) 
    { 
     base.ConfigureApplicationContainer(container); 

     container.Register<IOptions<Endpoints>>(_app.ApplicationServices.GetService<IOptions<Endpoints>>()); 

     container.Register<IReservationService>(_app.ApplicationServices.GetService<IReservationService>()); 
    } 
} 
0

OMI le middleware que vous avez écrit devrait être après l'application. UseDefaultFiles(); et app.UseStaticFiles(); Et vous ne gérez que les demandes d'API.Essayez de réécrire un peu aussi gérer 404 erreurs et de ne pas traiter les demandes avec des extensions:

app.Use(async (context, next) => 
{ 
    await next(); 

    if (context.Response.StatusCode == 404 
     && !Path.HasExtension(context.Request.Path.Value) 
     && !context.Request.Path.Value.StartsWith("/api/")) 
    { 
     context.Request.Path = "/index.html"; 
     await next(); 
    } 
}); 
+0

Pas de succès, encore 404 – Reft

+0

Pour mauvais. C'est comme ça, comment cela fonctionne pour moi: http://asp.net-hacker.rocks/2016/04/04/aspnetcore-and-angular2-part1.html Peut-être que c'est à cause de quelque config NancyFX, je n'ai jamais travaillé avec il. –

+0

S'il vous plaît voir ma réponse et laissez-moi savoir si vous avez des objections :) Merci – Reft

0

Vous devez supprimer la première await next();. Cela envoie la demande à /reservations dans le pipeline, avant en réécrivant l'URL à index.html.

Quand il frappe Nancy, il verra s'il peut gérer /reservations, ce qu'il ne peut pas faire, et afficher une page 404.

+0

Pas de succès, page de banque encore. En outre, il donne une erreur de console: TypeError: error.json n'est pas une fonction – Reft

+0

S'il vous plaît voir ma réponse et laissez-moi savoir si vous avez des objections :) Merci – Reft