2014-07-07 6 views
6

उदा। मेरे पास /Content/static/home.html पर सर्वर पर स्थित एक फ़ाइल है। मैं /Content/v/1.0.0.0/static/home.html (संस्करण के लिए) के लिए अनुरोध करने में सक्षम होना चाहता हूं, और इसे यूआरएल को फिर से लिखना है ताकि यह ओडब्ल्यूआईएन मिडलवेयर का उपयोग करके फ़ाइल को सही यूआरएल पर एक्सेस कर सके।स्थिर फ़ाइल के अनुरोध के लिए संस्करण यूआरएल को फिर से लिखने के लिए ओविन मिडलवेयर का उपयोग कैसे करें?

मैं वर्तमान में यूआरएल रीराइट मॉड्यूल (एक आईआईएस एक्सटेंशन) का उपयोग कर रहा हूं, लेकिन मैं इस काम को ओविन पाइपलाइन में बनाना चाहता हूं।

अपने स्टार्टअप विन्यास विधि में
<system.webServer> 
    ... 
    <modules runAllManagedModulesForAllRequests="true"></modules> 
    ... 
</system.webServer> 

तब:

पहले सुनिश्चित करें कि यह अपने वेब config में है, ताकि स्थिर फ़ाइल अनुरोध Owin ही भेजे गए हैं:

उत्तर

9

मैं एक समाधान Microsoft.Owin.StaticFiles nuget पैकेज का उपयोग कर पाया , इस कोड जोड़ें:

// app is your IAppBuilder 
app.Use(typeof(MiddlewareUrlRewriter)); 
app.UseStaticFiles(); 
app.UseStageMarker(PipelineStage.MapHandler); 

और यहाँ MiddlewareUrlRewriter है:

public class MiddlewareUrlRewriter : OwinMiddleware 
{ 
    private static readonly PathString ContentVersioningUrlSegments = PathString.FromUriComponent("/content/v"); 

    public MiddlewareUrlRewriter(OwinMiddleware next) 
     : base(next) 
    { 
    } 

    public override async Task Invoke(IOwinContext context) 
    { 
     PathString remainingPath; 
     if (context.Request.Path.StartsWithSegments(ContentVersioningUrlSegments, out remainingPath) && remainingPath.HasValue && remainingPath.Value.Length > 1) 
     { 
      context.Request.Path = new PathString("/Content" + remainingPath.Value.Substring(remainingPath.Value.IndexOf('/', 1))); 
     } 

     await Next.Invoke(context); 
    } 
} 

उदाहरण के लिए, यह /Content/static/home.html पर फ़ाइल पुनर्प्राप्त करने के लिए GET अनुरोध को /Content/v/1.0.0.0/static/home.html पर अनुमति देगा।

अद्यतन: जोड़ा गया app.UseStageMarker(PipelineStage.MapHandler); अन्य app.Use तरीकों के रूप में यह इस काम करने के लिए आवश्यक है के बाद। http://katanaproject.codeplex.com/wikipage?title=Static%20Files%20on%20IIS

2

सैद्धांतिक रूप से तो आप इस एक अलग UrlRewriter मिडलवेयर के बजाय विकल्पों के साथ UseStaticFiles उपयोग कर सकते हैं:

string root = AppDomain.CurrentDomain.BaseDirectory; 
var staticFilesOptions = new StaticFileOptions(); 
staticFilesOptions.RequestPath = new PathString("/foo"); 
staticFilesOptions.FileSystem = 
      new PhysicalFileSystem(Path.Combine(root, "web")); 
app.UseStaticFiles(staticFilesOptions); 

लेकिन this question देखना है, क्योंकि यह वर्तमान में काम करने के लिए प्रतीत नहीं।

+0

क्या आप दिखा सकते हैं कि यूआरएल में किसी भी संस्करण के लिए यह सवाल कैसे हो सकता है, प्रश्न में उदाहरण के अनुसार? –

+0

यह "किसी भी" संस्करण को संभाल नहीं सकता है, आपको इसे इच्छित प्रत्येक संस्करण के लिए दोहराना होगा, लेकिन प्रश्न में केवल एक संस्करण था। यदि आपको संसाधनों के एक ही सेट में मैप किए जाने वाले सभी संस्करणों की आवश्यकता है तो हाँ, आपका यूआरएल रीराइटर अधिक उपयुक्त हो सकता है। –

+0

यह मेरे लिए काम नहीं करता है। मैं ओविन स्टेटिकफाइल मिडलवेयर संस्करण 4.0 का उपयोग करता हूं। मैं निदान कैसे कर सकता हूं? – Vunb

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