2014-12-01 14 views
11

ASP.Net WebAPI'nin üstüne oturan bir SPA yapıyorum. Geçmişi yönlendirme için #/ yerine HTML5 geçmişini kullanmayı bekliyorum ancak bu, derin bağlantı için bir sorun teşkil ediyor, / ve /foo/bar öğelerinin hepsinin aynı HTML dosyasını döndürdüğünden emin olmalıyım (ve JS'm SPA'nın doğru bölümünü oluşturacaktır) .OWIN Birden fazla rota için statik dosya gönder

OWIN/Katana'nın birden çok farklı URL için aynı HTML dosyasını döndürmesini nasıl sağlayabilirim?

+0

Bu nedenle, sunucuya herhangi bir URL'nin statik dosya ara katman yazılımını kullanarak index.html sunacak şekilde yönlendirilmesini istiyorsunuz? – khellang

+0

Evet, herhangi bir rota (veya '/ app/*' ile eşleşen herhangi bir yol) 'index.html' dosyasını döndürür. –

cevap

21

hala Statik Dosyalar katman vb tüm önbelleğe alma iyilik tutarken, işler basit hale getirmek için, sadece bu

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Map("/app", spa => 
     { 
      spa.Use((context, next) => 
      { 
       context.Request.Path = new PathString("/index.html"); 

       return next(); 
      }); 

      spa.UseStaticFiles(); 
     }); 

     app.UseWelcomePage(); 
    } 
} 

Bu karşılama görev yapacak gibi bir satır içi yazılım kullanılması istek yolunu yeniden ediyorum Bunun yerine, her zaman index.html işlevi görecek /app/* numaralı sayfa.

0

Angular js kullanarak benzer bir sorunla karşılaştım ve sorunu çözmek için biraz farklı bir yaklaşım kullandım.

Owin'i SPA (index.html) giriş noktasına bir rota eşlemek için kullandık. Bu, SPA'ya erişmenizi ve farklı sayfalara gitmenizi sağlar. Ancak, sayfayı yeniledikten sonra 404 elde edersiniz. Esasen, AngularJS'nin yönlendirme ve Owin/Katana'nın yönlendirmesi, birbirlerinin ayak parmaklarına basıyordu.

Özel bir DelegatingHandler oluşturarak bu sorunu çözdüm. Bu temsilci işleyici, Owin/Katana isteğiyle eşleşen bir yol bulamadığında kullanılır (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; 
    } 
} 

biz isteği eşleşen bir sayfa bulamıyorsanız döner index.html yukarıdaki pasajı, SPA'nın giriş noktası. Bu delegating işleyicisi kullanmak için

, kendi HttpConfiguration için aşağıdaki satırı eklemeniz gerekir (Owin konak başlatırken): Kısaca

 var httpConfig = new HttpConfiguration(); 
     httpConfig.MessageHandlers.Add(new CustomDelegatingHandler()); 

, ben SPA eşleştiren varsayılan bir yolu, ve tanınmayan herhangi bir yol DelegatingHandler'dan geçecek ve aynı SPA'ya hizmet edecektir. Request.Path'i değiştirmeyiz ve SPA'nın talebi doğru sayfaya yönlendirmesini sağlarız.

+0

Bu biraz işe yarayacaktır, ancak çoğu durumda, bu tür bir uygulamayı üretimde kullanmak tavsiye edilecektir. File.ReadAllText, kodlamayı otomatik olarak algılar (sorunlara neden olabilir) ve diğer yaklaşımlar kadar verimli olmayacaktır. –

+0

Girişiniz için teşekkürler. Öyleyse, kabul edilen cevaba benzer bir çözüm kullanmamı mı yoksa tercih edilen File.ReadAllText'in bir alternatifi var mı? – Justin

İlgili konular