【问题标题】:Call web service from javascript从 javascript 调用网络服务
【发布时间】:2011-07-02 10:04:53
【问题描述】:

我在 ASP.NET 中编写了 Web 服务,它有这个地址:

http://localhost/RouteGen/Service.asmx

Web Service 有 web 方法 GetMessage ,它不带任何参数并返回一个字符串。

Web 服务没问题,我从其他 ASP.NET 应用程序甚至 Android 应用程序调用它的方法。

服务器代码:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
    [WebMethod]
    public string GetMessage() {
        return "Hello World";
    }
}

现在我需要从 javascript 调用 web 方法 GetMessage

html页面: (此网页与web service代码无关,完全是另一个项目!可以认为是用win记事本写的)

...
<body id="body1" onload="initialize()" style="behavior:url(webservice.htc)">
</body>
...

在我调用的 initialize() 方法中:

...
service_init();
processResult();

还有这个功能:

function service_init()
{   
    body1.useService("http://localhost/RouteGen/Service.asmx?WSDL","TheService");   
    body1.TheService.callService("GetMessage");
}

function processResult(result)
{
    alert(result);
}

所以我有:

1)在 IE 中 processResult() 返回“未定义”

2)在 Chrome 和 FireFox 中它根本不起作用(useService 没有出现后的简单警报)

问题出在哪里?如何让javascript从不同浏览器正常调用web方法?

【问题讨论】:

  • 我不知道为什么有人在没有任何评论的情况下投了反对票。无论如何,我的答案都可以完美运行...

标签: javascript asp.net web-services browser


【解决方案1】:

在 Aspx 部分,

如下添加ScriptManager标签,

        <asp:ScriptManager ID="ScriptManager1" runat="server">
                <Services>
                   <asp:ServiceReference  path="~/sample.asmx"/>
                </Services>
         </asp:ScriptManager>

在 JavaScript 中调用 web 服务(sample.asmx),如下所示,

<script language="javascript" type="text/javascript">

  function CalledOnAnyClientClickEvent()
  {
     var parameter1="dsfsfs"; 

     NameSpace1.WebService1.HelloWorld(parameter1,OnSucess,OnFail);
  }
   function OnSuccess(asd)
   {
      alert(asd);//result will contain the return parameter from web service
   }

   function OnFail(asd)
   {
      alert(asd);
   }
</script>

请参阅下面的 Asmx 部分 (sample.asmx),

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Web;
          using System.Web.Services;

          using System.Web.Script.Serialization;
          using System.Web.Script.Services;

          namespace NameSpace1
          {
            /// <summary>
            /// Summary description for WebService1
            /// </summary>
           [WebService(Namespace = "http://tempuri.org/")]
           [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]     
            [System.ComponentModel.ToolboxItem(false)]

           // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
           [ScriptService]

           public class WebService1 : System.Web.Services.WebService
           {

                  [WebMethod]
                   public string HelloWorld(string par1)
                   {
                        //do your logic here

                       return "Hello World";
                   }
            }
         }

希望对你有帮助……

【讨论】:

  • NameSpace1.WebService1.HelloWorld(parameter1,OnSucess,OnFail); 是不是 useServicecallService 方法?以及如何在 javascript 代码中使用 Namespace1?这是另一个与 Web 服务代码无关的 html 页面
  • 嘿,这就是为什么要指定带有 Web 服务路径的脚本管理器的原因。我已经实现了这个,它对我有用......
  • @Ilya Blokh,我又试了一次,效果很好。我不知道为什么有人在没有任何评论的情况下投了反对票。
  • 你在哪里写的javascript代码?它应该在asp.net服务器之后创建的html页面上,而不是。你已经有web服务的web方法,我需要用javascript写一些东西来调用这个方法
  • 为什么NameSpace1.WebService1.HelloWorld(parameter1,OnSucess,OnFail); 有效?您在网页中的哪个位置定义 NameSpace1??
【解决方案2】:

ASMX 是一种 SOAP Web 服务。 SOAP 相对复杂。

将数据返回到浏览器的更好方法是使用 REST。可以使用 JQUERY 使用 REST 服务。

您可以构建使用 REST 并返回 JSON 结果的 WCF 服务。

如果您的服务与您的网页不在同一台服务器上,您将不得不使用 JSONP 之类的东西来进行跨域调用。

【讨论】:

  • WCF 非常棒,特别是对于经过身份验证的 Web 服务和关键数据。对于一个基本的 CRUD Web 服务,我在 ASP.NET MVC 中构建了它,它就像一个冠军。
  • @rockinthesixstring,请问我的回答有什么问题吗?它对我来说非常有用......
  • @Harun,我没有拒绝你的回答,也没有看过它。我完全停止使用网络表单,所以我不喜欢任何包括runat="server" 的东西。我并没有说这是错的,我只是没有看它,也没有投票。
  • 那么从 javascript 调用 web 方法呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多