Ho riscontrato un problema simile utilizzando Angular js e ho utilizzato un approccio leggermente diverso per risolvere il problema.
Abbiamo utilizzato Owin per mappare un percorso verso il punto di ingresso della SPA (index.html). Questo ti consente di accedere alla SPA e navigare nelle diverse pagine. Tuttavia, se avessi mai aggiornato la pagina, avresti ottenuto un 404. Essenzialmente, il routing di AngularJS e il routing di Owin/Katana si stavano calpestando l'un l'altro.
Ho risolto il problema creando un DelegatingHandler personalizzato. Questo gestore delegante viene utilizzato ogni volta che Owin/Katana non è in grado di trovare una route corrispondente alla richiesta (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;
}
}
Il frammento precedente restituisce index.html, il punto di ingresso della SPA, quando siamo in grado di trovare una pagina corrispondente alla richiesta.
Per poter utilizzare questo gestore delegante, è necessario aggiungere la seguente riga al HttpConfiguration() quando si avvia l'host Owin:
var httpConfig = new HttpConfiguration();
httpConfig.MessageHandlers.Add(new CustomDelegatingHandler());
Insomma, ho un percorso predefinito che mappa alla SPA, e qualsiasi percorso non riconosciuto passerà attraverso il DelegatingHandler e servirà la stessa SPA. Non modifichiamo il Request.Path, consentendo alla SPA di indirizzare la richiesta alla pagina corretta.
Quindi vuoi che qualsiasi URL colpisca il server per servire index.html usando il middleware di file statici? – khellang
Sì, qualsiasi percorso (o qualsiasi percorso corrispondente a '/ app/*') restituirà il file 'index.html'. –