【问题标题】:What is the ASP.NET Core MVC equivalent to Request.RequestURI?与 Request.RequestURI 等效的 ASP.NET Core MVC 是什么?
【发布时间】:2015-07-24 18:26:07
【问题描述】:

我发现了一个blog post,它展示了如何将 HttpResponseMessage 等熟悉的东西“填充”回 ASP.NET Core MVC,但我想知道在 REST 中执行与以下代码相同的操作的新本地方法是什么控制器中的发布方法:

// 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。

我尝试检查请求,并且能够创建这样的函数:

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

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

早期非核心 ASP.NET MVC 版本的related question 询问如何获取站点的基本 url。

【问题讨论】:

    标签: c# asp.net asp.net-core-mvc


    【解决方案1】:

    就个人而言,我使用:

    new Uri(request.GetDisplayUrl())
    
    • GetDisplayUrl 完全未转义的形式(QueryString 除外)
    • GetEncodedUrl - 适用于 HTTP 标头的完全转义形式

    这些是来自以下命名空间的扩展方法:Microsoft.AspNetCore.Http.Extensions

    【讨论】:

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

    更简洁的方法是使用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;
    }
    

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

    【讨论】:

    • 如果这是唯一的方法,那么他们在重新设计时确实遗漏了人们以前使用的功能?你还见过其他类似的遗漏吗?
    • @WarrenP 当然,他们留下了很多东西。它基本上是从头开始重写的。而且,它仍处于测试阶段。
    • Uris 还可能包含用户名和密码,在此 sn-p 中未说明。
    • 也不处理主机中的端口号。使用:builder.Host = request.Host.Host; builder.Port = request.Host.Port ?? -1;
    【解决方案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;
        }
    }
    

    【讨论】:

    • 注意 request.Path 属性。目前它似乎有一个错误,无论应用程序是否部署到虚拟应用程序,它总是返回“/”。
    • Uris 还可能包含用户名和密码,在此 sn-p 中未说明。
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 2019-02-12
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多