2

属性ルーティングを使用すると、あいまいなルートの問題が発生します。問題は、ルートのルートで変数パラメーターを使用することから生じます (私は信じています)。私を悩ませているのは、リテラルパラメーターが優先されていないようで、MVC5 が使用するルートを決定できないことです。

以前に他のルートでこれに出くわしたことがあり、コンベンションルートを定義することで修正できたと思いました. それを念頭に置いて、属性ルーティングのベスト プラクティスとあいまいさの解決に関する詳細情報はどこで見つけることができますか?

これが私が問題を抱えているコードと例外です。

「/」アプリケーションでサーバー エラーが発生しました。

URL に一致する複数のコントローラ タイプが見つかりました。これは、複数のコントローラーの属性ルートが要求された URL と一致する場合に発生する可能性があります。

要求は、次の一致するコントローラー タイプを検出しました:

アカウントコントローラー

ラウンドコントローラー

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidOperationException: URL に一致する複数のコントローラーの種類が見つかりました。これは、複数のコントローラーの属性ルートが要求された URL と一致する場合に発生する可能性があります。

要求は、次の一致するコントローラー タイプを検出しました:

アカウントコントローラー

ラウンドコントローラー

RouteConfig.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // I added this constraint resolver to resolve some other ambiguous routes that end
    // with a literal, but MVC5 wasn't able to determine whether to use those routes
    var constraintResolver = new System.Web.Mvc.Routing.DefaultInlineConstraintResolver();
    constraintResolver.ConstraintMap.Add("notWriteAction", typeof(IsNotWriteActionConstraint));

    routes.MapMvcAttributeRoutes(constraintResolver);

    // This is the convention route I added to resolve another ambiguous route.
    routes.MapRoute(
        name: "Account",
        url: "Account/{action}/{GroupName}/{AccessToken}",
        defaults: new { controller = "Account", action = "Login", GroupName = UrlParameter.Optional, AccessToken = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

RoundController.cs

public class RoundController : ControllerBase
{
    [Route("{groupid}/{campaignid}/{accesstoken}")]
    public async Task<ActionResult> TempRoundLink(string groupid, string campaignid, string accesstoken)
    {
    }
}

AccountController.cs

public class AccountController : ControllerBase
{
    [AllowAnonymous]
    [Route("Account/ResetPassword/{token}")]
    public async Task<ActionResult> ResetPassword(string token)
    {
    }
}
4

2 に答える 2

1

もっと長く書こうと思っていたのですが、時間がありませんでした。私が最終的に行った解決策は、Microsoft の属性ルーティング ライブラリへの呼び出しを取り除き、代わりにここにある「属性ルーティング」パッケージを使用することでした。http://htmlpreview.github.io/?https://github.com/mccalltd/AttributeRouting/blob/gh-pages/index.html

それは非常にうまく機能しており、 *Precedence プロパティは、元の質問で抱えていた問題を正確に解決します。

于 2014-04-10T22:22:51.447 に答える