2015-07-02 17 views
8

मैं अपनी परियोजना को एएसपीएनईटी 5 में अपग्रेड कर रहा हूं। मेरा आवेदन एक कोणीय जेएस वेब ऐप है जो एचटीएमएल 5 यूआरएल रूटिंग (HTML5 History API) का उपयोग करता है।एएसपी.नेट 5 एचटीएमएल 5 इतिहास

मेरे पिछले ऐप्लिकेशन में मैं की तरह कोड के साथ URL पुनर्लेखन आईआईएस मॉड्यूल का इस्तेमाल किया:

<system.webServer> 
    <rewrite> 
    <rules> 
     <rule name="MainRule" stopProcessing="true"> 
     <match url=".*" /> 
     <conditions logicalGrouping="MatchAll"> 
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
      <add input="{REQUEST_URI}" matchType="Pattern" pattern="api/(.*)" negate="true" /> 
      <add input="{REQUEST_URI}" matchType="Pattern" pattern="signalr/(.*)" negate="true" /> 
     </conditions> 
     <action type="Rewrite" url="Default.cshtml" /> 
     </rule> 
    </rules> 
    </rewrite> 
<system.webServer> 

मुझे पता है मैं बंदरगाह इस सकता है लेकिन मैं अपने विंडोज़ निर्भरता कम करना चाहते हैं। मेरे पढ़ने से मुझे लगता है कि मुझे इसे पूरा करने के लिए एएसपी.नेट 5 मिडलवेयर का उपयोग करने में सक्षम होना चाहिए।

मुझे लगता है कि कोड ऐसा कुछ दिखाई देगा लेकिन मुझे लगता है कि मैं बहुत दूर हूं।

app.UseFileServer(new FileServerOptions 
{ 
    EnableDefaultFiles = true, 
    EnableDirectoryBrowsing = true 
}); 

app.Use(async (context, next) => 
{ 
    if (context.Request.Path.HasValue && context.Request.Path.Value.Contains("api")) 
    { 
     await next(); 
    } 
    else 
    { 
     var redirect = "http://" + context.Request.Host.Value;// + context.Request.Path.Value; 
     context.Response.Redirect(redirect); 
    } 
}); 

अनिवार्य रूप से, मैं कुछ भी है कि मार्ग /api या /signalr शामिल करना चाहते हूँ। एएसपीएनईटी 5 में इसे पूरा करने के सर्वोत्तम तरीके पर कोई सुझाव?

+0

हां, आप इसे 'मिडलवेयर' –

+0

के साथ प्राप्त कर सकते हैं यह दिखाने के लिए कि आप इसे कैसे पूरा कर सकते हैं? – amcdnl

+0

'गिटहब' पर बहुत सारे 'मिडलवेयर' नमूने हैं। एक मैंने लिखा: https://github.com/aguacongas/chatle/tree/dev/src/ChatLe.HttpUtility –

उत्तर

-1

एमवीसी में रूटिंग सुविधा का उपयोग क्यों नहीं करें? Startup.cs में विन्यस्त विधि में, आपको निम्न संशोधित कर सकते हैं:

 // inside Configure method in Startup.cs 
     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller}/{action}/{id?}", 
       defaults: new { controller = "Home", action = "Index" }); 

      // Uncomment the following line to add a route for porting Web API 2 controllers. 
      // routes.MapWebApiRoute("DefaultApi", "api/{controller}/{id?}"); 
     }); 
+0

एचटीएमएल 5 इतिहास के लिए काम नहीं करता है, आपको केवल संपत्ति/एपीआई रूट करने की ज़रूरत है अन्य सभी को इंडेक्स फाइल वापस करनी चाहिए । – amcdnl

4

आप सही रास्ते पर थे, बल्कि एक रीडायरेक्ट वापस भेजने की तुलना में, हम सिर्फ अनुरोध पर पथ के पुनर्लेखन के लिए चाहते हैं। निम्नलिखित कोड एएसपी.NET5 आरसी 1 के रूप में काम कर रहा है। यहाँ

app.UseIISPlatformHandler(); 

// This stuff should be routed to angular 
var angularRoutes = new[] {"/new", "/detail"}; 

app.Use(async (context, next) => 
{ 
    // If the request matches one of those paths, change it. 
    // This needs to happen before UseDefaultFiles. 
    if (context.Request.Path.HasValue && 
     null != 
     angularRoutes.FirstOrDefault(
     (ar) => context.Request.Path.Value.StartsWith(ar, StringComparison.OrdinalIgnoreCase))) 
    { 
     context.Request.Path = new PathString("/"); 
    } 

    await next(); 
}); 

app.UseDefaultFiles(); 
app.UseStaticFiles(); 
app.UseMvc(); 

एक मुद्दा आप विशेष रूप से अपने कोणीय मार्गों मिडलवेयर में (, आदि या उन्हें एक कॉन्फ़िग फ़ाइल में डाल) कोड करने के लिए होता है।

प्रारंभ में, मैं एक पाइप लाइन जहां के बाद UseDefaultFiles() और UseStaticFiles() कहा जाता है किया गया था बनाने की कोशिश की है, यह बाद से पथ की जाँच करेगा, और अगर पथ/api नहीं था, यह फिर से लिखने और इसे वापस भेजने के लिए (/ api के अलावा कुछ भी पहले से ही संभाला जाना चाहिए था)। हालांकि, मैं इसे काम करने के लिए कभी नहीं मिल सका।

+0

सर्वर पक्ष पर कोणीय मार्ग क्यों रखें, बेवकूफ है। सर्वर पर सभी एपीआई कॉल 'एपीआई' से शुरू होते हैं, जिसे आप आसानी से उपयोग कर सकते हैं। "सेट्स" ('api', request.Path) सेट करने के लिए गीलेर को निर्धारित करने के लिए "/" या नहीं, सही? – Elisabeth

+0

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

0

मैं उपयोग कर रहा हूँ:

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name:"Everything", 
     template:"{*UrlInfo}", 
     defaults:new {controller = "Home", action = "Index"}); 
} 

यह सभी मार्गों होम सूचकांक पृष्ठ हिट करने के लिए कारण होगा। जब मुझे इसके बाहर गिरने के लिए मार्गों की आवश्यकता होती है, तो मैं उन्हें इस मार्ग से पहले जोड़ता हूं क्योंकि यह एक मार्ग बन जाता है।