在 Asp.Net Core 中使用 POST 方法重定向到 URL

Yur*_* N. 6 c# url redirect url-rewriting asp.net-core

我有简单的 url 重写器:

    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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是,当它重定向到/custom url 时,请求有方法 GET,而这个方法需要 POST。

比如发送 GET 请求到 url /apiendpoint/first/second/third,然后 rewriter 响应重定向,相应地,下面的请求必须是 POST 方法,但现在,它是 GET。

如何更改请求方法,即在 url 重写器响应之后?

juu*_*nas 2

编辑:啊,刚才查看了评论。如果初始请求是 GET,那么这也不起作用,并且您无法告诉浏览器进行 POST。并非没有返回一个使用 JavaScript 自动执行表单的视图。

您需要返回 308,而不是 301。

这是更改后的代码:

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 = 308;
        context.Result = RuleResult.EndResponse;
        using (var bodyWriter = new StreamWriter(response.Body))
        {
            bodyWriter.Write(json);
            bodyWriter.Flush();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

308是永久重定向,需要浏览器保留该方法。https://httpstatuses.com/308

临时版本是307。

MVC Core 2.0.0-preview1 中提供了这些重定向的便捷方法。