使用Javascript调用ASMX Web服务

10
我希望能够从JavaScript调用Web服务。
这是我的代码:
    var method="GetStock";
    var url = "http://www.mywebsite.ro/ServiceGetStock.asmx";
    $.ajax({
        type: "POST",
        url: url + "/GetStock",
        data: "{variant_id='1'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: OnSuccessCall,
        error: OnErrorCall
    });

    function OnSuccessCall(response) {
        alert(response.d);
    }


    function OnErrorCall(response) {
        alert(response.status + " " + response.statusText);
    }

我的ServiceGetStock.asmx代码:

 [WebMethod]
    public string GetStock(int variant_id)
    {
        try
        {

            ProductVariant variant = ProductVariantManager.GetProductVariantByID(variant_id);

            return variant.Stock.ToString();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

我收到了以下错误信息:
POST http://www.mywebsite.ro/ServiceGetStock.asmx/GetStock 500 (内部服务器错误)
[更新]
我忘记提到,因为我遇到了以下错误,所以我在项目的webconfig中添加了以下内容(使用了webservice):
XMLHttpRequest无法加载http://www.mywebsite.ro/ServiceGetStock.asmx/HelloWorld。请求的资源上没有'Access-Control-Allow-Origin'头。因此,不允许来自'http://localhost:11300'的访问。
  <httpProtocol>
          <customHeaders>
              <add name="Access-Control-Allow-Origin" value="*" />
              <add name="Access-Control-Allow-Headers" value="Content-Type" />
          </customHeaders>
  </httpProtocol>

дҪ зҡ„ GetStock ж–№жі•зӯҫеҗҚжҳҜд»Җд№Ҳпјҹ - Habib
使用 Fiddler(fiddler2.com)来模拟“POST”请求(使用Composer选项卡),并查看您的响应 - 这将告诉您实际接收到的详细错误消息。 - Mike Marks
再次提醒,您的数据字符串不是有效的 JSON 格式。请尝试使用 data: JSON.stringify({variant_id: 1}) - Jason P
我的方法是正确的。但是我无法调试GetStock函数,因为我的网络服务正在线上运行。(http://www.mywebsite.com/ServiceGetStock.aspx) - POIR
我告诉你,用Fiddler。Fiddler非常好用。我遇到过类似的问题,而Fiddler会告诉你所有关于POST/PUT/GET等操作引起的HTTP响应/错误的信息。 - Mike Marks
显示剩余8条评论
2个回答

15

好的,大家听我说。问题已经找到了。在创建ASMX文件时,必须阅读所有注释行。为了允许使用ASP.NET AJAX从脚本调用此Web服务,请取消以下行的注释。

 //[System.Web.Script.Services.ScriptService]

因此,GetStock函数如下:

  [WebMethod]
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string GetStock(string variant_id)
    {
        SendEmail.SendErrorMail("in"+ variant_id);

        try
        {

            ProductVariant variant = ProductVariantManager.GetProductVariantByID(Convert.ToInt32(variant_id));

            return variant.Stock.ToString();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

并且 Ajax 代码是:

   var url = "http://www.mywebsite.ro/ServiceGetStock.asmx";
    $.ajax({
        type: "POST",
        url: url + "/GetStock",
        data: "{variant_id:'1'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: OnSuccessCall,
        error: OnErrorCall
    });

    function OnSuccessCall(response) {
        alert(response.d);
    }


    function OnErrorCall(response) {
        alert(response.status + " " + response.statusText);
    }

问题已解决!感谢所有的提示......


直接访问此链接:http://myserver:123/WServ/EDt.asmx/HelloWorld 将显示 XML。但是当我执行上述操作时,已经出现了“0错误”。有任何想法为什么会这样? - Si8
@Si8,你遇到了什么错误?请向我们展示错误信息。 - POIR
这是我的问题:http://stackoverflow.com/questions/41752213/why-is-asmx-giving-an-error-when-pulling-data-from-client-script - Si8
你必须使用绝对URL吗?相对链接无法正常工作吗? - FrenkyB

0

使用 dataType: "jsonp",而不是 dataType: "json", jsonp 用于跨域 web 服务。希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接