与Request.RequestURI等效的ASP.NET Core MVC是什么?

时间:2015-07-24 18:26:08

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

我发现blog post显示了如何" shim"像HttpResponseMessage这样熟悉的东西回到ASP.NET Core MVC中,但是我想知道在Controller中的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)代替。但我不确定是对的。我觉得我一直在瞎逛,而不是正确使用它。

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

3 个答案:

答案 0 :(得分:47)

就个人而言,我使用:

new Uri(request.GetDisplayUrl())

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

答案 1 :(得分:15)

更简洁的方法是使用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 :(得分:11)

这是一个有效的代码。这是基于@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;
    }
}