Dan*_* C. 7 asp.net globalization asp.net-web-api
基于这个问题(为多语言ASP.NET MVC Web应用程序设置CurrentCulture的最佳位置)我正在寻找一种全局的方法来为ASP.NET WebAPI做同样的事情.
我当前的ASP.NET MVC实现如下所示:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory(new CultureAwareControllerActivator()));
}
}
public class CultureAwareControllerActivator : System.Web.Mvc.IControllerActivator
{
public System.Web.Mvc.IController Create(System.Web.Routing.RequestContext requestContext, System.Type controllerType)
{
string cultureName = null;
// Attempt to read the culture cookie from Request
HttpCookie cultureCookie = requestContext.HttpContext.Request.Cookies["_culture"];
if (cultureCookie != null)
cultureName = cultureCookie.Value;
else
cultureName = requestContext.HttpContext.Request.UserLanguages != null && requestContext.HttpContext.Request.UserLanguages.Length > 0 ?
requestContext.HttpContext.Request.UserLanguages[0] : // obtain it from HTTP header AcceptLanguages
null;
// Validate culture name
cultureName = RoedingGmbh.Pis2Go.Web.Mvc.Helpers.CultureHelper.GetImplementedCulture(cultureName); // This is safe
// Modify current thread's cultures
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
// Currently the UI Language is only english
//Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
return DependencyResolver.Current.GetService(controllerType) as IController;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试执行与ASP.NET MVC相同的操作,但是下面的代码无法正常工作.
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
GlobalConfiguration.Configuration.Services.Replace(typeof(System.Web.Http.Dispatcher.IHttpControllerActivator), new CultureAwareHttpControllerActivator());
}
}
public class CultureAwareHttpControllerActivator : System.Web.Http.Dispatcher.IHttpControllerActivator
{
public System.Web.Http.Controllers.IHttpController Create(System.Net.Http.HttpRequestMessage request, System.Web.Http.Controllers.HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("DE-de");
return GlobalConfiguration.Configuration.DependencyResolver.GetService(controllerType) as System.Web.Http.Controllers.IHttpController;
}
}
Run Code Online (Sandbox Code Playgroud)
使用该代码,WebAPI再也找不到任何路由:(我有什么办法让它工作!
问候,丹尼尔
如果要对整个应用程序进行全局本地化,可以将set culture代码放入全局asax文件中HttpApplication的BeginRequest方法中.这将在每个请求的最前端设置您的文化,并将影响每个MVC和webapi请求.
| 归档时间: |
|
| 查看次数: |
8646 次 |
| 最近记录: |