使用程序集名称对C#web服务方法进行JavaScript直接调用

JavaScript direct call to C# web service method using the assembly name

本文关键字:JavaScript 调用 方法 服务 程序集 C#web      更新时间:2023-09-26

我正在努力理解以下代码片段是如何工作的。设计它的人没有向我解释它是如何工作的(以及他/她为什么不使用ajax调用)。我问过一些同事,他们似乎没有给我正确的解释,让我理解JavaScript是如何直接访问webmethod的。我希望我的例子足够好,至少可以得到一个合理的解释,因为我不能发布原始代码。

Web服务

namespace ClientName.Version.Services
{
   [WebService(Namespace = "http://tempuri.org/")]
   [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
   [System.ComponentModel.ToolboxItem(false)]
   [System.Web.Script.Services.ScriptService]
   public class ClassName : System.Web.Service.WebService
   {
      [WebMethod(EnableSession = true)]
      public List<ReturnData> WebMethod(string param1)
      {
            .
            .
            .
      }
    }
}

Javscript调用

(function(){
    var param = "Broken down calls";
    .
    .
    .

    ClientName.Version.Services.ClassName.WebMethod(
        param, function(dataReturnedFromService){
            if(dataReturnedFromService != null){
                //process data and append to html
            }
        }   
    );

})();

编辑时间:在@matt把我指到正确的位置后,在他的回应之上,如果有人现在更关心的话http://msdn.microsoft.com/en-us/library/bb398998(v=vs.100).aspx

或谷歌

"向客户端脚本公开Web服务"了解更多信息。

可能发生的情况是:

http://msdn.microsoft.com/en-us/library/bb310823(v=vs.100).aspx

您正在客户端生成一个代理类,该类将AJAX调用隐藏在与服务器端几乎相同的接口后面。

如果你在浏览器控制台中查看网络选项卡,你可能会看到实际的AJAX调用。

在MSDN上简单搜索一下ScriptServiceAttribute就可以为您指明正确的方向:

要从ECMAScript(JavaScript)调用Web服务方法,必须将ScriptServiceAttribute属性应用于相关的Web服务类。将ScriptServiceAttribute应用于包含一个或多个应用了WebMethodAttribute的方法的Web服务类定义时,代理生成脚本会创建一个与Web服务类对应的代理对象

看看你的页面,你应该有一个看起来像这样的部分:

<asp:ScriptManager runat="server" ID="scriptManager">
  <Services>
    <asp:ServiceReference
       path="~/WebServices/SimpleWebService.asmx" />
  </Services>
</asp:ScriptManager>

这就是添加代理的地方。

我目前正在维护一个旧项目,他们所做的是创建了一个类似于您的示例的服务类

namespace ClientName.Version.Services
{
   [WebService(Namespace = "http://tempuri.org/")]
   [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
   [System.ComponentModel.ToolboxItem(false)]
   [System.Web.Script.Services.ScriptService]
   public class ClassName : System.Web.Service.WebService
   {
      [WebMethod(EnableSession = true)]
      public List<ReturnData> WebMethod(string param1)
      {
            .
            .
            .
      }
    }
}

然后asmx文件引用了它

<%@ WebService Language="C#" Class="ClientName.Version.Services.ClassName" %>

而scriptmanager标记在aspx或主页上的位置

<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="3600"
</asp:ScriptManager>

通过后面的代码添加服务。

ScriptManager1.Services.Add(new ServiceReference("~/WebServices/Service.asmx"));