2009-04-03 1 views
3

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

Когда я пытаюсь сделать вызов 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 

}) (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 

End Class

ответ

2

Попробуйте разместить фиктивные данные JSon с JQuery, как это:

$.ajaxSetup({ 
    type: "POST", 
    data : "{'foo':'bar'}" 
... 
+0

Я считаю, что эта проблема исправлена ​​в jQuery 1.4.x. В jQuery 1.3.x все, что вам нужно, это данные: '{}'. * Любые * данные заставят jQuery установить тип содержимого; законные ключи и значения не нужны. –

1

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

1

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

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

0

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

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

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