3

以下の解決にご協力いただければ幸いです。Alex Adamyan のブログASP.NET MVC ローカリゼーションへの追加 - ルーティングの使用で説明されている方法を使用して、カルチャ インジケーターをルートに追加するようにサイトをセットアップしました。1つの例外を除いて、うまく機能します。私のサイトは WebApi コントローラーを使用しており、 Upload というアクションを呼び出すと、リクエストは他のエラーなしで中止されます。問題は、リンク リクエストで、ローカリゼーション ルートがリクエストにカルチャ コードを前に追加して、URL が次のようになることです。

http://mysite/en/api/upload/021a6305-0e40-4a4a-a129-43c611aac371

API への呼び出しには、カルチャ コードが含まれていてはならず、次のようになっている必要があります。

http://mysite/api/upload/021a6305-0e40-4a4a-a129-43c611aac371

ルート マップを追加し、記事で説明されている SingleCultureRouteHandeler を使用して、これを排除しようとしました。

使用したルート マップ

routes.MapRoute(
         "WebApi",
         "api/{controller}/{id}",
         new { controller = "Upload", id = UrlParameter.Optional }
         ).RouteHandler = new SingleCultureMvcRouteHandler();

上記のルートをコントローラーの有無にかかわらず試しましたが、成功しませんでした。

ルート構成(何かが足りない場合に備えて)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Infrastructure.Routing;

namespace MySite.MVC
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                 "Default", // Route name
                 "{controller}/{action}/{id}", // URL with parameters
                 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

            routes.MapRoute(
                 "WebApi",
                 "api/{controller}/{id}",
                 new { id = UrlParameter.Optional }
             ).RouteHandler = new SingleCultureMvcRouteHandler();

            foreach (Route r in routes)
            {
                if (!(r.RouteHandler is SingleCultureMvcRouteHandler))
                {
                    r.RouteHandler = new MultiCultureMvcRouteHandler();
                    r.Url = "{culture}/" + r.Url;
                    //Adding default culture 
                    if (r.Defaults == null)
                    {
                        r.Defaults = new RouteValueDictionary();
                    }
                    r.Defaults.Add("culture", Culture.en.ToString());

                    //Adding constraint for culture param
                    if (r.Constraints == null)
                    {
                        r.Constraints = new RouteValueDictionary();
                    }
                    r.Constraints.Add("culture", new CultureConstraint(Culture.en.ToString(), Culture.es.ToString(), Culture.mn.ToString()));
                }
            }

        }

    }
}

事前にご協力いただきありがとうございます。

4

1 に答える 1