2014-12-01 7 views
11

मैं एक एसपीए बना रहा हूं जो एएसपी.Net वेबएपीआई के शीर्ष पर बैठता है। मैं इतिहास रूटिंग के लिए #/ के बजाय HTML5 इतिहास का उपयोग करने का इंतजार कर रहा हूं लेकिन गहरे लिंकिंग के लिए समस्या है, मुझे यह सुनिश्चित करना होगा कि / और /foo/bar सभी एक ही HTML फ़ाइल लौटाएं (और मेरा जेएस एसपीए का सही हिस्सा प्रस्तुत करेगा) ।ओविन कई मार्गों के लिए स्थिर फ़ाइल भेजें

मैं कई अलग-अलग यूआरएल के लिए एक ही HTML फ़ाइल को वापस करने के लिए ओविन/कटाना कैसे प्राप्त करूं?

+0

तो क्या आप चाहते हैं कि कोई भी सर्वर स्थिर फ़ाइल मिडलवेयर का उपयोग कर index.html की सेवा करने के लिए सर्वर को मार रहा हो? – khellang

+0

हाँ, कोई भी मार्ग (या कोई भी मार्ग मिलान '/ ऐप/* ')' index.html' फ़ाइल लौटाएगा। –

उत्तर

21

चीजों को सरल बनाने के लिए, जबकि अभी भी StaticFiles मिडलवेयर से सभी कैशिंग अच्छाई आदि रखते हुए, मैं सिर्फ अनुरोध पथ एक इनलाइन मिडलवेयर का उपयोग कर, इस

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

यह स्वागत सेवा करेंगे की तरह फिर से लिखने चाहते हैं /app/* पर कुछ भी पेज, जो हमेशा index.html की सेवा करेगा।

0

मुझे कोणीय जेएस का उपयोग करके एक समान समस्या का सामना करना पड़ा, और इस मुद्दे को हल करने के लिए थोड़ा अलग दृष्टिकोण का उपयोग किया।

हमने ओविन का उपयोग एसपीए (index.html) के प्रवेश बिंदु पर एक मार्ग को मैप करने के लिए किया था। यह आपको एसपीए तक पहुंचने और विभिन्न पृष्ठों पर नेविगेट करने की अनुमति देता है। हालांकि, अगर आपने कभी पृष्ठ को ताज़ा किया है तो आपको 404 मिलेंगे। अनिवार्य रूप से, एंगुलरजेएस की रूटिंग और ओविन/कटाना का मार्ग एक दूसरे के पैर की उंगलियों पर कदम उठा रहा था।

मैंने कस्टम प्रतिनिधिमंडल बनाने के द्वारा इस मुद्दे को हल किया। जब भी ओविन/कटाना अनुरोध से मेल खाने वाला मार्ग ढूंढने में असमर्थ होते हैं तो यह प्रतिनिधि हैंडलर का उपयोग किया जाता है (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; 
    } 
} 

रिटर्न index.html ऊपर टुकड़ा, स्पा के प्रवेश बिंदु, जब हम एक पृष्ठ अनुरोध मिलान खोजने में असमर्थ हैं।

आदेश में इस delegating हैंडलर का उपयोग करने के लिए आपको अपने HttpConfiguration में निम्न पंक्ति जोड़ना होगा() जब Owin मेजबान शुरू करने:

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

संक्षेप में, मैं एक डिफ़ॉल्ट रूट कि एसपीए के लिए नक्शे है, और कोई अपरिचित मार्ग DelegatingHandler के माध्यम से जाएगा और एक ही एसपीए की सेवा करेगा। हम Request.Path को संशोधित नहीं करते हैं, जिससे एसपीए उचित पृष्ठ पर अनुरोध को रूट करने की इजाजत देता है।

+0

यह कुछ हद तक काम करेगा लेकिन कई मामलों में, उत्पादन में ऐसे कार्यान्वयन का उपयोग करने की सलाह दी जाएगी। File.ReadAllText एन्कोडिंग (जो समस्याएं पैदा कर सकता है) को स्वत: पता लगाएगा और अन्य दृष्टिकोणों के रूप में उतना कुशल नहीं होगा। –

+0

आपके इनपुट के लिए धन्यवाद। तो क्या आप सुझाव देते हैं कि मैं स्वीकार किए गए उत्तर के समान समाधान का उपयोग करता हूं या क्या फ़ाइल.ReadAllText को पसंद किया गया है? – Justin

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