【问题标题】:Routing to WebApi Remove Localization路由到 WebApi 删除本地化
【发布时间】:2013-09-07 15:26:40
【问题描述】:

非常感谢您帮助解决以下问题。我已经使用 Alex Adamyan 的博客 Addition to ASP.NET MVC Localization - Using routing 中描述的方法设置了我的站点以将文化指示器添加到路线中。它工作得很好,但有一个例外。我的网站使用 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()));
                }
            }

        }

    }
}

提前感谢您的帮助。

【问题讨论】:

    标签: c# asp.net-mvc-4 asp.net-web-api globalization


    【解决方案1】:

    首先,使用不同的 URL 来本地化 API 是个坏主意。
    您应该改用 AcceptLanguage 标头。 本地化 URL 适用于网站,但不适用于 API。如果您想进一步讨论,可以找到大量关于此的讨论。

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

    但是关于您的路线:您没有在路线中定义文化部分。我认为永久语言的单独控制器可能有点矫枉过正,所以我会选择一个。

    【讨论】:

    • 我同意 api 的路由不应本地化。那么我如何为 api 提供这种方式,并且仍然在网站的其余部分使用 url 中的本地化?
    • 正如我所说,对于 API,您只需使用 AcceptLanguage Header。所以 API 的调用者可以在那里设置他的语言。对于网站的其他部分,mysite/en/page 很好。
    • 好的,抱歉,明天早上再试一试。
    猜你喜欢
    • 2023-03-04
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多