7

की RC1 ASP.NET कोर 1.0 के MVC 6 के साथ आप जब app.UseMvc लागू अपने Startup.Configure समारोह के भीतर से मार्गों मैप कर सकते हैं। मैं एक "स्पा-फ़ॉलबैक" मार्ग कि यह सुनिश्चित करेंगे मैप किया गया है कि HomeController और Index दृश्य चूक तो की तरह हैं:MVC 6 रूटिंग, स्पा फ़ॉलबैक + 404 त्रुटि पृष्ठ

public void Configure(IApplicationBuilder app, 
         IHostingEnvironment env, 
         ILoggerFactory loggerFactory) 
{ 
    // ... omitted for brevity 
    app.UseExceptionHandler("/Home/Error"); 
    app.UseStatusCodePagesWithRedirects("/Home/Error/{0}"); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); 
     routes.MapRoute("spa-fallback", "{*anything}", new { controller = "Home", action = "Index" }); 
     routes.MapWebApiRoute("defaultApi", "api/{controller}/{id?}"); 
    }); 
} 

मैं वापस आने की इच्छा तो यह है कि मेरी Angular2 एप्लिकेशन के मार्गों एक HTTP का कारण नहीं बनेगा 404 का स्टेटस कोड, नहीं मिला। लेकिन जब भी उपयोगकर्ता अनजाने में उस पृष्ठ दृश्य पर नेविगेट करने का प्रयास करता है जो मौजूद नहीं है, तो मुझे सही तरीके से संभालने की भी आवश्यकता है। आप देख सकते हैं कि मैंने app.UseStatusCodePagesWithRedirects("/Home/Error/{0}"); भी कहा है।

कॉल स्थिति कोड और "स्पा-फ़ॉलबैक" मार्ग के साथ अपने त्रुटि पृष्ठ पर रीडायरेक्ट करने के लिए पारस्परिक रूप से विशिष्ट लगता है - जिसका अर्थ है ऐसा लगता है कि मैं केवल एक या दूसरे (लेकिन दुर्भाग्य से नहीं दोनों) हो सकता है। क्या किसी को पता है कि मैं दोनों दुनिया के सर्वश्रेष्ठ कैसे प्रबंधित कर सकता हूं?

+0

वर्तमान में नया पैकेज "Microsoft.AspNetCore.SpaServices" में पाया जा सकता है: "1.0.0-बीटा -000005"। –

+0

@SamanAhmadi, मैंने देखा कि ...धन्यवाद –

+0

@ डेविडपिन क्या आप स्वीकृत उत्तर को बदलने पर विचार करेंगे? मेरी सड़क क्रेडिट बनाने की कोशिश कर रहा है ;-) –

उत्तर

12

मुझे यह पता लगाने में कुछ समय लगा कि एमवीसी का उपयोग करके मेरी अनुक्रमणिका के बिना इसे कैसे किया जाए और अभी भी लापता फाइलों के लिए 404 प्राप्त करें।

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     app.UseDefaultFiles(); 
     app.UseStaticFiles(); 

     app.UseMvc(    
      routes => { 
       routes.MapRoute(
        name: "api", 
        template: "api/{controller}/{action}/{id?}"); 

       // ## commented out since I don't want to use MVC to serve my index.  
       // routes.MapRoute(
       //  name:"spa-fallback", 
       //  template: "{*anything}", 
       //  defaults: new { controller = "Home", action = "Index" }); 
     }); 

     // ## this serves my index.html from the wwwroot folder when 
     // ## a route not containing a file extension is not handled by MVC. 
     // ## If the route contains a ".", a 404 will be returned instead. 
     app.MapWhen(context => context.Response.StatusCode == 404 && 
           !Path.HasExtension(context.Request.Path.Value), 
        branch => { 
          branch.Use((context, next) => { 
           context.Request.Path = new PathString("/index.html"); 
           Console.WriteLine("Path changed to:" + context.Request.Path.Value); 
           return next();}); 

        branch.UseStaticFiles(); 
     });    
    } 
+0

इस पर ध्यान देने के लिए धन्यवाद, मुझे अपना प्रश्न अपडेट करना चाहिए था या इसे पहले हटा दिया जाना चाहिए था - क्योंकि मैंने पहले ही इस तथ्य के बाद इसे समझ लिया था। –

+0

यह समाधान अच्छा है क्योंकि इसे एमवीसी रखने की आवश्यकता नहीं है। मैं वर्तमान में एक स्थिर फ़ाइल सर्वर (कोई एमवीसी) के रूप में ASP.NET का उपयोग कर रहा हूं, लेकिन मैं 'index.html' पर गैर संपत्ति पथ को फिर से शुरू करने में सक्षम होना चाहता हूं। –

+1

अच्छा जवाब मैं जब विधेय के लिए थोड़ा बेहतर कोड का उपयोग करना चाहिये: 'संदर्भ => context.Response.StatusCode == 404 && Path.HasExtension (context.Request.Path.Value)' –

3

मैं दो संभावित समाधानों/समाधान के साथ आया था: यहाँ मेरी http पाइपलाइन है।

ASP.NET कोर 1.0, RC1

Angular2 के साथ विशेष रूप से, हम बस बाहर LocationStrategy स्वैप कर सकते हैं।

import {provide} from "angular2/core"; 
import {bootstrap} from "angular2/platform/browser"; 
import {LocationStrategy, HashLocationStrategy, ROUTER_PROVIDERS} from "angular2/router"; 
import {HTTP_PROVIDERS} from "angular2/http"; 

import {AppComponent} from "./app.component" 

bootstrap(AppComponent, 
    [ 
     ROUTER_PROVIDERS, 
     HTTP_PROVIDERS, 
     provide(LocationStrategy, { useClass: HashLocationStrategy }) 
    ]); 

ध्यान दें कि मैं मानक LocationStrategyHashLocationStrategy से ओवरराइड करना provide समारोह का उपयोग कर रहा हूँ: मेरे wwwroot/app/boot.ts में उदाहरण के लिए मैं निम्नलिखित है। इस URL में # कहते हैं और गलत तरीके से 404 के फेंकने से MVC से बचाता है, लेकिन यह भी सही ढंग से 404 के साथ जवाब हैंडल जब उपयोगकर्ता मैन्युअल रूप से एक यूआरएल में प्रकार है कि मौजूद नहीं है।

ASP.NET कोर 1.0, RC2

सीधे शब्दों में Microsoft.AspNet.NodeServices का उपयोग करें। इस पुस्तकालय के भीतर AngularServices और ReactServices दोनों हैं जो विशेष रूप से MapSpaFallbackRoute फ़ंक्शन के माध्यम से एसपीए मार्गों के मानचित्रण की अनुमति देते हैं। मैं बताता हूं कि हमें आरसी 2 के लिए यह समझने की आवश्यकता है कि मौजूदा कार्यान्वयन वांछित रूप से पूरी तरह से काम नहीं कर रहे हैं। सभी अनुरोधों कि मार्गों पहले निर्धारित किसी भी मेल नहीं खाती पकड़ेगा

public void Configure(IApplicationBuilder app, 
    IHostingEnvironment env, 
    ILoggerFactory loggerFactory) 
{ 
    app.UseExceptionHandler("/Home/Error"); 
    app.UseStatusCodePagesWithRedirects("/Home/Error/{0}"); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); 
     routes.MapWebApiRoute("defaultApi", "api/{controller}/{id?}"); 
    }); 

    app.Run(async context => 
    { 
     context.Response.Redirect("/Home/Index"); 
     await Task.CompletedTask; 
    }); 
} 

app.Run():

+0

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

0

इस प्रयास करें। इस तरह आप अपने कस्टम स्पा फॉलबैक प्राप्त कर सकते हैं और एक ही समय में app.UseStatusCodePagesWithRedirects() का उपयोग कर सकते हैं।

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