Asmx Web服务参考问题

时间:2011-06-11 06:54:06

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

我需要在客户端页面中使用JavaScript调用我的Web服务方法。我认为我没有正确地正确引用这一点,并希望得到帮助解决这个问题。

错误消息显示“未定义CalendarHandler”

<%@ WebService Language="C#" CodeBehind="~/App_Code/CalendarHandler.cs"
  Class="CalendarHandler" %>

                                        

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master"
  AutoEventWireup="true" CodeFile="CalendarPage.aspx.cs" Inherits="CalendarPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="Server">

</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">

      <input type="button" id="loadevents" onclick="callLoadEvents();" />
      <div id="eventresults"> </div>
      <div id="resultFailed"> </div>

      <script language="javascript" type="text/javascript">
            var tasks;

            function callLoadEvents() {

                  Speak.CalendarHandler.GetEvents(GetLoadAddress_success, OnFailed); 
            }
            function GetLoadAddress_success(e) { 
                  tasks = e;
            }
            // --------------------------
            function OnFailed() { 
                  $get('resultFailed').innerHTML = "failed";
            }

      </script>
</asp:Content>



using System.Web;
using System.Web.Services;

[WebService(Namespace = "Speak")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService]
[System.ComponentModel.ToolboxItem(false)] 
public class CalendarHandler : System.Web.Services.WebService 
{
      static IDictionary<DateTime, String> Calendarevents;//hold my events in this 

    public CalendarHandler () {
          Calendarevents = new Dictionary<DateTime, string>();
          Calendarevents.Add(DateTime.Now, "Going to meeting with XYZ Company");
          Calendarevents.Add(DateTime.Now.AddDays(1), "XML Class at 2pm");
          Calendarevents.Add(DateTime.Now.AddDays(1),"ASP.NET 3.5 Ajax");
          Calendarevents.Add(DateTime.Now.AddDays(1),"Pocket Guide");
          Calendarevents.Add(DateTime.Now.AddDays(1),"Grocery Shopping");

    }

    [WebMethod]
    public IDictionary<DateTime, String> GetEvents()
    {
        return Calendarevents;
    }

}

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

您需要将webmethod中的集合序列化为json,并使用return方法返回一个字符串(=实际上是集合的序列化输出= json)。

看看Encosia。它可以提供关于asp.net,javascript和jquery一起工作的最全面的文章。

using System.Web.Script.Serialization;


 JavaScriptSerializer jss = new JavaScriptSerializer();
 return jss.Serialize(CalendarEvents);

我宁愿用jquery来调用webservices。并留意d。 asmx中的前缀。使用jquery使用它们时的webservices。

答案 1 :(得分:0)

你在那个页面的Master上有一个ScriptManager吗?

基本上有两个键可以启用漂亮的Namespace.Service.Method语法:MicrosoftAjax.js和特定于服务的JavaScript代理。

当你在页面的任何地方(或者它的主人)有一个ScriptManager时,你会自动获得MicrosoftAjax.js。

要获取JavaScript代理,您需要ScriptManager上的ServiceReference或指向生成位置的JavaScript包含。 E.g:

<asp:ScriptManagerProxy>
  <Services>
    <asp:ServiceReference Path="/CalendarHandler.asmx" />
  </Services>
</asp:ScriptManagerProxy>

<script>
  // Speak.CalendarHandler.GetEvents() will be available here.
</script>    

所有实际操作都是注入/CalendarHandler.asmx/js(或者在调试中运行时为/ jsdebug)时可用的脚本。这是服务ScriptService属性的一部分。

因此,只要MicrosoftAjax.js已经从页面的某个位置注入,您也可以自己简单地向该JavaScript代理添加脚本引用:

<script src="/CalendarHandler.asmx/js"></script>

<script>
  // Speak.CalendarHandler.GetEvents() will be available here.
</script>

更新

如果服务代理生成代码不尊重Namespace属性中的[WebService]参数,您是否可以使用namespace关键字命名服务代码?

namespace Speak
{
  [ScriptService]
  public class CalendarHandler : WebService
  {
    [WebMethod]
    public IDictionary<DateTime, string> GetEvents()
    {
      // Etc.
    }
  }
}

我可以确认这种方法确实会影响生成的服务代理。