ASP.NET 核心 MVC 等同于 Request.RequestURI 是什么?
What is the ASP.NET Core MVC equivalent to Request.RequestURI?
我找到了一个 blog post 展示了如何 "shim" 熟悉的东西,比如 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 核心 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 问如何获取站点的基础 url。
更简洁的方法是使用 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;
}
(未测试,代码可能需要一些调整)
这是一个工作代码。这是基于@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;
}
}
就个人而言,我使用:
new Uri(request.GetDisplayUrl())
GetDisplayUrl
完全 un-escaped 形式(QueryString 除外)
GetEncodedUrl
- 适用于 HTTP headers 的完全转义形式
这些是来自以下命名空间的扩展方法:Microsoft.AspNetCore.Http.Extensions
我找到了一个 blog post 展示了如何 "shim" 熟悉的东西,比如 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 核心 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 问如何获取站点的基础 url。
更简洁的方法是使用 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;
}
(未测试,代码可能需要一些调整)
这是一个工作代码。这是基于@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;
}
}
就个人而言,我使用:
new Uri(request.GetDisplayUrl())
GetDisplayUrl
完全 un-escaped 形式(QueryString 除外)GetEncodedUrl
- 适用于 HTTP headers 的完全转义形式
这些是来自以下命名空间的扩展方法:Microsoft.AspNetCore.Http.Extensions