I am new to .NET Core and we make a client request from our middleware and I am wondering what is the right way to extract httprequestcontext
from httpcontext
and set it in HttpRequestMessage
.
.NET Framework has a method setrequestcontext()
to set request context in HttpRequestMessage
and I don't see similar method in .NET Core.
Any help would be appreciated.
middleware:
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
await next.Invoke(context).ConfigureAwait(false);
// create a HTTPMessageRequest from context.
HttpRequestMessage httpRequestMessage = context.CreateHttpRequestMessage();
// make a remote call.
}
public static HttpRequestMessage CreateHttpRequestMessage(this HttpContext context)
{
_ = context ?? throw new ArgumentNullException(nameof(context));
var request = context.Request;
var requestMessage = new HttpRequestMessage();
var requestMethod = request.Method;
if (!HttpMethods.IsGet(requestMethod) &&
!HttpMethods.IsHead(requestMethod) &&
!HttpMethods.IsDelete(requestMethod) &&
!HttpMethods.IsTrace(requestMethod))
{
var streamContent = new StreamContent(request.Body);
requestMessage.Content = streamContent;
}
requestMessage.RequestUri = new Uri(context.Request.GetDisplayUrl());
// Copy the request headers
foreach (var header in request.Headers)
{
if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()) && requestMessage.Content != null)
{
requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray());
}
}
requestMessage.Method = new HttpMethod(request.Method);
return requestMessage;
}