Проблемы с типом ответа ASP.net JSON Webservice - PullRequest
3 голосов
/ 03 апреля 2009

Я пытаюсь написать веб-сервис ASP.net, который будет использоваться вызовом jQuery AJAX. Я абсолютно в своем уме, пытаясь заставить это работать. Я видел несколько похожих вопросов в Интернете, но мне не удалось найти подходящее решение.

Когда я пытаюсь выполнить вызов ajax (через jquery), я получаю успешный ответ от сервера, но запрос не выполняется из-за ошибки синтаксического анализатора.

Я проверил json, возвращенный веб-сервисом, и он действителен. Кажется, проблема связана с тем, что asp.net возвращает объект json как xml.

Я указал тип возвращаемого значения как json, используя

<Script.Services.ScriptMethod(responseFormat:=Script.Services.ResponseFormat.Json)> _

Я добавил следующий обработчик http, поскольку он упоминался как потенциальное исправление

  <httpHandlers>
      <remove verb="*" path="*.asmx"/>
      <add verb="*" path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory" validate="false"/>   
</httpHandlers>

Тип содержимого установлен в "application / json; charset = utf-8" и dataType в "json" в моей настройке jquery ajax. Тип запроса, кажется, правильный, но ответ всегда xml.

Я могу успешно выполнить запрос, удалив dataType, но очень хотел бы избежать использования eval для десериализации данных.

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


JAVASCRIPT

(function($) {
$.ajaxSetup({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    global: false,
    dataType: "json"


});

function auto() { console.log("test"); return; };

$.fn.species = {
    test: function() { alert("test"); },
    load: function() { //load and attach species list to element as dropdown
        $.ajax({
            url: "SpeciesService.asmx/List",
            success: function(msg) { console.log(msg); },
            error: function (xhr, desc, exceptionobj) {
                        console.log(xhr.responseText);
                        console.log(desc);
                        console.log(exceptionobj);

            }
        });
                return this;

    }

}; //Species Block
* * 1 022}) (Jquery); // Блок псевдонимов jQuery

ASP.NET Webservice

<%@ WebService Language="VB" Class="SpeciesService" %>

Импорт System.Web Импортирует System.Web.Services Импортирует System.Web.Services.Protocols Виды импорта Импортирует System.Runtime.Serialization

'Чтобы разрешить вызов этой веб-службы из сценария с использованием ASP.NET AJAX, раскомментируйте следующую строку. '_

_ _ Public Class SpeciesService

Inherits System.Web.Services.WebService
<WebMethod()> _
<Script.Services.ScriptMethod(responseFormat:=Script.Services.ResponseFormat.Json)> _
Public Function Data(ByVal id As Integer) As String
    Dim curSpecies As New Species(id)
    Return curSpecies.serialize
End Function

<WebMethod()> _
<Script.Services.ScriptMethod(responseFormat:=Script.Services.ResponseFormat.Json)> _
Public Function List() As String

    Return Species.list()
End Function

Конечный класс

Ответы [ 4 ]

2 голосов
/ 03 апреля 2009

Попробуйте опубликовать фиктивные данные JSON с помощью JQuery следующим образом:

$.ajaxSetup({
    type: "POST",
    data : "{'foo':'bar'}"
...
1 голос
/ 03 апреля 2009

Если вы смотрите заголовки, отправляется ли длина контента? IIS требует длины содержимого в сообщении, поэтому даже добавление пустого тела в сообщение может исправить это.

И я думаю, что причина того, что он работает с типом данных, установленным в json, заключается в том, что jquery добавляет пустое тело сообщения в этом случае.

1 голос
/ 03 апреля 2009

Это скорее подсказка, чем ответ - я использую PageMethods, а не веб-сервисы, и это работает очень хорошо. Я бы попробовал это, если бы страдал с той же проблемой.

0 голосов
/ 04 апреля 2009

Хорошо, спасибо вам, ребята, за вашу помощь. Отсутствие фиктивных данных было ядром проблемы. Когда я попытался добавить его до того, как он вызвал ошибку сервера, я перешел к чему-то другому.

Я даже не могу понять, что решило проблему с ошибкой сервера. Я просто десять минут рассеянно возился с синтаксисом (исправлял отступы, заглавные буквы, комментарии), потому что был слишком расстроен, чтобы сосредоточиться на проблеме. Я обновил страницу, и вдруг она работает нормально. Так что ответом было опубликовать фиктивные данные и исправить случайную загадочную синтаксическую ошибку.

В любом случае, я не могу отблагодарить вас за то, что вы вернули меня на правильный путь.

...