Я'вэ работал на автор проекта, внутри ASP.NET MVC с помощью веб-API. Он отлично работает за исключением при попытке перейти непосредственно к угловой маршрутизации URL-адрес или обновите страницу. А не баловался с настройки сервера, я думал, что это будет то, что я справлюсь с в MVC's двигатель маршрутизации.
Текущая WebAPIConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"^[0-9]+$" }
);
config.Routes.MapHttpRoute(
name: "ApiWithActionAndName",
routeTemplate: "api/{controller}/{action}/{name}",
defaults: null,
constraints: new { name = @"^[a-z]+$" }
);
config.Routes.MapHttpRoute(
name: "ApiWithAction",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = "Get" }
);
}
}
Текущая RouteConfig:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute(""); //Allow index.html to load
routes.IgnoreRoute("partials/*");
routes.IgnoreRoute("assets/*");
}
}
Нынешний Глобальный.эйсакс.в CS:
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
var formatters = GlobalConfiguration.Configuration.Formatters;
formatters.Remove(formatters.XmlFormatter);
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
PreserveReferencesHandling = PreserveReferencesHandling.None,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
};
}
}
Цель:
/по API/ продолжает идти в веб-API, /частичные/, и /активов/* все идут к файловой системе, абсолютно все остальное будет направлено в /index.html это мое угловые одном приложении страницы.
--Редактирование--
Мне кажется, это работает. Добавил его в дно RouteConfig.в CS:
routes.MapPageRoute("Default", "{*anything}", "~/index.html");
И это изменение в корень веб.конфиг:
<system.web>
...
<compilation debug="true" targetFramework="4.5.1">
<buildProviders>
...
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" /> <!-- Allows for routing everything to ~/index.html -->
...
</buildProviders>
</compilation>
...
</system.web>
Однако, это больше похоже на хак. Какой-нибудь лучший способ сделать это?
Использовать сегмент подстановки:
routes.MapRoute(
name: "Default",
url: "{*anything}",
defaults: new { controller = "Home", action = "Index" }
);
Предлагаю более ответственного подхода
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1"/>
<error statusCode="404" prefixLanguageFilePath="" path="/index.cshtml" responseMode="ExecuteURL"/>
</httpErrors>
</system.webServer>
в моем случае ни один из этих подходов не работал. я застрял в 2 сообщение об ошибке в ад. ни этого типа страница не служил или какой-то 404.
ЧПУ работал:
<system.webServer>
<rewrite>
<rules>
<rule name="AngularJS" stopProcessing="true">
<match url="[a-zA-Z]*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
...
заметьте, я обнаружила на [а-Яа-я], потому что я Дон'т хотите переписать любой из .Яш .карта и URL-адресов.
это работало в vs по окно, но в IIS может потребоваться установка URL-адреса переписать https://www.iis.net/downloads/microsoft/url-rewrite модуль
У меня был такой же подход как в ответы, но если кто-то делает вызов API неправильно, они'll итоге получаем, что индексная страница, а что-то более полезное.
Поэтому я'вэ обновлены мои такие, что оно вернется мой индекс страницы для любого запроса не начиная с /по API:
//Web Api
GlobalConfiguration.Configure(config =>
{
config.MapHttpAttributeRoutes();
});
//MVC
RouteTable.Routes.Ignore("api/{*anything}");
RouteTable.Routes.MapPageRoute("AnythingNonApi", "{*url}", "~/wwwroot/index.html");
Ну, я просто удалил RouteConfig.RegisterRoutes(Таблица.Маршруты);
призыв в мировой.эйсакс.в CS и теперь все URL-адреса, которые я ввожу, если ресурс существует, то он будет подан. Даже на страницах справки по API по-прежнему работает.