Próbuję wstrzyknąć niestandardowe oprogramowanie pośrednie do mojego potoku OWIN, który otacza StaticFileMiddleware
dostępny z MS w celu obsługi trybu HTML 5 w AngularJS. Postępuję zgodnie z tym przewodnikiem: http://geekswithblogs.net/shaunxu/archive/2014/06/10/host-angularjs-html5mode-in-asp.net-vnext.aspxOwijanie StaticFileMiddleware w celu przekierowania 404 błędów
Z tego, co mogę zebrać, jak to działa, moje oprogramowanie pośredniczące przekazuje żądania do oprogramowania pośredniego plików statycznych, a następnie, jeśli nie może rozwiązać tych żądań (np. , żądanie dla ścieżki kątowej HTML 5, "/ cokolwiek"), zamiast tego zwraca podstawową kątową stronę, tak że będzie działać trudne żądanie dla ścieżki HTML 5.
Mój problem polega na tym, że wynikiem wywołania wewnętrznego oprogramowania pośredniego zawsze wydaje się być kod statusu 200, mimo że w przeglądarce mam 404, co powoduje, że drapię się po głowie. Oto mój kod referencyjny:
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;
}
}
Dzięki - korzystałem z usług IIS i to wspaniale. –
Otrzymuję błąd serwera wewnętrznego 500.19 z tym pomysłem? – georgiosd
@georgiosd wysłany musi znajdować się wewnątrz bloku. Pamiętaj też, aby nie uwzględniać "..."; D –
FLGMwt