Подтвердить что ты не робот

Что такое ASP.NET Core MVC эквивалент Request.RequestURI?

Я нашел сообщение в блоге, в котором показано, как "подгонять" знакомые вещи, такие как HttpResponseMessage, обратно в ASP.NET Core MVC, но я хочу знать, что новый родной способ сделать то же самое, что и следующий код в методе REST Post в контроллере:

// POST audit/values
[HttpPost]
public System.Net.Http.HttpResponseMessage Post([FromBody]string value)
{
    var NewEntity = _repository.InsertFromString(value);

    var msg = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Created);
    msg.Headers.Location = new Uri(Request.RequestUri + NewEntity.ID.ToString());
    return msg;

}

В проекте ASP.NET Core MVC я не могу получить Request.RequestUri.

Я попытался проверить Request, и я смог сделать такую ​​функцию:

private string UriStr(HttpRequest Request)
{
    return Request.Scheme + "://" + Request.Host + Request.Path; // Request.Path has leading /
}

Итак, я мог бы написать UriStr(Request). Но я не уверен, что так. Я чувствую, что я взламываю свой путь и не использую это правильно.

A связанный вопрос для ранних неосновных версий ASP.NET MVC запрашивает, как получить базовый URL-адрес сайта.

4b9b3361

Ответ 1

Более чистый способ - использовать UriBuilder:

private static Uri GetUri(HttpRequest request)
{
    var builder = new UriBuilder();
    builder.Scheme = request.Scheme;
    builder.Host = request.Host.Value;
    builder.Path = request.Path;
    builder.Query = request.QueryString.ToUriComponent();
    return builder.Uri;
}

(не проверено, для этого кода может потребоваться несколько настроек)

Ответ 2

Лично я использую:

new Uri(request.GetDisplayUrl())

GetDisplayUrl - это метод расширения из следующего пространства имен: Microsoft.AspNetCore.Http.Extensions

Ответ 3

Вот рабочий код. Это основано на ответе @Thomas Levesque, который не работал хорошо, когда запрос отправлен из пользовательского порта.

public static class HttpRequestExtensions
{
    public static Uri ToUri(this HttpRequest request)
    {
        var hostComponents = request.Host.ToUriComponent().Split(':');

        var builder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = hostComponents[0],
            Path = request.Path,
            Query = request.QueryString.ToUriComponent()
        };

        if (hostComponents.Length == 2)
        {
            builder.Port = Convert.ToInt32(hostComponents[1]);
        }

        return builder.Uri;
    }
}