为什么我无法使用GET将参数发送到WebMethod?

时间:2012-09-29 13:16:16

标签: jquery asp.net ajax web-services getmethod

我的WebMethod看起来像这样:

[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json, UseHttpGet=true)]
public List<Person> HelloWorld(string hello)
{
   List<Person> persons = new List<Person> 
   {
      new Person("Sarfaraz", DateTime.Now),
      new Person("Nawaz", DateTime.Now),
      new Person("Manas", DateTime.Now)
   };
   return persons;
}

我正在尝试使用jQuery调用此方法:

var params={hello:"sarfaraz"}; //params to be passed to the WebMethod
$.ajax
({
    type: "GET",   //have to use GET method
    cache: false,
    data: JSON.stringify(params),
    contentType: "application/json; charset=utf-8",
    dataType: 'json',
    url: "http://localhost:51519/CommentProviderService.asmx/HelloWorld",
    processData: true,
    success: onSuccess,
    error: onError      //it gets called!
});

但它不起作用。它不是调用onSuccess回调,而是调用onError,其中我使用alert作为:{/ p>

alert(response.status + " | " + response.statusText + " | " + response.responseText + " | " + response.responseXML );

打印出来:

  

500 |内部服务器错误| {“消息”:“无效的网络服务电话,   缺少参数值:\ u0027hello \ u0027。“,”StackTrace“:”at   System.Web.Script.Services.WebServiceMethodData.CallMethod(对象   target,IDictionary 2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary 2个参数)\ r \ n at   System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext的   context,WebServiceMethodData methodData,IDictionary`2 rawParams)\ r \ n   在   System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext的   context,WebServiceMethodData   methodData)“,”ExceptionType“:”System.InvalidOperationException“} |   未定义

我不明白为什么会收到此错误。

如果我更改jQuery调用以使用POST方法并生成UseHttpGet=false,那么它的效果很好。但我希望它与GET一起使用。需要修复什么?

2 个答案:

答案 0 :(得分:1)

HTTP GET期望所有参数都在URL中编码。

问题是您在有效负载上执行了JSON.stringifyjQuery.ajax实际上只是在寻找简单的字典,它可以变成一系列查询字符串参数。

所以如果你有这样的对象:

{ name: "value" }

jQuery会将其附加到您的网址末尾,如下所示:

?name=value

使用Firebug,Chrome开发者工具或IE开发人员工具检查外发网址,我怀疑您会看到它的格式是ASP.Net无法翻译的。

答案 1 :(得分:0)

要在GET中发出$ .ajax请求,您必须将数据设置为params="hello=sarfaraz"

所以完整的代码段可以简单地

var params="hello=sarfaraz"; //params to be passed to the WebMethod
$.ajax
({
    type: "GET",   //have to use GET method
    cache: false,
    data: params,
    dataType: 'json',
    url: "http://localhost:51519/CommentProviderService.asmx/HelloWorld",
    success: onSuccess,
    error: onError    //it gets called!
});

希望有所帮助!