Ранее мы использовали этот код для получения имени контроллера из Uri
Код: Выделить всё
public class GetRouteDataContext : HttpContextBase
{
public override HttpRequestBase Request { get; }
private RouteDataContext(Uri uri)
{
var url = uri.GetLeftPart(UriPartial.Path);
var qs = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped);
Request = new HttpRequestWrapper(new HttpRequest(null, url, qs));
}
public static RouteValueDictionary RouteValuesFromUri(Uri uri)
{
return RouteTable.Routes.GetRouteData(new RouteDataContext(uri)).Values;
}
}
Нужно помогите получить RouteData альтернативным подходом. Я не уверен в написанном мной коде.
Я пытался получить значения маршрута из Uri с помощью EndpointDataSource в HttpContext
Код: Выделить всё
public class GetRouteDataContext
{
private static HttpContext _httpContext => new HttpContextAccessor().HttpContext;
public HttpContext HttpContext { get; }
// Constructor to initialize HttpContext from the given Uri
public GetRouteDataContext(Uri uri)
{
var qs = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped);
qs = !string.IsNullOrEmpty(qs) ? (qs.Contains('?') ? qs : "?" + qs) : qs;
HttpContext = new DefaultHttpContext
{
Request = {
Scheme = uri.Scheme,
Host = new HostString(uri.Host),
Path = new PathString(uri.AbsolutePath),
QueryString = new QueryString(qs)
},
};
}
public RouteValueDictionary RouteValuesFromUri(Uri uri)
{
var routeContext = new GetRouteDataContext(uri);
// Use HttpContext to get route data
var routeData = GetRouteData(routeContext.HttpContext);
return routeData?.Values ?? new RouteValueDictionary();
}
// Manually resolve route data using EndpointDataSource
private RouteData GetRouteData(HttpContext httpContext)
{
var endpointDataSource = _httpContext.RequestServices.GetRequiredService();
var routeContext = new RouteContext(httpContext);
foreach (var endpoint in endpointDataSource.Endpoints)
{
if (endpoint is RouteEndpoint routeEndpoint && routeEndpoint.RoutePattern != null)
{
var routeValues = routeEndpoint.RoutePattern.RequiredValues;
var meta = routeEndpoint.Metadata.GetMetadata();
string endpointUrl = string.Format("/{0}/{1}", meta.ControllerName, meta.ActionName);
if (httpContext.Request.Path.ToString().Contains(endpointUrl))
{
routeContext.RouteData.Values.Add("controller", routeValues["controller"]);
routeContext.RouteData.Values.Add("action", routeValues["action"]);
return routeContext.RouteData;
}
}
}
return null; // No matching route found
}
}
Примечание. Я новичок в ядре .net и переносе кода.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ttpcontext
Мобильная версия