Response.Redirect 在自定义 HttpModule 中使用 POST 方法
Posted
技术标签:
【中文标题】Response.Redirect 在自定义 HttpModule 中使用 POST 方法【英文标题】:Response.Redirect with POST method in custom HttpModule 【发布时间】:2019-11-18 09:28:27 【问题描述】:我有一个带有 web.api 的 asp.net 网站(“/v”),它基于请求中的 cookie 必须重定向到另一个站点(“/v2”)。
所以如果有cookie,请求必须重定向到“/v2/api...”,如果没有cookie,请求必须继续到“/v/api/...”
所以我实现了一个自定义 HttpModule 来完成重定向请求的任务,但即使请求是 POST 方法,重定向也始终使用 GET。
如何用正确的方法重定向请求?
下面的示例代码。
提前致谢
using System;
using System.Web;
using System.Linq;
namespace Sample
public class VersionModule : IHttpModule
public void Init(HttpApplication context)
context.BeginRequest += OnContextBeginRequest;
private void OnContextBeginRequest(object sender, EventArgs e)
try
HttpApplication app = (HttpApplication)sender;
if (app.Context.Request.Cookies.AllKeys.Contains("version"))
string newUrl = @"https://sample.com/v";
var cookie = app.Context.Request.Cookies.Get("version");
if (!string.IsNullOrEmpty(cookie.Value))
if (cookie.Value == "2")
newUrl += "2";
string parameters = app.Context.Request.Url.PathAndQuery.Replace("v/", "");
newUrl = newUrl + parameters;
// this call alway a GET!! I need a POST method!
app.Context.Response.Redirect(newUrl, true);
catch (Exception ex)
public void Dispose()
【问题讨论】:
您无法重定向 POST。您可以返回一个将数据发布到其他网站的插页式页面,或者您的网站可以充当代理并直接发布。 为了解决我的问题,我决定用 nginx 创建一个反向代理,谢谢 【参考方案1】:在您的评论中,您声明“为了解决我的问题,我决定使用 NGINX 创建反向代理”。
作为替代方案,更符合您的原始问题...
您可以使用HTTP 307 Temporary Redirect,其中方法(在本例中为POST
)和原始请求的主体被重用于执行重定向请求。
app.Context.Response.StatusCode = 307;
app.Context.Response.RedirectLocation = newUrl;
app.Context.Response.End();
【讨论】:
以上是关于Response.Redirect 在自定义 HttpModule 中使用 POST 方法的主要内容,如果未能解决你的问题,请参考以下文章
Response.Write 和 Response.redirect 不可同时使用