I have simple url rewriter:
private static void RedirectToAPI(RewriteContext context)
{
var request = context.HttpContext.Request;
if (request.Path.Value.StartsWith("/apiendpoint", StringComparison.OrdinalIgnoreCase))
{
var json = JsonConvert.SerializeObject(request.Path.Value
.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries)
.Skip(1));
var response = context.HttpContext.Response;
response.Headers[HeaderNames.Location] = $"/custom";
response.StatusCode = StatusCodes.Status301MovedPermanently;
context.Result = RuleResult.EndResponse;
using (var bodyWriter = new StreamWriter(response.Body))
{
bodyWriter.Write(json);
bodyWriter.Flush();
}
}
}
The problem is, when it redirects to /custom url, request has method GET, while this method require POST.
For example, send GET request to url /apiendpoint/first/second/third, then rewriter responds to redirect, accordingly, the following request must be with method POST, but now, it is GET.
How can I change method of request, which is after url rewriter response?
This is a sample code
You will have to add the Handler to Handler Pipeline as
config.MessageHandlers.Add(new ConvertGetToPostHandler());
Also, read over this documentation to get some insight into it's purpose and usage.
EDIT: Ah, just now checked the comments. If the initial request is a GET, then this won't work either and you can't tell the browser to POST. Not without returning a view that auto-executes a form with JavaScript.
You need to return a 308, not a 301.
Here is the changed code:
308 is a permanent redirect that requires the browser to preserve the method. https://httpstatuses.com/308
The temporary version is 307.
Convenience methods for these redirects are available in MVC Core 2.0.0-preview1.
Can you set @juunas answer as a correct answer, his answer solved it for me as you can see in my example code.