C# 使用nancyfx重定向到post
使用nancyfx是否可以重定向到具有post数据的其他方法 在我的示例中,在用户注册后,我想自动执行登录(我知道还有其他方法可以实现这一点,我可以从Post[“/login”]中提取代码,并从这两种方法中调用它,但这是一个一般性问题,我想知道这是否可行(也许我想重定向到另一个由另一个开发人员维护的模块,而我不能仅仅提取代码) 这就是我想要做的(伪代码)C# 使用nancyfx重定向到post,c#,nancy,C#,Nancy,使用nancyfx是否可以重定向到具有post数据的其他方法 在我的示例中,在用户注册后,我想自动执行登录(我知道还有其他方法可以实现这一点,我可以从Post[“/login”]中提取代码,并从这两种方法中调用它,但这是一个一般性问题,我想知道这是否可行(也许我想重定向到另一个由另一个开发人员维护的模块,而我不能仅仅提取代码) 这就是我想要做的(伪代码) 返回重定向模块() .WithFormsValue(“用户名”,model.username) .WithFormsValue(“密码”,mo
返回重定向模块()
.WithFormsValue(“用户名”,model.username)
.WithFormsValue(“密码”,model.password);
这是一个有两个模块的例子
public class LoginModule : NancyModule
{
public LoginModule()
{
Get["/login"] = _ => {
return View["login"]; // return login view
}
Post["/login"] = _=> {
// 1. get model
var model = this.Bind<LoginViewModel>();
// 2. perform login
// ...
// 3. redirect to home
return Response.AsRedirect("~/");
};
}
}
public class RegisterModule : NancyModule
{
public RegisterModule()
{
Get["/register"] = _=> {
return View["register"]; // return register view
};
Post["/register"] = _ => {
// 1. get model
var model = this.Bind<RegisterModel>();
// 2. create new User
// ...
// 3. redirect To /login with post data (pseudocode)
return RedirectToModule<LoginModule>()
.WithFormsValue("username", model.UserName)
.WithFormsValue("password", model.Password);
};
}
}
公共类登录模块:NancyModule
{
公共登录模块()
{
获取[“/login”]=\u=>{
返回视图[“登录”];//返回登录视图
}
Post[“/登录”]=\u=>{
//1.获取模型
var model=this.Bind();
//2.执行登录
// ...
//3.重定向到主页
返回响应。AsRedirect(“~/”);
};
}
}
公共类注册表模块:NancyModule
{
公共注册表模块()
{
获取[“/注册”]=\u=>{
返回视图[“寄存器”];//返回寄存器视图
};
Post[“/寄存器”]=\u=>{
//1.获取模型
var model=this.Bind();
//2.创建新用户
// ...
//3.重定向到/使用post数据登录(伪代码)
返回重定向模块()
.WithFormsValue(“用户名”,model.username)
.WithFormsValue(“密码”,model.password);
};
}
}
您应该能够通过
307临时重定向来实现这一点,但要做到这一点,您必须“手动”设置重定向响应:
我曾为我正在做的一个项目探索过类似的东西,并得出结论:它很容易完成。您可以获得IOC容器并创建LoginModule
的实例,然后直接调用Post[“/Login”]
method,但参数不清楚。我决定使用的方法是创建第三个类,可以从包含常用方法的任一模块实例化。@RonBeyer我认为您所做的是正确的方法,并且没有调用HTTP POST到另一个模块。在有权访问co的模块中执行HTTP POSTdebase是一种过度使用,使用IoC容器更有意义。关于最初的问题,如果你绝对必须,你可以使用HttpClient
和PostAsync()
(不特定于NancyFX),但我不确定你是否可以直接在Nancy内部执行。@kha是的,我相信这更“正确”即使实施起来有点困难(必须打破僵局)。这导致我必须创建一个ILoginManager
接口和一个具体的实现,这样就更容易了,因为您不需要专门使用IoC容器,只需将ILoginManager
添加到构造函数参数中,让IoC负责注入。谢谢您的建议。HttpClient
不起作用,因为服务器本身就是客户端,但是从IOC容器中获取模块并自己调用该方法可能是一个快速而肮脏的解决方案(我想我必须自己弄清楚如何修改参数以满足我的需要)。但这将重定向到我的Get[“/login”]
还是我遗漏了什么?307指示客户端使用与最初使用的HTTP方法相同的HTTP方法。也就是说,客户端执行POST
并获得307响应,它应该对位置
响应头中的URL执行POST
。
public class LoginModule : NancyModule
{
public LoginModule()
{
Get["/login"] = _ => {
return View["login"]; // return login view
}
Post["/login"] = _=> {
// 1. get model
var model = this.Bind<LoginViewModel>();
// 2. perform login
// ...
// 3. redirect to home
return Response.AsRedirect("~/");
};
}
}
public class RegisterModule : NancyModule
{
public RegisterModule()
{
Get["/register"] = _=> {
return View["register"]; // return register view
};
Post["/register"] = _ => {
// 1. get model
var model = this.Bind<RegisterModel>();
// 2. create new User
// ...
// 3. redirect To /login with post data (pseudocode)
return RedirectToModule<LoginModule>()
.WithFormsValue("username", model.UserName)
.WithFormsValue("password", model.Password);
};
}
}
public class RegisterModule : NancyModule
{
public RegisterModule()
{
Get["/register"] = _=> {
return View["register"]; // return register view
};
Post["/register"] = _ => {
// 1. get model
var model = this.Bind<RegisterModel>();
// 2. create new User
// ...
// 3. redirect To /login with post data (pseudocode)
return
Negotiate
.WithStatusCode(HttpStatusCode.TemporaryRedirect)
.WithHeader("Location", "/login");
};
}
}
public Negotiator WithTemporaryRedirect(this Negotiator self, string location) =>
self.Negotiate
.WithStatusCode(HttpStatusCode.TemporaryRedirect)
.WithHeader("Location", "/login");