【问题标题】:Calling ASMX Web Service from Javascript从 Javascript 调用 ASMX Web 服务
【发布时间】:2014-02-12 16:25:45
【问题描述】:

我想从 javascript 调用网络服务。

这是我的代码:

    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”标头。 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的方法签名是什么
  • 使用 Fiddler (fiddler2.com) 模拟 POST 请求(使用 Composer 选项卡)并查看您的回复 - 这将具体告诉您您实际收到的详细错误消息.
  • 500 是服务器端错误。您是否调试过服务器端代码?此外,"{id='1'}" 不是有效的 json,id != variant_id。我想这很重要。
  • 试试{"variant_id":"1"}
  • 好的。我将 id 更改为 variant_id。这是我的错误。但我得到了同样的错误。

标签: javascript jquery asp.net web-services asmx


【解决方案1】:

好的,伙计们。我发现了问题。创建 ASMX 文件时,您必须读取所有 cmets 行。要允许使用 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 error。知道为什么吗?
  • @Si8 你得到什么错误?向我们显示错误消息。
  • 你必须使用绝对网址吗?相对链接不适合您?
【解决方案2】:

使用数据类型:“jsonp”,而不是数据类型:“json”, jsonp 用于跨域网络服务。希望它会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-03-27
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多