Проблема с ссылками на веб-сервис Asmx - PullRequest
0 голосов
/ 11 июня 2011

Мне нужно вызвать метод моего веб-сервиса с помощью JavaScript на моей странице клиента. Я думаю, что я не правильно ссылаюсь на это, и был бы признателен за помощь в выяснении этого, пожалуйста.

Сообщение об ошибке гласит «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 ]

3 голосов
/ 11 июня 2011

Вам необходимо сериализовать коллекцию, имеющуюся в вашем веб-методе, в json и иметь метод return для возврата строки (= фактически это сериализованный вывод вашей коллекции = json).

Посмотрите на Encosia . В нем, вероятно, есть самые подробные статьи о совместной работе asp.net, javascript и jquery.

using System.Web.Script.Serialization;


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

И я бы предпочел использовать jquery для вызова веб-сервисов. И остерегайтесь d. префикс в asmx. веб-сервисы при использовании их с jquery.

0 голосов
/ 11 июня 2011

У вас есть ScriptManager на Мастер этой страницы?

В основном, есть два ключа для включения хорошего синтаксиса Namespace.Service.Method: MicrosoftAjax.js и прокси-сервер JavaScript для конкретной службы.

Вы получаете MicrosoftAjax.js автоматически, когда у вас есть ScriptManager где-нибудь на странице (или его Master (s)).

Чтобы получить прокси JavaScript, вам потребуется либо ServiceReference в ScriptManager, либо 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.
    }
  }
}

Я могу подтвердить, что этот подход влияет на сгенерированный прокси службы.

...