Sto cercando di iniettare un middleware personalizzato nella mia pipeline OWIN che avvolge lo StaticFileMiddleware
disponibile da MS per supportare la modalità HTML 5 in AngularJS. Ho seguito questa guida: http://geekswithblogs.net/shaunxu/archive/2014/06/10/host-angularjs-html5mode-in-asp.net-vnext.aspxWrapping StaticFileMiddleware per reindirizzare gli errori 404
Da quello che posso capire su come dovrebbe funzionare, il mio middleware passa le richieste al middleware dei file statici e quindi se non riesce a risolvere quelle richieste (es. , una richiesta per un percorso angolare 5 HTML, "/ qualunque"), restituisce invece la pagina angolare di base in modo che una richiesta valida per un percorso HTML 5 funzioni.
Il mio problema è che il risultato di invocare il middleware interno sembra sempre essere un codice di stato 200, anche se nel mio browser ottengo un 404, che mi lascia grattarmi la testa. Ecco il mio codice di riferimento:
public static class AngularServerExtension
{
public static IAppBuilder UseAngularServer(this IAppBuilder builder, string rootPath, string entryPath)
{
var options = new AngularServerOptions()
{
FileServerOptions = new FileServerOptions()
{
EnableDirectoryBrowsing = false,
FileSystem = new PhysicalFileSystem(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, rootPath))
},
EntryPath = new PathString(entryPath)
};
builder.UseDefaultFiles(options.FileServerOptions.DefaultFilesOptions);
return builder.Use(new Func<AppFunc, AppFunc>(next => new AngularServerMiddleware(next, options).Invoke));
}
}
public class AngularServerMiddleware
{
private readonly AngularServerOptions _options;
private readonly AppFunc _next;
private readonly StaticFileMiddleware _innerMiddleware;
public AngularServerMiddleware(AppFunc next, AngularServerOptions options)
{
_next = next;
_options = options;
_innerMiddleware = new StaticFileMiddleware(_next, options.FileServerOptions.StaticFileOptions);
}
public async Task Invoke(IDictionary<string, object> environment)
{
IOwinContext context = new OwinContext(environment);
// try to resolve the request with default static file middleware
await _innerMiddleware.Invoke(environment);
Debug.WriteLine(context.Request.Path + ": " + context.Response.StatusCode);
// *** Right here is where I would expect a 404 but I get a 200 when debugging,
// even though my browser eventually returns a 404
// route to root path if the status code is 404
// and need support angular html5mode
if (context.Response.StatusCode == 404 && _options.Html5Mode)
{
context.Request.Path = _options.EntryPath;
await _innerMiddleware.Invoke(environment);
Console.WriteLine(">> " + context.Request.Path + ": " + context.Response.StatusCode);
}
}
}
public class AngularServerOptions
{
public FileServerOptions FileServerOptions { get; set; }
public PathString EntryPath { get; set; }
public bool Html5Mode
{
get
{
return EntryPath.HasValue;
}
}
public AngularServerOptions()
{
FileServerOptions = new FileServerOptions();
EntryPath = PathString.Empty;
}
}
Grazie - Stavo usando IIS e questo ha fatto il trucco meravigliosamente. –
Ricevo un errore interno del server 500.19 con questo, qualche idea? – georgiosd
@georgiosd il postato deve trovarsi all'interno di un blocco. Assicurati anche di non includere "..."; D –
FLGMwt