从 Javascript 调用 ASMX Web 服务

Posted

技术标签:

【中文标题】从 Javascript 调用 ASMX Web 服务【英文标题】:Calling ASMX Web Service from Javascript 【发布时间】: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。这是我的错误。但我得到了同样的错误。 【参考方案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 你得到什么错误?向我们显示错误消息。 这是我的问题:***.com/questions/41752213/… 你必须使用绝对网址吗?相对链接不适合您?【参考方案2】:

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

【讨论】:

以上是关于从 Javascript 调用 ASMX Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

无法从 .net 中的 Ajax 调用 .asmx Web 服务

使用 JSON 从 AJAX 和 JQuery 调用简单的 Web 服务(.asmx 文件) - 解析错误

使用 Response.Write JSON 输出从 Jquery 调用 c# asmx Web 服务

是否有任何受支持的方式可以从跨平台 Xamarin 代码调用 asmx Web 服务?

如何从 2.0 asmx Web 服务返回 JSON

如何使用 Retrofit 在 android 中调用图像上传 Web 服务 (ASP.NET) .asmx 文件