路由到 WebAPI 删除本地化
本文关键字:本地化 删除 WebAPI 路由 | 更新日期: 2023-09-27 18:30:27
非常感谢您帮助解决以下问题。我已经设置了我的网站,以使用 Alex Adamyan 的博客 MVC 本地化的补充 - 使用路由 ASP.NET 中所述的方法将文化指示器添加到路由中。除了一个例外,它工作得很好。我的网站使用 WebApi 控制器,当我调用名为"上载"的操作时,请求已中止,没有其他错误。问题是,在链接请求中,本地化路由在请求前面附加区域性代码,以便 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()));
}
}
}
}
}
提前感谢您的帮助。
首先,使用不同的URL来本地化API是一个坏主意。
您应该改用 AcceptLanguage 标头。本地化的 URL 适用于网站,但不适用于 API。如果你想进一步讨论这个问题,你可以找到大量的讨论。
routes.MapRoute(
"WebApi",
"api/{language}/{controller}/{id}",
new { controller = "Upload", id = UrlParameter.Optional }
).RouteHandler = new MultiCultureMvcRouteHandler();
但是关于您的路线:您没有在路线中定义文化部分。我认为永远使用一种单独的控制器可能有点矫枉过正,所以我会选择一个。