55

私はWeb API を使用して ASP.NET MVC 内でAngularJSプロジェクトに取り組んできました。角度のあるルーティングされた URL に直接移動したり、ページを更新したりする場合を除いて、うまく機能します。サーバー構成をいじるよりも、 MVC のルーティング エンジンで処理できると考えました。

現在の 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" }
        );
    }
}

現在のルート構成:

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.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,
        };
    }
}

ゴール:

/api/* は引き続き WebAPI に移動し、 /partials/ 、および /assets/はすべてファイル システムに移動し、それ以外はすべて、私の Angular シングル ページ アプリである /index.html にルーティングされます。

- 編集 -

私はそれを機能させたようです。これをRouteConfig.csのBOTTOMに追加しました。

 routes.MapPageRoute("Default", "{*anything}", "~/index.html");

そして、ルート 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>

しかし、それはハックのようなにおいがします。これを行うより良い方法はありますか?

4

6 に答える 6

27

ワイルドカード セグメントを使用します。

routes.MapRoute(
    name: "Default",
    url: "{*anything}",
    defaults: new { controller = "Home", action = "Index" }
);
于 2013-10-28T19:10:58.330 に答える
5

私の場合、これらのアプローチはどれも機能しませんでした。私は2つのエラーメッセージ地獄で立ち往生しました. このタイプのページが提供されていないか、ある種の 404 のいずれかです。

URLの書き換えが機能しました:

<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>
    ...

.js .map などの URL を書き換えたくないので、[a-zA-Z] で一致したことに注意してください。

これはすぐに使用できる VS で機能しましたが、IIS では URL 書き換えモジュールをインストールする必要がある場合がありますhttps://www.iis.net/downloads/microsoft/url-rewrite

于 2016-10-04T20:15:15.787 に答える
0

さて、RouteConfig.RegisterRoutes(RouteTable.Routes);呼び出しを削除したところGlobal.asax.cs、入力した URL が何であれ、リソースが存在する場合はそれが提供されます。API ヘルプ ページも引き続き機能します。

于 2016-02-18T13:47:45.303 に答える