【发布时间】:2016-01-23 06:09:49
【问题描述】:
我的网站每天大约会出现 20 次此异常,通常表单可以正常工作,但在某些情况下会出现此问题,我不知道为什么如此随机。
这是 elmah 记录的异常
500 HttpAntiForgery The required anti-forgery cookie __RequestVerificationToken" 不存在。
但它发送令牌的形式如 elmah 在 XML 日志中显示的那样
<form>
<item name="__RequestVerificationToken">
<value string="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41"/>
</item>
<item name="toPhone">
<value string="XXXXXX"/>
</item>
<item name="smsMessage">
<value string="xxxxxxxx"/>
</item>
</form>
这是我在控制器上使用数据属性检查令牌是否有效的方法
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<JsonResult> Send(SMSModel model)
{
// my code goes here
}
这是我在视图中的表单
@using (Html.BeginForm("Send", "SMS", FormMethod.Post, new { @class = "form-sms", autocomplete = "off" }))
{
@Html.AntiForgeryToken()
<div class="row">
<div class="col-md-12">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">+53</div>
@Html.TextBoxFor(m => m.toPhone, new { @class = "form-control", placeholder = "teléfono", required = "required", type = "tel", maxlength = 8 })
</div>
</div>
</div>
</div>
<div class="form-group" style="position:relative">
<label class="sr-only" for="exampleInputEmail3">Message (up to 135 characters)</label>
@Html.TextAreaFor(m => m.smsMessage, new { rows = 4, @class = "form-control", placeholder = "escriba aquí su mensaje", required = "required", maxlength = "135" })
<span class="char-count">135</span>
</div>
if (ViewBag.Sent == true)
{
<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<strong>Su mensaje ha sido enviado <span class="hidden-xs">satisfactoriamente</span></strong>
</div>
}
if (ViewBag.Error == true)
{
<div class="alert alert-danger alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<strong>Error:</strong> Por favor revise el número de teléfono.
</div>
}
<div class="errorToMany"></div>
<button type="submit" class="btn btn-default btn-block">Enviar SMS</button>
}
这就是我使用 AJAX 发布数据的方式
$('form.form-sms').submit(function (event) {
$.ajax({
url: $(this).attr("action"),
type: "POST",
data: $(this).serializeArray(),
beforeSend: function (xhr) {
$('.btn-default').attr("disabled", true);
$('.btn-default').html("Enviando...")
},
success: function (data, textStatus, jqXHR) {
if (data[0] == false && data[1] == "1") {
some code
} else {
location.reload();
}
},
error: function (jqXHR, textStatus, errorThrown) { }
});
return false;
});
表单在大多数情况下运行良好,但此错误不断发生,我不知道为什么,我在 Stack Overflow 上检查了其他问题,但对我没有任何效果。
关于我如何发布数据的进一步说明。
此发送 SMS 的表单具有 ToNumber 和 Message 字段。当用户单击提交按钮时,AJAX 函数将获得控制权并将其发布为序列化表单的字段数据,当我在控制器中的函数完成并返回表明一切顺利的 JSON 结果时,AJAX 方法会重新加载向用户显示成功的页面消息。
任何可能导致此问题的想法。
【问题讨论】:
标签: c# jquery asp.net-mvc cookies antiforgerytoken