Веб-служба ASMX, не возвращающая JSON, может только POST, используя application / x-www-form-urlencoded contentType - PullRequest
8 голосов
/ 23 мая 2009

Я могу вызвать свой веб-сервис, используя jQuery, если contentType = "application / x-www-form-urlencoded; charset = utf-8"

Это, однако, вернет xml: <string>[myjson]</string>

Если я пытаюсь отправить POST в службу, используя «application / json; charset = utf-8», я получаю ошибку 500 с пустыми StackTrace и ExceptionType. Моя функция веб-сервиса никогда не срабатывает, поэтому я не совсем уверен, как отладить эту ситуацию.

Мои методы и классы имеют соответствующие атрибуты и настроены на использование JSON в качестве типа ответа (как и мои файлы wsdl и disco). У меня установлены расширения Ajax и необходимые записи в web.config.

Это на ферме SharePoint, но я не уверен, что это имеет большое значение. Я развернул изменения web.config на всех WFE, а также установил расширения ajax. Опять же, служба работает, она просто не будет принимать ничего, кроме типа содержимого по умолчанию.

Не уверен, что мне здесь не хватает, ребята ...

мой вызов ajax:

$.ajax({
type: "POST",
url: "/_vti_bin/calendar.asmx/Test",
dataType: "json",
data: "{}",
contentType: "application/json; charset=UTF-8",
success: function(msg){
    alert(msg);
    },
error: function(xhr, msg){ alert(msg + '\n' + xhr.responseText); }
});

Мой класс веб-сервиса:

[WebService(Namespace = "http://namespace")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService()]
public class CalendarService : WebService
{
    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string Test()
    {
        return "Hello World";
    }
}

Ответы [ 7 ]

3 голосов
/ 29 сентября 2009

У меня это работает в 2.0 с использованием веб-сервисов, но я установил защиту от .d (см. DataFilter ниже). Я также возвращаю массив объектов. ПРИМЕЧАНИЕ: класс для объекта является статическим, иначе он не будет работать правильно для меня, по крайней мере.

  $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: "{}",
        dataFilter: function(data)
        {
            var msg;
            if (typeof (JSON) !== 'undefined' &&
                typeof (JSON.parse) === 'function')
                msg = JSON.parse(data);
            else
                msg = eval('(' + data + ')');
            if (msg.hasOwnProperty('d'))
                return msg.d;
            else
                return msg;
        },
        url: "webservice/ModifierCodesService.asmx/GetModifierList",
        success: function(msg)
        {
            LoadModifiers(msg);
        },
        failure: function(msg)
        {
            $("#Result").text("Modifiers did not load");
        }
    });

Вот фрагмент моего веб-сервиса:

...

[WebService(Namespace = "http://mynamespace.com/ModifierCodesService/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class ModifierCodesService : System.Web.Services.WebService
{

     /// <summary>
    /// Get a list of Modifiers
    /// </summary>
    /// <returns></returns>
    [WebMethod(EnableSession = true)]
    public Modifier[] GetModifierList()
    {
        return GetModifiers();
    }
       /// <summary>
        /// Modifiers list from database
        /// </summary>
        /// <returns></returns>
        private Modifier[] GetModifiers()
        {
            List<Modifier> modifier = new List<Modifier>();
            ModifierCollection matchingModifiers = ModifierList.GetModifierList();
            foreach (Modifier ModifierRow in matchingModifiers)
            {
                modifier.Add(new Modifier(ModifierRow.ModifierCode, ModifierRow.Description));
            }
            return modifier.ToArray();
        }
    }

...

код объекта:

 public static class ModifierList
    {

        /// <summary>
        /// Returns the Modifier Collection.
        /// </summary>
        /// <param name="prefix"></param>
        /// <returns></returns>
        public static ModifierCollection GetModifierList()
        {
1 голос
/ 29 июля 2010

Я боролся с этим сегодня, когда приложение для iPhone разговаривает с веб-службой .Net.

Я обнаружил, что если я изменил свой тип контента на application / jsonrequest, он прошел без проблем, и я смог обработать данные на своем веб-сервере.

Просто ради ухмылки я добавил вышеупомянутую строку в мой web.config, но это не заставило приложение / json работать.

0 голосов
/ 17 июня 2009

Я немного использую JQuery AJAX JSON для обращения к веб-сервису ASMX. Он отлично работает во всех браузерах. Я использую .NET 2.0 с установленными расширениями ASP.NET AJAX (в комплекте 3.5).

В моем классе такие же декораторы, как и у вас. Мои методы имеют только декоратор [WebMethod(EnableSession = true)]. Мой web.config, однако, имеет следующую запись в своем разделе httpHandlers:

<add verb="*" path="*jsonservice.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

Мой вызов jquery выглядит следующим образом:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "path/to/service/jsonservice.asmx/MethodName",
    data: JSON.stringify(DTO),
    dataType: "json",
    success: function(rtrn) { alert("good"); },
    error: function(req, msg, err) { alert("bad"); }
});

Эта статья является корнем моих знаний.

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

Я думаю, что вы ищете атрибут WebInvoke или WebGet, он позволяет указать шаблон Uri, стиль тела, запрос и форматы ответа, например:

[WebGet(ResponseFormat= WebMessageFormat.Json)]

Эта ссылка может помочь. Есть похожая статья для WebInvoke (используется в основном для постов).

0 голосов
/ 29 мая 2009

Если вы тестируете это в IE, попробуйте удалить объявление charset из вашего атрибута contentType (то есть оно должно выглядеть так:

contentType: "application/json",

Мне еще только предстоит выяснить, почему, но, похоже, IE с трудом справляется со своими задачами при выполнении вызовов JSON с частью "charset=UTF-8".

alt text

0 голосов
/ 25 мая 2009

Похоже, вы должны указать json в качестве формата ответа в теге scriptMethod. Это с vb.net, но я уверен, что вы поняли:

ResponseFormat: = ResponseFormat.Json

0 голосов
/ 23 мая 2009

не уверен, что это может быть так просто, но я использую jQuery для обратного вызова JSON из моих веб-методов

основное отличие, которое я вижу, это атрибут класса

[System.Web.Script.Services.ScriptService]

    [WebService(Namespace = "http://MyNameSpace")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.Web.Script.Services.ScriptService]
    public class Web : System.Web.Services.WebService{

       [WebMethod]
       public string TestMethod(){
         return "Testing";
       }

    }

Я должен предположить, что вы используете платформу 3.5, потому что это единственный способ представить веб-методы JSON.

Мои звонки из jQuery выглядят практически одинаково, поэтому никаких проблем нет.

...