2016-07-21 2 views
19

저는 새로운 Asp.Net 코어 mvc 응용 프로그램에서 wokring입니다. URL에서 현재 앱 문화를 설정하는 맞춤 제약 조건이있는 경로를 정의했습니다. I는 다음과 같습니다 사용자 정의 IRequestCultureProvider을 만들어 내 응용 프로그램에 대한 현지화를 관리하기 위해 노력하고있어 :Asp.Net 코어 URL에서 RouteData 값을 가져옵니다

public class MyCustomRequestCultureProvider : IRequestCultureProvider 
    { 
     public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext) 
     { 
      var language= httpContext.GetRouteValue("language"); 

      var result = new ProviderCultureResult(language, language); 
      return Task.FromResult(result); 
     } 
    } 

MyCustomRequestCultureProvider 괜찮 모든 요청에 ​​맞았다. 내 문제는 MVC 파이프 라인에서 내 공급자의 DetermineProviderCultureResult 메서드가 라우팅 프로세스 전에 충돌하므로 httpContext.GetRouteValue("language")은 항상 null을 반환합니다. MVC의 이전 버전에서

, 나는 내가 새로운 framewrok 오른쪽에 같은 일을 할 수있는 방법을 찾을 수 없습니다 수동으로

var wrapper = new HttpContextWrapper(HttpContext.Current); 
var routeData = RouteTable.Routes.GetRouteData(wrapper); 
var language = routeData.GetValue("language") 

를 수행하여 라우팅 과정을 통해 내 URL을 처리 할 수있는 possiblity가 있었다 지금. 또한 언어 데이터를 사용하여 언어를 찾아 내 URL 문자열을 일부 문자열 함수로 분석하여 언어를 찾을 수 없습니다.

+0

이 [질문과 대답] (http://stackoverflow.com/questions/35829426/optionally-override-request-culture-via-url-route-in을 정의 -an-asp-net-core-1-0-applica/35970676 # 35970676) 도움이 될 수 있습니다. –

+0

@nboisvert이 문제를 해결할 수 있습니까? – SherleyDev

+0

@SherleyDev 내 대답을 참조하십시오 –

답변

7

쉬운 방법은 없지만 ASP.Net 팀은이 기능을 아직 구현하지 않았습니다. IRoutingFeature은 MVC가 요청을 완료 한 후에 만 ​​사용할 수 있습니다.

나는 당신을 위해 일해야하는 해결책을 함께 집어 넣을 수있었습니다. 이렇게하면 UseMvc()으로 전달되는 경로와 IRoutingFeature를 채우기 위해 모든 속성 라우팅이 설정됩니다. 완료되면 httpContext.GetRouteValue("language");을 통해 수업에 액세스 할 수 있습니다.

:

private readonly Action<IRouteBuilder> GetRoutes = 
    routes => 
    { 
     routes.MapRoute(
      name: "custom", 
      template: "{language=fr-FR}/{controller=Home}/{action=Index}/{id?}"); 

     routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }; 

새로운 미들웨어를 추가 Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    // setup routes 
    app.UseGetRoutesMiddleware(GetRoutes); 

    // add localization 
    var requestLocalizationOptions = new RequestLocalizationOptions 
    { 
     DefaultRequestCulture = new RequestCulture("en-US") 
    }; 
    requestLocalizationOptions.RequestCultureProviders.Clear(); 
    requestLocalizationOptions.RequestCultureProviders.Add(
     new MyCustomRequestCultureProvider() 
    ); 
    app.UseRequestLocalization(requestLocalizationOptions); 

    // add mvc 
    app.UseMvc(GetRoutes); 
} 

는 (재 사용성에 대한) 대리자에 경로, 같은 파일/클래스를 이전

public static class GetRoutesMiddlewareExtensions { public static IApplicationBuilder UseGetRoutesMiddleware(this IApplicationBuilder app, Action<IRouteBuilder> configureRoutes) { if (app == null) { throw new ArgumentNullException(nameof(app)); } var routes = new RouteBuilder(app) { DefaultHandler = app.ApplicationServices.GetRequiredService<MvcRouteHandler>(), }; configureRoutes(routes); routes.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute(app.ApplicationServices)); var router = routes.Build(); return app.UseMiddleware<GetRoutesMiddleware>(router); } } public class GetRoutesMiddleware { private readonly RequestDelegate next; private readonly IRouter _router; public GetRoutesMiddleware(RequestDelegate next, IRouter router) { this.next = next; _router = router; } public async Task Invoke(HttpContext httpContext) { var context = new RouteContext(httpContext); context.RouteData.Routers.Add(_router); await _router.RouteAsync(context); if (context.Handler != null) { httpContext.Features[typeof (IRoutingFeature)] = new RoutingFeature() { RouteData = context.RouteData, }; } // proceed to next... await next(httpContext); } } 

O뿐만 아니라이 클래스 ...

public class RoutingFeature : IRoutingFeature 
{ 
    public RouteData RouteData { get; set; } 
} 
+0

이것은 나를 위해 잘 작동, 나는 ge에 필요했습니다 – Ben

+0

와우는 5 분 동안 코멘트를 편집 할 수 있다는 것은 고통입니다! 이것이 제가 말하고자했던 것입니다 : 저는 다른 미들웨어에서 매개 변수에 액세스해야했습니다. 그리고 이것은 거의 수정하지 않고 저에게 일을 해주었습니다! 5 * 다시 사용 – Ben

관련 문제