Ich stieß auf ein ähnliches Problem mit Angular js und verwendete einen etwas anderen Ansatz, um das Problem zu lösen.
Wir verwendeten Owin, um eine Route zum Einstiegspunkt des SPA (index.html) zu kartieren. Dadurch können Sie auf das SPA zugreifen und zu den verschiedenen Seiten navigieren. Allerdings, wenn Sie die Seite jemals aktualisiert haben, würden Sie einen 404 erhalten. Im Wesentlichen traten AngularJS Routing und Owin/Katana Routing auf die Zehen.
Ich habe das Problem gelöst, indem ich einen benutzerdefinierten DelegatingHandler erstellt habe. Dieser delegierende Handler wird verwendet, wenn Owin/Katana keine Route finden kann, die der Anfrage entspricht (404).
public class CustomDelegatingHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
Task<HttpResponseMessage> response = base.SendAsync(request, cancellationToken);
if (response.Result.StatusCode == HttpStatusCode.NotFound)
{
response.Result.Content = new StringContent(File.ReadAllText(@"index.html"));
response.Result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
response.Result.StatusCode = HttpStatusCode.OK;
}
return response;
}
}
Das Snippet oben kehrt index.html, der Einstiegspunkt des SPA, wenn wir nicht in der Lage sind, eine Seite zu finden, die Anfrage entsprechen.
Um diese delegierenden Handler zu verwenden, können Sie die folgende Zeile in HttpConfiguration müssen hinzufügen(), wenn der Host Owin Start:
var httpConfig = new HttpConfiguration();
httpConfig.MessageHandlers.Add(new CustomDelegatingHandler());
Kurz gesagt, ich habe eine Standardroute, die mit dem SPA abbildet, und jede nicht erkannte Route wird über den DelegierenHandler geleitet und bedient denselben SPA. Wir ändern den Request.Path nicht, sodass der SPA die Anforderung an die richtige Seite weiterleiten kann.
Sie möchten also, dass jede URL, die den Server trifft, index.html mit statischer Middleware bedient? – khellang
Ja, eine beliebige Route (oder eine Route, die mit '/ app/*' übereinstimmt) gibt die Datei 'index.html' zurück. –