Javascript 移除#!来自ASP.Net Web API中的angular.js URL

Javascript 移除#!来自ASP.Net Web API中的angular.js URL,javascript,angularjs,asp.net-web-api,hashbang,Javascript,Angularjs,Asp.net Web Api,Hashbang,所以我正试图移除#!在我的网站和过渡到html5。我看过其他指南,并在索引文件中使用locationProvider和base实现了它们。当您通过ng href指向链接时,该站点运行良好,但当我按“刷新/直接输入url”时,会出现404错误。我读到的这篇文章与服务器端有关,在服务器端,当404被击中时,它不知道路由到哪里,因为.otherwise()是一个hashbang函数 话虽如此,我查看了WebApi配置,发现如果要点击404,我已经指示了一个默认routeTemplate,如下所示 //

所以我正试图移除#!在我的网站和过渡到html5。我看过其他指南,并在索引文件中使用locationProvider和base实现了它们。当您通过ng href指向链接时,该站点运行良好,但当我按“刷新/直接输入url”时,会出现404错误。我读到的这篇文章与服务器端有关,在服务器端,当404被击中时,它不知道路由到哪里,因为.otherwise()是一个hashbang函数

话虽如此,我查看了WebApi配置,发现如果要点击404,我已经指示了一个默认routeTemplate,如下所示

// Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
var jsonFormatter=config.Formatters.OfType().First();
jsonFormatter.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver();

任何帮助都将不胜感激

为您的项目添加配置,以启用HTML5模式并删除前缀

.config(['$locationProvider', function($locationProvider) {
    $locationProvider.hashPrefix(''); // by default '!'
     $locationProvider.html5Mode({
         enabled: true
     });
}]);

向项目中添加配置以启用HTML5模式并删除前缀

.config(['$locationProvider', function($locationProvider) {
    $locationProvider.hashPrefix(''); // by default '!'
     $locationProvider.html5Mode({
         enabled: true
     });
}]);

正如您正确提到的,问题在于服务器端。刷新浏览器时,AngularJS路由不会生效。相反,浏览器会向服务器发出请求。服务器在所需位置找不到任何东西,因此返回404

您在问题中发布的当前服务器端路由只处理对web api的请求

除了WebAPI路由之外,您还必须添加一个mvc路由来交付起始页

假设您的起始页是index.html,将以下路由添加到服务器端路由配置中

//MVC
RouteTable.Routes.Ignore("api/{*url}"); // ignore api routes for mvc
RouteTable.Routes.MapPageRoute("NonAPIRoute", "{*url}", "~/index.html");
如果您已经有了MVC路由(例如在App_Start文件夹中的RouteConfig类中),那么您的RouteConfig类应该与此类似

using System.Web.Mvc;
using System.Web.Routing;

namespace WebApplication1
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.IgnoreRoute("api/{*pathInfo}"); // ignore api routes 
            routes.MapPageRoute("NonAPIRoute", "{*url}", "~/index.html");
        }
    }
}

正如您正确提到的,问题在于服务器端。刷新浏览器时,AngularJS路由不会生效。相反,浏览器会向服务器发出请求。服务器在所需位置找不到任何东西,因此返回404

您在问题中发布的当前服务器端路由只处理对web api的请求

除了WebAPI路由之外,您还必须添加一个mvc路由来交付起始页

假设您的起始页是index.html,将以下路由添加到服务器端路由配置中

//MVC
RouteTable.Routes.Ignore("api/{*url}"); // ignore api routes for mvc
RouteTable.Routes.MapPageRoute("NonAPIRoute", "{*url}", "~/index.html");
如果您已经有了MVC路由(例如在App_Start文件夹中的RouteConfig类中),那么您的RouteConfig类应该与此类似

using System.Web.Mvc;
using System.Web.Routing;

namespace WebApplication1
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.IgnoreRoute("api/{*pathInfo}"); // ignore api routes 
            routes.MapPageRoute("NonAPIRoute", "{*url}", "~/index.html");
        }
    }
}

是的,我已经做过了。如前所述,这很好,但当你通过输入url按下刷新页面/重定向时,它会给你一个404错误。是的,我已经这样做了。如前所述,这可以正常工作,但当您通过输入url按下刷新页面/重定向时,会出现404错误。您是说我需要在提供mapHttpRoute行之前添加此ignoreRoute<代码>config.Routes.IgnoreRoute(routeName:“DefaultApi”,routeTemplate:“api/{controller}/{id}”);//忽略mvc的api路由mvc路由用于响应文本/html请求的常规get请求。WebAPI服务于数据,MVC服务于页面。这就是为什么您需要mvc路由的原因。另一种选择是编写一个API控制器,它只返回index.html的内容,内容类型为text/html。或者,您可以尝试在iis配置中重写url。因此,在本例中,这将是asp.net mvc和webapi的混合,专门用于路由情况。这是正确的。如果您的web应用程序中还没有MVC,您可以尝试如本问题中所述重写IIS URL。这假设您正在IISI中托管web API。SI创建了一个讨论,试图找出如何实现这一点。我在将routeConfig文件输入API后遇到了问题。我认为问题在于我已经将我的项目分为3个独立的项目前端和后端,这导致~/index.html路径有所不同。我该如何解决这个问题?你是说我需要在提供mapHttpRoute线路之前添加此ignoreRoute<代码>config.Routes.IgnoreRoute(routeName:“DefaultApi”,routeTemplate:“api/{controller}/{id}”);//忽略mvc的api路由mvc路由用于响应文本/html请求的常规get请求。WebAPI服务于数据,MVC服务于页面。这就是为什么您需要mvc路由的原因。另一种选择是编写一个API控制器,它只返回index.html的内容,内容类型为text/html。或者,您可以尝试在iis配置中重写url。因此,在本例中,这将是asp.net mvc和webapi的混合,专门用于路由情况。这是正确的。如果您的web应用程序中还没有MVC,您可以尝试如本问题中所述重写IIS URL。这假设您正在IISI中托管web API。SI创建了一个讨论,试图找出如何实现这一点。我在将routeConfig文件输入API后遇到了问题。我认为问题在于我已经将我的项目分为3个独立的项目前端和后端,这导致~/index.html路径有所不同。我该怎么解决这个问题?