什么是ASP.NET Core MVC等同于Request.RequestURI?

War*_* P 33 c# asp.net asp.net-core-mvc

我发现了一篇博文,展示了如何将熟悉的东西(如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;

}
Run Code Online (Sandbox Code Playgroud)

在ASP.NET Core MVC项目中,我似乎无法获得Request.RequestUri.

我尝试检查Request,我能够创建这样的函数:

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

所以我可以改写UriStr(Request).但我不确定这是对的.我觉得我正在乱砍,并没有正确使用它.

早期非核心ASP.NET MVC版本的相关问题询问如何获取站点的基本URL.

t.o*_*vre 62

就个人而言,我使用:

new Uri(request.GetDisplayUrl())
Run Code Online (Sandbox Code Playgroud)

GetDisplayUrl是以下命名空间中的扩展方法:Microsoft.AspNetCore.Http.Extensions

  • 编写完所有内容之后,我现在看到在同一包中还有一个更合适的方法:GetEncodedUrl。 (3认同)
  • 这当然看起来更干净,并且更有可能处理自制解决方案可能忽略的边缘情况。然而,有一件事情对我来说是一个危险信号。它的目的只是为了展示。来自评论: > 以完全未转义的形式返回请求 URL 的组合组件 >(QueryString 除外)仅适合显示。此格式不应 > 用于 HTTP 标头或其他 HTTP 操作。我不知道有什么特定于显示的功能,但它可能无法很好地与 Uri 构造函数配合使用。 (2认同)

Tho*_*que 18

更简洁的方法是使用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;
}
Run Code Online (Sandbox Code Playgroud)

(未经测试,代码可能需要一些调整)

  • 也不处理主机中的端口号。使用:`builder.Host = request.Host.Host; builder.Port = request.Host.Port ?? -1;` (4认同)
  • Uris 还可能包含用户名和密码,在此代码段中未考虑这些内容。 (2认同)

Dea*_*ane 12

这是一个有效的代码.这是基于@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Uris 还可能包含用户名和密码,在此代码段中未考虑这些内容。 (2认同)