ブログ投稿 を見つけました。これは、HttpResponseMessageのような使い慣れたものをASP.NET Core MVCに「シム」する方法を示していますが、次のコードと同じことを行う新しいネイティブな方法を知りたいですREST Controllerの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バージョンの場合、サイトのベース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;
}
(テストされていないため、コードの調整が必要になる場合があります)
個人的に、私は使用します:
new Uri(request.GetDisplayUrl())
GetDisplayUrlは、次の名前空間の拡張メソッドです:Microsoft.AspNetCore.Http.Extensions
これが動作するコードです。これは@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;
}
}