2009-07-19 5 views
61

स्थिर फ़ाइलों को सेवा देने के लिए एएसपी.Net रूटिंग (एमवीसी नहीं) का उपयोग किया जा सकता है?स्थिर फ़ाइलों को सेवा देने के लिए एएसपी.NET रूटिंग का उपयोग

मैं

http://domain.tld/a/b/c/picture.jpg 

के लिए रास्ते में

http://domain.tld/static/picture.jpg 

करना चाहते कहो और मैं इस अर्थ में कि फिर से लिखा यूआरएल मक्खी पर गणना की जाती है में गतिशील रूप से यह करना चाहते हैं। मैं एक बार और सभी के लिए एक स्थिर मार्ग स्थापित नहीं कर सकता।

routes.Add(
    "StaticRoute", new Route("static/{file}", new FileRouteHandler()) 
); 

FileRouteHandler.ProcessRequest विधि में मैं /static/picture.jpg से /a/b/c/picture.jpg के लिए पथ को फिर से लिखने कर सकते हैं:

वैसे भी, मैं इस तरह एक मार्ग बना सकते हैं। मैं फिर स्थैतिक फाइलों के लिए एक हैंडलर बनाना चाहता हूं। एएसपी.NET इस उद्देश्य के लिए StaticFileHandler का उपयोग करता है। दुर्भाग्य से, यह कक्षा आंतरिक है। मैं हैंडलर प्रतिबिंब का उपयोग कर बनाने की कोशिश की है और यह वास्तव में काम करता है:

Assembly assembly = Assembly.GetAssembly(typeof(IHttpHandler)); 
Type staticFileHandlerType = assembly.GetType("System.Web.StaticFileHandler"); 
ConstructorInfo constructorInfo = staticFileHandlerType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null); 
return (IHttpHandler) constructorInfo.Invoke(null); 

लेकिन आंतरिक प्रकार का उपयोग कर उचित समाधान हो प्रतीत नहीं होता है। एक और विकल्प है अपने StaticFileHandler को लागू करना, लेकिन ऐसा ठीक से करना (श्रेणियों और ईटैग जैसी HTTP सामग्री का समर्थन करना) गैर-तुच्छ है।

मुझे एएसपी.नेट में स्थिर फाइलों के रूटिंग से कैसे संपर्क करना चाहिए?

उत्तर

37

कुछ घंटों के लिए इस समस्या को खोदने के बाद, मैंने पाया कि केवल अनदेखा नियमों को जोड़ने से आपकी स्थिर फाइलें मिल जाएंगी।

RegisterRoutes में (RouteCollection मार्गों), निम्नलिखित पर ध्यान न दें नियम जोड़ें:

routes.IgnoreRoute("{file}.js"); 
routes.IgnoreRoute("{file}.html"); 
+0

मेरे लिए यह काम करता है, लेकिन मैं किसी क्षेत्र के व्यू फ़ोल्डर में जेएस फ़ाइल को पार्स नहीं कर सकता, इसे ठीक करने के लिए, मैं क्षेत्र के मूल फ़ोल्डर में /Areas/MyArea/ClientScripts/foo.js जैसे किसी अन्य फ़ोल्डर का उपयोग करता हूं – eka808

+20

किसी भी तरह से मुझे पहेली में एक टुकड़ा याद आ रहा है ... आपकी स्थिर फाइलों के मार्गों को अनदेखा करने से '/ static' से'/a/b/c' (जिसे ओपी ने पूछा) से रूटिंग में मदद मिलती है? क्या आप कृपया अपने उत्तर पर कुछ और प्रकाश डालेंगे, मैं वास्तव में इस समाधान को समझना चाहूंगा। – Oliver

+17

ओलिवर से सहमत है कि यह ओपी का जवाब नहीं देता है और समाधान के रूप में स्वीकार नहीं किया जाना चाहिए। – dhochee

48

आईआईएस का ऐसा क्यों उपयोग नहीं करें? आपके अनुरोध पर भी अनुरोध करने से पहले आप पहले मार्ग से किसी भी अनुरोध को इंगित करने के लिए केवल रीडायरेक्ट नियम बना सकते हैं। इस वजह से, अनुरोधों को पुनर्निर्देशित करने के लिए यह एक तेज विधि होगी।

<rule name="Rewrite Static Images" stopProcessing="true"> 
    <match url="^static/?(.*)$" /> 
    <action type="Rewrite" url="https://stackoverflow.com/a/b/c/{R:1}" /> 
</rule> 

:

आप यह मानते हुए IIS7 +

<rule name="Redirect Static Images" stopProcessing="true"> 
    <match url="^static/?(.*)$" /> 
    <action type="Redirect" url="https://stackoverflow.com/a/b/c/{R:1}" redirectType="Permanent" /> 
</rule> 

या, यदि आप पुनर्निर्देशित करने के लिए की जरूरत नहीं है, के रूप में ni5ni6 @ ने सुझाव दिया है, तो आप कुछ पसंद है ... @RyanDawkins के लिए 2015-06-17 संपादित करें:

और यदि आप सोच रहे हैं कि पुनर्लेखन नियम कहां जाता है, तो यहां है web.config फ़ाइल में इसके स्थान का मानचित्र।

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <!-- rules go below --> 
     <rule name="Redirect Static Images" stopProcessing="true"> 
      <match url="^static/?(.*)$" /> 
      <action type="Redirect" url="https://stackoverflow.com/a/b/c/{R:1}" redirectType="Permanent" /> 
     </rule> 
     </rules> 
    </rewrite> 
    </system.webServer> 
</configuration> 
+0

मैं इस दृष्टिकोण पसंद करेंगे निम्न देखें रूप में अच्छी तरह के लिए TransferRequestHandler जोड़ने की जरूरत है। इसे पाइपलाइन पर ले जाना और आईआईएस कार्यकर्ता प्रक्रिया को रीडायरेक्ट को संभालने की अनुमति देना कताई चक्रों से वास्तव में रनटाइम के माध्यम से मार्ग को संसाधित करने से अधिक कुशल है, मुझे लगता है। यहां तक ​​कि यदि सर्वर पर मंथन की मात्रा समान है, तो भी मैं मार्गों का उपयोग न करने के मार्ग (पन इरादा) पर जाउंगा और रीडायरेक्ट को एप्लिकेशन के बाहर ही रखूंगा। –

+0

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

+0

(मेरी पिछली टिप्पणी हटा दी गई और इसे एक गैर-शॉर्ट यूआरएल के साथ दोबारा जोड़ा गया)। मार्टिन, निष्पादन के मुद्दों को एक तरफ, आप इस यूआरएल को एप्लिकेशन में क्यों संभालना चाहते हैं, जब इसे बाहर संभालना बेहतर होगा? मुझे लगता है कि आप एक नियंत्रक कार्रवाई कर सकते हैं जो इसे संभालता है, लेकिन यहां कुछ ऐसा है जो आप देख सकते हैं: - http://geekswithblogs.net/sankarsan/archive/2009/01/18/developing-custom-routehandler.aspx –

5

मैं आंतरिक StaticFileHandler का उपयोग करने के विकल्प के साथ आया था। IRouteHandler में मैं HttpServerUtility.Transfer फोन:

public class FileRouteHandler : IRouteHandler { 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) { 
    String fileName = (String) requestContext.RouteData.Values["file"]; 
    // Contrived example of mapping. 
    String routedPath = String.Format("https://stackoverflow.com/a/b/c/{0}", fileName); 
    HttpContext.Current.Server.Transfer(routedPath); 
    return null; // Never reached. 
    } 

} 

यह एक हैक है। IRouteHandler को IHttpHandler वापस करना है और वर्तमान अनुरोध को निरस्त और स्थानांतरित नहीं करना है। हालांकि, यह वास्तव में जो मैं चाहता हूं उसे प्राप्त करता है।

आंतरिक StaticFileHandler का उपयोग करना कुछ हद तक हैक है क्योंकि मुझे इसकी पहुंच प्राप्त करने के लिए प्रतिबिंब की आवश्यकता है, लेकिन कम से कम documentation on StaticFileHandler on MSDN इसे थोड़ा अधिक "आधिकारिक" वर्ग बना रहा है। दुर्भाग्यवश मुझे नहीं लगता कि आंशिक ट्रस्ट पर्यावरण में आंतरिक कक्षाओं पर प्रतिबिंबित करना संभव है।

मैं StaticFileHandler का उपयोग करने के लिए चिपकूँगा क्योंकि मुझे नहीं लगता कि यह भविष्य में एएसपी.नेट से हटा दिया जाएगा।

9

मैं एक ऐसी ही समस्या थी। मैं HttpContext.RewritePath का उपयोग कर समाप्त हो गया:

public class MyApplication : HttpApplication 
{ 
    private readonly Regex r = new Regex("^/static/(.*)$", RegexOptions.IgnoreCase); 

    public override void Init() 
    { 
     BeginRequest += OnBeginRequest; 
    } 

    protected void OnBeginRequest(object sender, EventArgs e) 
    { 
     var match = r.Match(Request.Url.AbsolutePath); 
     if (match.Success) 
     { 
      var fileName = match.Groups[1].Value; 
      Context.RewritePath(string.Format("https://stackoverflow.com/a/b/c/{0}", fileName)); 
     } 
    } 
} 
+1

जोड़ने का सबसे आसान तरीका यह साझा करने के लिए बहुत बहुत धन्यवाद। स्थानीय विकास के दौरान यूआरएल रिवाइट के लिए एक समाधान की तलाश में इस पर दौड़ें, और महसूस किया कि मैं इसके बजाय हर जगह ऐसा कर सकता हूं। मैं इसका उपयोग इनपुट पार्सिंग के लिए नहीं कर रहा हूं, लेकिन जेएस और सीएसएस फ़ाइल संस्करण प्रबंधन के लिए। –

+0

किसी भी दिलचस्पी के लिए, 'filename.v1234.js' फ़ॉर्म की फ़ाइलों को प्रबंधित करने के लिए, मैं 'निजी रीडोनली रेगेक्स regJS = नया रेगेक्स ("^(। *) ([।] V [0-9] का उपयोग कर रहा हूं +) ([।] (जेएस | सीएसएस)) $ ", RegexOptions.IgnoreCase); और फिर मैचों पर मैं' Context.RewritePath (string.Format ("{0} {1}", matchJS.Groups [1] ]। वैल्यू, matchJS.Groups [3]। वैल्यू)); ' –

3

आप से निपटने के अपने स्थिर files.Please, जवाब https://stackoverflow.com/a/21724783/22858

+0

संदर्भ के लिए, यह गैर-एमवीसी ऐप्स के लिए भी काम करता है। – Ian

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