没有从jquery ajax调用得到预期的数据

时间:2013-07-10 10:54:06

标签: c# jquery ajax web-services

这是c#web方法

 [WebMethod]
    public string Hello()
    {
        return "Hello World";
    }

这是jquery ajax代码

$.ajax({
            url: "http://10.0.2.2/SampleService/Service/HelloWorld.asmx",
            dataType: 'text',
            cache: false,
            crossDomain: true,
            timeout: 15000,
            success: function (rtndata) {
                 alert('Got Success ::'+ rtndata);
            },
            error: function (xhr, errorType, exception) {
                alert("Excep:: "+exception +"Status:: "+xhr.statusText);
        }
        });

但是我没有在Hello World中获得rtndata,而是获得完整的HTML回复页。

4 个答案:

答案 0 :(得分:0)

您需要返回json模型或禁用布局

答案 1 :(得分:0)

如果您收到html页面是因为您要发送html页面。

您应该仔细检查您的代码,以便在发送输出之前知道是否有任何内容附加到响应中。

尝试向ajax调用发送JSON格式的响应,如:

{'hello':'world'}

然后添加dataType作为$ .ajax的选项。如果要打印输出,可以进行警报(JSON.stringify(response))。

$.ajax({
    url: "http://10.0.2.2/SampleService/Service/HelloWorld.asmx",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    cache: false,
    crossDomain: true,
    timeout: 15000,
    success: function (rtndata) {
        alert('Got Success ::' + JSON.stringify(rtndata));
    },
    error: function (xhr, errorType, exception) {
        alert("Excep:: " + exception + "Status:: " + xhr.statusText);
    }
});

有一件重要的事情......更多时候你会添加缓存:false,但这不能正常工作,你应该做一个技巧来解决。

添加时间戳作为调用的参数,如:

var date = new Date();
$.ajax({
    url: "http://10.0.2.2/SampleService/Service/HelloWorld.asmx?timestamp="+date.now(),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    cache: false,
    crossDomain: true,
    timeout: 15000,
    success: function (rtndata) {
        alert('Got Success ::' + JSON.stringify(rtndata));
    },
    error: function (xhr, errorType, exception) {
        alert("Excep:: " + exception + "Status:: " + xhr.statusText);
    }
});

希望这会有所帮助......

答案 2 :(得分:0)

您必须将方法名称附加到网址(例如/HelloWorld)并在ajax调用中指定method: "post"(如果您要使用POST请求)。试试这个:

$.ajax({
    url: "http://10.0.2.2/SampleService/Service/HelloWorld.asmx/HelloWorld",
    method:"POST",
    dataType: "text",
    cache: false,
    crossDomain: true,
    timeout: 15000,
    success: function (rtndata) {
        alert('Got Success ::' + rtndata);
    },
    error: function (xhr, errorType, exception) {
        alert("Excep:: " + exception + "Status:: " + xhr.statusText);
    }
});

如果您想使用GET作为请求方法,请确保在 web.config 文件中包含此标记:

<system.web>
  <webServices>
    <protocols>
      <add name="HttpGet" />
      <add name="HttpPost" />
    </protocols>
  </webServices>
</system.web>

此外,您需要使用ScriptMethodAttribute

来装饰服务方法
[ScriptMethod(UseHttpGet = true)]
[WebMethod]
public string HelloWorld()
{
    return "Hello World";
}

ajax调用(method: "GET"是可选的,因为它是text的默认方法):

$.ajax({
    url: "http://localhost:57315/helloworld.asmx/HelloWorld",
    method: "GET"
    dataType: "text",
    cache: false,
    crossDomain: true,
    timeout: 15000,
    success: function (rtndata) {
        alert('Got Success ::' + rtndata);
    },
    error: function (xhr, errorType, exception) {
        alert("Excep:: " + exception + "Status:: " + xhr.statusText);
    }
});

当您使用cache: false时,可能需要use the GET request

Setting cache to false will only work correctly with HEAD and GET requests.
It works by appending "_={timestamp}" to the GET parameters.

答案 3 :(得分:0)

您获得的html页面概述了服务商中所有可用的webmethod - 各种API。尝试在浏览器中导航到它。

如果你想调用你的Hello WebMethod,你应该将“/ Hello”作为方法名称添加到url:

$.ajax({
  type: 'POST',
  contentType: 'application/json; charset=utf-8',
  url: 'http://10.0.2.2/SampleService/Service/HelloWorld.asmx/Hello',
  dataType: 'json',
  cache: false,
  crossDomain: true,
  timeout: 15000,
  success: function (rtndata) {
     alert('Got Success ::'+ rtndata);
  },
  error: function (xhr, errorType, exception) {
     alert("Excep:: "+exception +"Status:: "+xhr.statusText);
  }
});

您可以在此处阅读更多内容:http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/