«Пространство имен» не определено при попытке вызвать метод asmx из jQuery - PullRequest
1 голос
/ 12 октября 2010

Я пытаюсь использовать jQuery для доступа к методу в веб-службе asmx.Когда я пытаюсь выполнить приведенный ниже вызов jquery, я получаю сообщение об ошибке «MyNameSpace» не определено.

jquery вызов веб-службы:

  MyNameSpace.MyWebService.MyMethod(parameter, function (e) { alert('Success') }, function (e) { alert('Failure') });

scriptmanager:

  <asp:ScriptManager id="ScriptManager1" runat="server" >
     <Services>
       <asp:ServiceReference path="MyWebService.asmx" />
     </Services>
  </asp:ScriptManager>

MyWebService.asmx.cs:

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


namespace MyNameSpace{
    [ScriptService]
    [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. 
    //[System.Web.Script.Services.ScriptService]
    public class MyWebService : System.Web.Services.WebService
    {


        [WebMethod]
        public void MyMethod(string parameter)
        {
            //do some cool stuff


        }
    }
}

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

Это оказалось проблемой с моим файлом .asmx и тем, что я переместил его в другую папку.Чтобы исправить мой файл .asmx, я щелкаю на нем правой кнопкой мыши и выбираю вид разметки.Свойство class было установлено в неправильный класс, поэтому мой скрипт-менеджер не смог его загрузить.

1 голос
/ 02 февраля 2017

Я собираюсь добавить другой ответ, чем тот, который был дан выше.Это крайний случай, с которым я столкнулся совсем недавно.

В моем случае у меня возникли проблемы с синхронизацией при загрузке моих скриптов.Это означает, что в Google Chrome мой скрипт загружается нормально и имеет доступ к методам WebService.Однако в IE11 мой скрипт не загружается, потому что он загружается до загрузки ScriptManager, и поэтому IE11 не может видеть пространство имен для доступа к методам WebService.

Есть 2 возможных предложенияо том, как исправить эту проблему времени.Оба не являются надежными серебряными пулями для этой редкой проблемы.

Добавление ScriptReference к ScriptManager

Как уже упоминалось в MSDN :

РегистрацияПользовательский сценарий

Используйте элемент управления ScriptManager для управления ресурсами, которые вы создали для элементов управления, которые участвуют в частичных обновлениях страницы.Ресурсы включают скрипты, стили, скрытые поля и массивы.Коллекция Scripts элемента управления ScriptManager содержит объект ScriptReference для каждого сценария, доступного для браузера.Вы можете указать сценарии декларативно или программно.Элемент управления ScriptManager также предоставляет методы регистрации, которые можно использовать для программного управления клиентским скриптом и скрытыми полями.При регистрации сценария или скрытых полей, которые поддерживают частичное обновление страницы, необходимо вызвать методы регистрации элемента управления ScriptManager.(Чтобы зарегистрировать сценарии, которые не нужны для частичного обновления страницы, вы используете методы класса ClientScriptManager.)

Другими словами, вы должны добавить свои сценарии следующим образом:

<asp:ScriptManager ID="scriptManager" runat="server">
    <Services>
        <asp:ServiceReference Path="BackgroundService.asmx" />
    </Services>
    <Scripts>
        <asp:ScriptReference Path="Scripts/jquery-3.1.1.js" />
        <asp:ScriptReference Path="Scripts/customScript.js" />
        <asp:ScriptReference Path="Scripts/test_script_for_lulz.js" />
    </Scripts>
</asp:ScriptManager>

Это так, что ScriptManager может ссылаться на ваши скрипты, когда он загружается.

Добавление ваших скриптов после ScriptManager

Другой способ сделать это - добавить ваши скрипты послеScriptManager, внутри вашего элемента <form runat="server">, например:

<asp:ScriptManager ID="scriptManager" runat="server">
    <Services>
        <asp:ServiceReference Path="BackgroundService.asmx" />
    </Services>
</asp:ScriptManager>

<%-- Your scripts come after ScriptManager --%>
<script type="text/javascript" src="Scripts/jquery-3.1.1.js"></script>
<script type="text/javascript" src="Scripts/test_script.js"></script>
<script type="text/javascript" src="Scripts/lulz_script_again.js"></script>

Таким образом, ваши скрипты загружаются после завершения загрузки ScriptManager, благодаря тому, как язык разметки читается браузером.

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

1 голос
/ 14 мая 2012

Ага, я тоже засердился: «Я просто приведу это в порядок» ...

Если вы изменили пространство имен корневого узла сборки, убедитесь, что вы отредактировали ссылку в свойстве «наследует» самого файла asmx. Это не всегда очевидно, поскольку VS не показывает содержимое этого файла.

кстати. Временная установка InlineScript = "True" в диспетчере сценариев приведет к тому, что в этих случаях приложение вызовет фактическое исключение, что значительно упростит поиск неисправностей.

(Хотя ОП уже ответил на свой вопрос, я подумал, что этот опыт стоит добавить для дальнейшего использования.)

...