jQuery ajax调用httpget webmethod(c#)不起作用

我想获得一个Ajax的代码后面的webmethod。 问题是我不断从jQuery的onfail方法得到错误“parserror”。

如果我将GET更改为POST,一切正常。 请参阅下面的代码。

Ajax调用

 <script type="text/javascript"> var id = "li1234"; function AjaxGet() { $.ajax({ type: "GET", url: "webmethods.aspx/AjaxGet", data: "{ 'id' : '" + id + "'}", contentType: "application/json; charset=utf-8", dataType: "json", async: false, success: function(msg) { alert("success"); }, error: function(msg, text) { alert(text); } }); } </script> 

代码在后面

 [System.Web.Services.WebMethod] [System.Web.Script.Services.ScriptMethod(UseHttpGet = true, ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)] public static string AjaxGet(string id) { return id; } 

Web.config文件

  <webServices> <protocols> <add name="HttpGet"/> </protocols> </webServices> 

正在使用的url

…….. / webmethods.aspx / AjaxGet {%20%27id%27%20:%20%27li1234%27}?

作为响应的一部分,它返回页面webmethods的html。

任何帮助将不胜感激。

在此之前,我可以说,你select不是最简单的方法。 ScriptMethods很容易与ASP.NET ScriptManager一起使用,而不是与jQuery一起使用。 我build议你最好使用支持JSON的WCF HTTP服务(更好的是RESTfull服务),而不是现在尝试使用的ASMX Webservice。 尽pipe如此,在客户端不使用任何Microsoft技术的情况下,可以使代码工作。

首先validation服务器端。

  1. 将webmethods.aspx重命名为webmethods.asmx。
  2. validation你放在\里面,并且一个httpHandlers for asmx扩展名(ScriptHandlerFactory)也存在于config中:

     <configuration> <!-- ... --> <system.web> <webServices> <protocols> <add name="HttpGet"/> </protocols> </webServices> <httpHandlers> <!-- ... --> <add verb="*" path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory" validate="false"/> </httpHandlers></system.web></configuration> 
  3. validation从System.Web.Services.WebServiceinheritance的[ScriptService]属性([System.Web.Script.Services.ScriptService]如果您喜欢全名)设置为您的类。

现在你可以testing服务。 打开你的Web浏览器的URL像http://localhost/webmethods.asmx/AjaxGet?id = li1234如果你收到回来的东西
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">li1234</string>

你可以确定你服务的部分工作正常。

备注:如果在请求中没有设置“Content-Type:application / json;”,则在“ResponseFormat = System.Web.Script.Services.ResponseFormat.Json”上独立于服务答案,并返回XML响应。

现在我们将修复客户端代码。 我希望我在下面的代码中提出的意见能够解释所有的问题。

还有一点小话。 在代码的最后部分,我调用了一个更复杂的web方法:

 [WebMethod] [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public OutputData AjaxGetMore (InputData input) { return new OutputData () { id = input.id, message = "it's work!", myInt = input.myInt+1 }; } 

哪里

 public class OutputData { public string id { get; set; } public string message { get; set; } public int myInt { get; set; } } public class InputData { public string id { get; set; } public int myInt { get; set; } } 

现在只有在某些地方使用JSON插件的JavaScript代码,可以用Crockford的json2.js代替,如果有人喜欢的话。

 var id = "li1234"; // version 1 - works var idAsJson = '"' + id + '"'; // string serializes in JSON format $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet?id=" + idAsJson, contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); // version 2 with respect of JSON plugin $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet?id=" + $.toJSON(id), contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); // version 3 where jQuery will construct URL for us $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet", data: {id: $.toJSON(id)}, dataType: "json", contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); // version 4. We set "Content-Type: application/json" about our data, but we use no // not 'dataType: "json"' parameter. Then we have "Accept: */*" in the request // instead of "Accept: application/json, text/javascript, */*" before. // Everithing work OK like before. $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet", data: {id: $.toJSON(id)}, contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); // version 5. If we don't place "Content-Type: application/json" in our reqest we // receive back XML (!!!) response with "HTTP/1.1 200 OK" header and // "Content-Type: text/xml; charset=utf-8" which will be placed. // How one can read in // http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx), // ASP.NET AJAX will not make JSON serialized of response data for // security reasons. $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGet", data: {id: $.toJSON(id)}, dataType: "json", //contentType: "application/json; charset=utf-8", success: function(msg) { alert(msg.d); // var msg = {d: "li1234"} }, error: function (res, status, ex) { // the code here will be works because of error in parsing server response if (res.status !== 200) { // if not OK // we receive exception in the next line, be var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } else { alert("status=" + status + "\nex=" + ex + "\nres.status=" + res.status + "\nres.statusText=" + res.statusText + "\nres.responseText=" + res.responseText); } } }); // version 6. Send more komplex data to/from the service var myData = { id: "li1234", myInt: 100} $.ajax({ type: "GET", url: "/webmethods.asmx/AjaxGetMore", data: {input:$.toJSON(myData)}, dataType: "json", contentType: "application/json; charset=utf-8", success: function(msg) { // var msg = {__type: "Testportal.OutputData", id: "li1234", message: "it's work!", myInt:101} alert("message=" + msg.d.message + ", id=" + msg.d.id + ", myInt=" + msg.d.myInt); }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); 
 //... data: { "id" : id }, //... 

数据是一个对象,而不是看起来像一个对象的string。

如果使用string,则必须使用格式正确的URL查询string,如下所示:

 //... data: "id=" + encodeURIComponent(id) + "&otherstuff=" + encodeURIComponent(data), //... 

我来到这里寻找答案…对于其他人,这是答案。

出于安全原因,ASP.Net AJAX页面方法仅支持POST请求。

(从https://stackoverflow.com/a/2397521

你也可以查看http://www.json.org/js.html JSON.stringify它接受一个json对象作为参数并返回一个string。

对于那些使用VB,装饰你的方法是这样的:

 <WebMethod()> <ScriptMethod(UseHttpGet:= True, ResponseFormat:= ResponseFormat.Json)>