Как получить RouteData из Uri, используя DefaultHttpContextC#

Место общения программистов C#
Ответить
Anonymous
 Как получить RouteData из Uri, используя DefaultHttpContext

Сообщение Anonymous »

Я переношу свой код из платформы .net4.8 в проект .net 8 MVC
Ранее мы использовали этот код для получения имени контроллера из 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;
}
}
Теперь мы не можем использовать HttpContextBase, HttpRequestBase, HttpRequestWrapper и RouteTable.Routes.GetRouteData(new RouteDataContext(uri)) для получения RouteData
Нужно помогите получить 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»