2014-08-27 9 views
5

में फ़ाइलों की सेवा करता है इसलिए मैं ओविन और कटाना के साथ खेल रहा हूं और मैं अपने सार्वजनिक फ़ोल्डर में स्थिर फाइलों को प्रस्तुत करना चाहता हूं।ओविन केवल कुछ फ़ोल्डर

मेरे पास स्टाइलशीट और एक स्क्रिप्ट फ़ोल्डर के साथ एक सामग्री फ़ोल्डर है।

मेरे स्टार्टअप:

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"), 
     }); 

    } 

तो अगर अगर मैं स्थानीय होस्ट करने के लिए ब्राउज़ करें: 8861/मैं अपने सार्वजनिक फ़ोल्डर में index.html फ़ाइल जाओ। ठीक है। लेकिन मैं अपने लोकहोस्ट पर भी ब्राउज़ कर सकता हूं: 8861/Content/style.css जिसे मैं ब्लॉक करना चाहता हूं। उपयोगकर्ता की जरूरतों को सब कुछ सार्वजनिक फ़ोल्डर में सुलभ होना चाहिए। बाकी सभी को अवरुद्ध किया जाना चाहिए।

मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

1

फ़ाइल सर्वर की कॉन्फ़िगरेशन सही है और अन्य फ़ोल्डरों तक पहुंच की अनुमति नहीं देता है। मैंने परीक्षण ओविन स्वयं-होस्ट प्रोजेक्ट के भीतर इसे चेक किया है और यह अपेक्षा के अनुसार काम करता है, केवल सार्वजनिक फ़ोल्डर तक पहुंचा जा सकता है। मुझे लगता है कि आप अपने ओविन उपकरण को होस्ट करने के लिए आईआईएस का उपयोग करते हैं (इसलिए आपका ऐप स्वयं-होस्ट नहीं है)। यदि ऐसा है, तो आईआईएस स्टेटिक फ़ाइल हैंडलर स्थिर फ़ाइलों और निर्देशिकाओं (और आपके सामग्री फ़ोल्डर में भी) को प्राप्त करता है। तो आप आईआईएस में स्थिर फ़ाइलों तक पहुंच को अक्षम करने के लिए खोज सकते हैं (web.config में किया जा सकता है) या उनमें से कुछ तक पहुंच प्रतिबंधित कैसे करें।

आप वेबसाइट की कॉन्फ़िगरेशन से स्टेटिकफ़ाइल हैंडलर को हटा सकते हैं, लेकिन आपको इसे सावधानीपूर्वक करना चाहिए क्योंकि इस पल से आईआईएस स्थिर फाइलों की सेवा नहीं करेगा।

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

धन्यवाद यह वास्तव में समस्या हल करता है। हालांकि मेरे सार्वजनिक फ़ोल्डर में अन्य फाइलों की सेवा करने में कोई समस्या है। तो सार्वजनिक में index.html, style.css और script.js शामिल हैं। इंडेक्स परोसा जाता है लेकिन style.css और script.js 404.4 देते हैं। कोई विचार? – user1613512

+0

अजीब, सबकुछ मेरे पीसी पर ठीक काम करता है, लेकिन मैं स्वयं-होस्ट किए गए ऐप के साथ परीक्षण करता हूं। क्या आप वाकई इन फ़ाइलों को अगली यूआरएल yoursite/style.css के साथ एक्सेस करते हैं और yoursite/public/style.css नहीं? ये फ़ाइलें वेबसाइट के फ़ोल्डर में मौजूद हैं, है ना? – ntl

+0

एक और चीज जिसे आप आजमा सकते हैं। आपके बीच कॉन्फ़िगरेशन में अंतिम अंतिम के रूप में अगला मिडलवेयर पंजीकृत करें: app.Run (संदर्भ => {वापसी संदर्भ। Reesponse.WriteAsync ("वाइल्डकार्ड ओविन ऐप");}); प्रतिनिधि के अंदर ब्रेकपॉइंट रखें और ब्राउज़र से style.css तक पहुंचने का प्रयास करें। यह हैंडलर वाइल्डकार्ड मिडलवेयर है जो अन्य अनुरोधों को संभालता है जो अन्य माध्यमिकों द्वारा नियंत्रित नहीं किए जाते हैं। यदि आपका ऐप ब्रेकपॉइंट के साथ बंद कर दिया जाएगा, ओविन अनुरोध को संभालता है लेकिन कॉन्फ़िगरेशन सही नहीं है, अन्यथा आईआईएस कॉन्फ़िगरेशन में कुछ गलत है। – ntl

2

आप नंगे हड्डियों की जरूरत है पूर्ण नियंत्रण है जिस पर फ़ाइलें आप करते हैं, या नहीं है, सेवा करने के लिए आप कुछ मध्य-बर्तन के साथ पूरा नियंत्रण ले सकते हैं के साथ फ़ाइल-हैंडलिंग,। मैंने ऐसा किया क्योंकि मैं विकास के दौरान अनचाहे फ़ाइल-सेवारत चाहता था।

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); 
      }))); 
     } 
    } 
} 

मैं इसे उत्पादन में उपयोग नहीं करता, लेकिन यह मेरे लिए चाल है।

संबंधित मुद्दे