客户报告我的mvc应用程序中的搜索功能在第一次尝试时没有返回任何结果,但在第二次搜索时使用相同的搜索字符串给出结果。
经过一番挖掘后,我发现如果你打开页面几分钟(2-5分钟),搜索功能会提交一个GET请求而不是一个POST请求,从而产生一个值为NULL的搜索字符串。
经过长时间的搜索,我还没有找到答案。搜索功能在积极使用应用程序时可以正常工作和发布,但是暂停一段时间并且不再发布,这对我的客户来说非常烦人。
这里有以下形式:
@using (Html.BeginForm("Search", "Student", FormMethod.Post, new { @class = "navbar-form-custom", style = "width:350px;" }))
{
<input type="text" id="search" name="search" class="form-control" style="height: 43px; width: 300px; border-radius: 5px; padding: 5px; height: 40px; margin-top:5px; border: 2px solid #e6e6e6;" placeholder="Search student" required>
}
和行动:
public ActionResult Search(string search)
{
return View(_repo.SearchStudent(search));
}
我已将[HttpPost]添加到操作中,这只会在GET触发时导致404错误。
现在我已经解决了#39;将表单切换为FormMethod.Get的问题似乎有用,虽然添加查询字符串并不理想。
我仍然在寻找一个合适的解决方案,因为我怀疑应用程序上的其他表单显示了类似的行为(错误报告变更未保存而没有错误,其他行为抛出空异常,当他们真的不应该这样做时,等)
之前我做过类似的项目,从未遇到过这种行为。这可能是IIS问题还是设置相关?
编辑:找到了罪魁祸首。显然用户的会话超时。这导致重定向到&#39; \ Account \ Login?ReturnUrl =&#34;学生/搜索&#34;&#39;。由于应用程序使用SSO会话,因此用户立即重新登录,从不会注意到。然后,返回URL作为GET请求进行访问,该请求解释了从POST到GET的突然切换。将表单切换为GET修复了问题,因为searchterm作为查询字符串传递,因此登录后不会丢失。但这会造成严重问题,并解释了许多有关未保存数据的错误报告。
之前从未遇到过这样的问题,但不知何故,这个应用程序的会话长度似乎很短。一直在寻找一个设置,但在配置文件中找不到任何东西(项目的初始阶段是与前同事一起制作的,托管不是由我管理的)编辑2:嗯,现在我只是觉得自己像个白痴。忽略默认的Startup.Auth.cs文件
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
},
ExpireTimeSpan = TimeSpan.FromMinutes(5) //<<DUH OBVIOUSLY
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
当我注意到在一段时间后出现问题时,应该是我看到的第一个地方。
我的不好
答案 0 :(得分:1)
只有默认路线,您的代码才能正常工作。如果您未在路线配置中拨打MapHttpAttributeRoutes
,[HttpPost]
将不执行任何操作。默认路由配置使用操作名称来确定正在使用的HTTP谓词。将您的操作名称更改为PostSearch
,它将使用POST。同样,GetSearch
将使其响应GET请求。