2014-08-27 27 views
5

Owin ve Katana ile etrafta dolaşıyorum ve ortak klasörüme statik dosyalar sunmak istiyorum.Owin, yalnızca belirli bir klasördeki dosyaları sunar

Stil sayfaları ve komut dosyaları içeren bir İçerik klasörüm var.

Benim Başlangıç:

public void Configuration(IAppBuilder app) 
    { 
#if DEBUG 
     //when things go south 
     app.UseErrorPage(); 
    #endif 

     // Remap '/' to '.\public\'. 
     // Turns on static files and public files. 
     app.UseFileServer(new FileServerOptions() 
     { 
      RequestPath = PathString.Empty, 
      FileSystem = new PhysicalFileSystem(@".\public"), 
     }); 

    } 

Yani localhost göz atarsa ​​eğer: 8861/benim ortak klasöre index.html dosyasını gidin. Bu iyi. Ancak, engellemek istediğim localhost: 8861/Content/style.css dosyasına da göz atabilirim. Kullanıcının ihtiyaç duyduğu her şey herkese açık klasörde erişilebilir olmalıdır. Tüm kalanlar bloke edilmelidir.

Bunu nasıl başarabilirim?

cevap

1

Dosya sunucusunun yapılandırması doğru ve diğer klasörlere erişime izin vermiyor. Ben test OWIN self-host projesi içinde kontrol ettik ve beklendiği gibi çalışır, sadece ortak klasör erişilebilir. IIS'yi OWIN uygulamanızı barındırmak için kullandığınızı varsayalım (böylece uygulamanız kendi kendini barındırmıyor). Öyleyse, IIS Statik Dosya İşleyicisi, statik dosyalara ve dizinlere (ve ayrıca içerik klasörünüze) da izin verir. Böylece, IIS'deki statik dosyalara erişimi nasıl kaldıracağınızı (web.config dosyasında yapılabilir) veya bunlara erişimin nasıl kısıtlanacağını araştırabilirsiniz.

StaticFile İşleyiciyi web sitesinin yapılandırmasından kaldırabilirsiniz, ancak bu andan itibaren IIS'yi statik dosyalar sunmayacağı için dikkatle yapmanız gerekir.

<configuration> 
    <system.webServer> 
     <handlers> 
      <remove name="StaticFile" /> 
     </handlers> 
    </system.webServer> 
</configuration> 
+0

Teşekkürler, bu sorunu gerçekten çözüyor. Ancak, ortak klasörümdeki diğer dosyaları sunarken bir sorun var gibi görünüyor. Yani kamu bir index.html, style.css ve script.js içerir. Dizin sunulur, ancak style.css ve script.js bir 404.4 verir. Herhangi bir fikir? – user1613512

+0

Garip, her şey benim bilgisayarımda iyi çalışıyor, ama ben kendi kendini barındırılan bir uygulama ile test ediyorum. Bu dosyalara, sitenize/public/style.css sitenize değil, sitenize/style.css adreslerine eriştiğinizden emin misiniz? Bu dosyalar web sitesinin klasöründe var, değil mi? – ntl

+0

Denediğin bir şey daha var. Konfigürasyonunuzdaki bir sonraki middleware'i kaydedin: app.Run (context => {return bağlam.Response.WriteAsync ("Wildcard OWIN App");}); delegenin içine yer işareti koyun ve tarayıcıdan style.css dosyasına erişmeyi deneyin. Bu işleyici, diğer middlewares tarafından ele alınmamış tüm istekleri ele alan joker bir ara yazılımdır. Uygulamanız kesme noktasıyla durdurulursa, OWIN isteği işleme alır, ancak yapılandırma doğru değildir, aksi halde IIS yapılandırmasında bir sorun vardır. – ntl

2

Eğer çıplak kemikleri yapmanız ya, bazı orta ware ile tam kontrol alabilir hizmet etmek istemiyoruz hangi dosyaları üzerinde mutlak kontrolü ile dosya taşıma, gerekiyorsa. Bunu geliştirme sırasında dosyalanmamış önbellek istediğim gibi yaptım.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Threading.Tasks; 
using System.Web; 

namespace Owin 
{ 
    using AppFunc = Func<IDictionary<string, object>, Task>; 

    public static class DynamicFileExtension 
    {  
     /// <summary> 
     /// ONLY use during development 
     /// </summary> 
     public static void UseDynamicFiles(this IAppBuilder app, string baseDirectory) 
     { 
      app.Use(new Func<AppFunc, AppFunc>(next => (async context => 
      { 
       var method = (string) context["owin.RequestMethod"]; 
       var requestpath = (string) context["owin.RequestPath"]; 
       var scheme = (string) context["owin.RequestScheme"]; 
       var response = (Stream) context["owin.ResponseBody"]; 
       var responseHeader = (Dictionary<string, string[]>) context["owin.ResponseHeaders"]; 

       if (method == "GET" && scheme == "http") 
       { 
        var fullpath = baseDirectory + requestpath; 

        // block logic...  

        if (File.Exists(fullpath)) 
        { 

         using (var file = File.OpenRead(fullpath)) 
         { 
          await file.CopyToAsync(response); 
         } 

         var mime = MimeMapping.GetMimeMapping(fullpath); 

         responseHeader.Add("Content-Type", new[] {mime}); 

         return; 
        } 
       } 

       await next.Invoke(context); 
      }))); 
     } 
    } 
} 

Üretimde kullanmazdım, ama benim için hile yaptı.

İlgili konular