我在客户端有这个简单的ajax请求:
var name = $("#txtNewsletterName");
var email = $("#txtNewsletterEmail");
$.ajax({
url: "/Handlers/Handler.ashx",
contentType: "application/json; charset=utf-8",
type: "POST",
dataType: "json",
data: {
op: "register_to_newsletter",
name: name.val(),
email: email.val()
},
async: true
});
和C#服务器端的代码:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
switch (context.Request["op"])
{
case "register_to_newsletter":
string recipientName = context.Request["name"].Trim();
string recipientEmail = context.Request["email"].Trim();
break;
default:
break;
}
}
问题是来自请求的数据未传递到服务器,因此context.Request["op"]
,context.Request["name"]
和context.Request["email"]
为空。
我还检查了context.Request.Form.AllKeys
及其string[0]
很明显,数据无法到达服务器。
检查Chrome调试器中的“网络”标签时,我发现有2个请求已发送,因此我已从Chrome调试器添加了网络数据的屏幕截图:
答案 0 :(得分:2)
发生了重定向,似乎正在丢弃数据。
如果查看第二个屏幕截图,您会看到GET HTTP 200,但数据不再在请求中。
重定向是从"/Handlers/Handler.ashx"
到"/handlers/handler.ashx"
。也许在web.config中有一个urlrewrite强制执行小写网址,并且如果它与大写字符匹配则进行重定向?
如果您将网址更改为全部小写怎么办:
url: "/handlers/handler.ashx",
并删除contentType设置:
contentType: "application/json; charset=utf-8",
因为您没有反序列化服务器上的数据,但希望将其作为默认的contentType application/x-www-form-urlencoded; charset=UTF-8
发送。
dataType 用于响应, contentType 用于请求。
答案 1 :(得分:0)
尝试更改数据:
data: '{"op":"register_to_newsletter","name":"' + name.val() + '","email" :"' + email.val() + '"}'
并且还使用:
context.Request.Form["op"];
答案 2 :(得分:-1)
为什么不开始使用正确的数据模型?
不要使用HTTPContext,而是将输入参数作为要接收的数据的模型。那你就不会有任何问题。
答案 3 :(得分:-1)
在发送之前对您的对象进行字符串化,就像这样
data: JSON.stringify({
"op": "register_to_newsletter",
"name": name.val(),
"email": email.val()
}),
所以完整的代码应该是这样的
var name = $("#txtNewsletterName");
var email = $("#txtNewsletterEmail");
$.ajax({
url: "/Handlers/Handler.ashx",
contentType: "application/json; charset=utf-8",
type: "POST",
dataType: "json",
data: JSON.stringify({
"op": "register_to_newsletter",
"name": name.val(),
"email": email.val()
}),
async: true
});