I've telah bekerja pada sebuah AngularJS proyek, dalam ASP.NET MVC menggunakan Web API. Ia bekerja besar kecuali ketika anda mencoba untuk pergi langsung ke sudut diarahkan URL atau me-refresh halaman. Daripada monkeying dengan server config, saya pikir ini akan menjadi sesuatu yang saya bisa menangani dengan MVC's routing engine.
Saat Ini 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" }
);
}
}
Saat Ini 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/*");
}
}
Global Saat Ini.asax.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,
};
}
}
TUJUAN:
/api/ terus pergi ke WebAPI /parsial/, dan /aset/* semua pergi ke file sistem, benar-benar sesuatu yang lain akan diteruskan ke /index.html yang saya Sudut halaman aplikasi.
--EDIT--
Saya tampaknya telah mendapatkan itu bekerja. Menambahkan ini ke BAWAH RouteConfig.cs:
routes.MapPageRoute("Default", "{*anything}", "~/index.html");
Dan perubahan ini ke root web.config:
<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>
Namun, baunya seperti hack. Ada cara yang lebih baik untuk melakukan hal ini?
Menyarankan pendekatan yang lebih asli
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1"/>
<error statusCode="404" prefixLanguageFilePath="" path="/index.cshtml" responseMode="ExecuteURL"/>
</httpErrors>
</system.webServer>
dalam kasus saya, tak satu pun dari pendekatan ini bekerja. aku terjebak dalam 2 pesan kesalahan neraka. baik ini jenis halaman yang tidak dilayani atau semacam 404.
url rewrite bekerja:
<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>
...
melihat saya cocok pada [a-zA-Z] karena aku don't ingin menulis ulang setiap .js .peta dll url.
ini bekerja di LEBIH dari hte kotak, tapi di IIS anda mungkin perlu menginstal url-rewrite modul https://www.iis.net/downloads/microsoft/url-rewrite
Saya punya pendekatan yang sama seperti atas beberapa jawaban, tetapi sisi negatifnya adalah jika seseorang membuat panggilan API tidak benar, mereka'll akhirnya mendapatkan bahwa halaman indeks kembali bukan sesuatu yang lebih berguna.
Jadi saya've diperbarui tambang tersebut bahwa ia akan kembali saya halaman indeks untuk setiap permintaan tidak dimulai dengan /api:
//Web Api
GlobalConfiguration.Configure(config =>
{
config.MapHttpAttributeRoutes();
});
//MVC
RouteTable.Routes.Ignore("api/{*anything}");
RouteTable.Routes.MapPageRoute("AnythingNonApi", "{*url}", "~/wwwroot/index.html");
Yah, aku hanya dihapus RouteConfig.RegisterRoutes(RouteTable.Rute);
memanggil Global.asax.cs
dan sekarang dengan url yang saya masukkan, jika sumber daya yang ada, maka akan dilayani. Bahkan API Halaman Bantuan masih bekerja.