"Не удалось загрузить клиентскую среду ASP.NET Ajax" с WCF - все перепробовал, все равно получаю
Теперь я получаю сообщение "Не удалось загрузить клиентскую среду ASP.NET Ajax". Ошибка javascript на моем веб-сайте asp.net 4, как только я его запустил (откройте страницу входа).
Раньше это происходило только после того, как я нажал Ctrl-F5 (обновить страницу и все изображения / таблицы стилей / скрипты) в браузере во время отладки.
Мое приложение использует asp.net 4 (изначально написано на 1.1 или 2), WCF, JsTree, некоторые элементы управления Telerik и расширения / инструментарий MS AJAX.
За несколько дней поиска я нашел большое количество решений от людей с такой же проблемой (в том числе здесь, на SO и справочных форумах Telerik):
Я попробовал следующее, ни один не работал для меня:
- Попытка размещения ToolkitScriptManager на странице вместо ScriptManager
- Перейдите в панель управления "Программы и компоненты" и выполните "восстановление" в "Microsoft .net framework 4 Профиль клиента" и "Microsoft.net Framework 4 Extended".
- Перемещение ScriptManager вниз страницы
- В Web.config установка компиляции debug="false"
- Запустил новый проект ASP.NET 4, добавил и обновил панель на страницу, посмотрел на web.config и попытался сделать мой web.config похожим на него
- Проверено правильность системной даты ПК
- использовал элементы location в моем web.config, чтобы разрешить неаутентифицированный доступ к WebResource.axd, ScriptResource.axd и Telerik.Web.UI.WebResource.axd (у меня есть элементы управления Telerik на этом сайте)
- Добавлены маршруты. Игнорировать ("{resource}.axd/{*pathInfo}"); на мою регистрацию маршрута в global.asax
Любые другие решения этой проблемы?
Я могу опубликовать web.config или код, если это необходимо.
Обновление 1: дополнительная информация
Я посмотрел на то, что происходило, используя вкладку "net" firebug. Запросы GET для ScriptResource.axd и Webresource.axd не выполняются с 404. Это проливает дополнительный свет на проблему?
Обновление 2: Частичное решение? Я использовал историю управления исходным кодом, чтобы вернуться к web.config, прежде чем я добавил службу WCF на сайт. Наконец-то сработал web.config, перед тем как я добавил это:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="FoldersAspNetAjaxBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="Folders">
<endpoint address="" behaviorConfiguration="FoldersAspNetAjaxBehavior" binding="webHttpBinding" contract="Folders" />
</service>
</services>
</system.serviceModel>
... и удалил связанную строку маршрутизации из моего global.asax:
routes.Add(new System.ServiceModel.Activation.ServiceRoute("", new System.ServiceModel.Activation.WebServiceHostFactory(), typeof(Folders)));
Таким образом, один или оба из них были виновником. Кто-нибудь может подсказать, как служба WCF или ее маршрутизация могли вызвать эту ошибку MS Ajax?
Это мой первый сервис WCF. Я едва понимаю, что делает приведенный выше код, но я подозреваю, что проблема маршрутизации лежит в основе проблемы где-то...
Альтернативно - кто-нибудь может предложить альтернативу WCF? Я могу жить без этого, если я смогу доставлять свои данные JSON в jquery другим способом. Может быть, HttpHandler, или WebService, или веб-форма, которая выплевывает JSON как response.write или что-то еще?
Обновление 2: Маршрутизация
Похоже, что проблема маршрутизации в global.asax, необходимая для службы WCF, является проблемой (см. Выше). Комментирование одной строки, похоже, решает проблему. Собираюсь попробовать изменить маршрут маршрута...
Решено: Я решил это сам, вижу мой принятый ответ, но, конечно же, не смог бы сделать это так быстро без предложений по правильному пути с помощью некоторых очень проницательных ответов, спасибо всем.
7 ответов
В моем случае то, что на самом деле исправлялось, меняло способ вызова службы WCF.
Из учебников, которые я читал в WCF, я упустил тот факт, что мне не нужна маршрутизация в Global.asax для вызова веб-службы, и я мог просто назвать это так:
http://localhost/myWebApp/WcfService.svc/MethodName?param=value
(Я полагался на маршрутизацию в global.asax, чтобы позволить мне называть его так: http://localhost/myWebApp/MethodName?param=value. Я избавился от маршрутизации и вместо этого использовал вышеуказанный способ, а также проблему исчез)
Спасибо всем за проницательные ответы.
Я думаю, что проблема связана с изменением версии.net Framework.
Ошибка в том, что не удалось загрузить библиотеку на стороне клиента. Есть также около 404 ошибок, которые указывают на то, что проблема заключалась в том, что файлы не были получены с сервера.
Так что все утки должны быть в ряд
- правильная версия asp_net зарегистрирована
- настройки в web.config используют правильную версию фреймворка
- пул приложений настроен на использование правильной версии фреймворка
Возможно, WCF похитили два обработчика. Вы можете попробовать добавить обработчики обратно вручную. Если вы сливаетесь в
<httpHandlers>
<add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="true"/>
</httpHandlers>
к вашей веб-конфигурации, WebResource.axd все еще возвращает 404?
Вы можете почти наверняка обойтись без WCF. Добавьте простой веб-сервис и добавьте метод для каждого асинхронного вызова, который вы хотите сделать для JSON или XML. Два атрибута, о которых вам нужно знать, это WebMethod и scriptservice.
хотя об их использовании с jQuery можно узнать здесь
Установите расширение браузера, которое может регистрировать запросы к серверу. Например, FireBug для Firefox. Затем вам нужно проверить все запросы браузера, сделанные на ваш сервер, и посмотреть, есть ли какие-либо ошибки или слишком короткие ответы.
Не уверен насчет ошибок ajax, однако вам действительно не нужен wcf, если вы имеете дело с простыми веб-сервисами xml / json... я заменил большинство наших wcf-сервисов на полноценные веб-сервисы xml / json... большинство этих сервисов на самом деле представляют собой простой aspx-файл, в котором я выводлю свои результаты в формате xml / json
.net Framework поставляется со встроенными программами чтения и записи XML / JSON, которые вы можете использовать для преобразования ваших структур данных (если таковые имеются) в XML / JSON.
пример: вы можете использовать класс XmlTextWriter для прямой записи в Response.OutputStream. например:
XmlTextWriter xtw = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
xtw.WriteStartDocument();
У меня проблема. Из-за маршрутизации из файла global.asax все скрипты перенаправлялись на какую-то другую страницу, и поэтому было трудно найти файлы скриптов ajax для этой страницы.