2014-01-20 2 views
1

Я вызываю на веб-сайте ASP.NET 4.0 веб-службу (asmx-сервис на том же веб-сайте) двумя способами. Первый метод выполняется успешно и всегда возвращает действительный объект JSON, когда метод веб-службы asmx украшен [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)].Вызов веб-службы с поддержкой AJAX по POST работает, но с GET всегда возвращается xml

Но второй метод не потому, что возвращаемые данные XML, а не JSON, хотя я украсили метод asmx по [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] (я не могу понять, почему JSON не возвращается при использовании GET но при использовании POST?)

  • POST вызова службы

    var serviceurl = "http://localhost:49441/WebService1.asmx/LoginUser" ; 
    $.ajax({ 
        url: serviceurl, 
        type: 'POST', 
         contentType: "application/json; charset=utf-8", 
        data: JSON.stringify({ userName: userName, password: password }), 
        dataType: "json", 
        success: function (msg) { 
         alert('Web service call succeeded. ' + msg.d); 
        }, 
        error: function (error) { alert('ERROR has occurred!'); alert(JSON.stringify(error)) } 
    }); 
    
  • GET вызова службы

    var serviceurl = "http://localhost:49441/WebService1.asmx/LoginUser" ; 
    $.ajax({ 
        url: serviceurl, 
        type: 'GET', 
         contentType: "application/json; charset=utf-8", 
        data: 'userName='+ userName + '&password=' + password, 
        dataType: "json", 
        success: function (msg) { 
         alert('Web service call succeeded. ' + msg.d); 
        }, 
        error: function (error) { alert('ERROR has occurred!'); alert(JSON.stringify(error)) } 
    }); 
    

  • EDIT 1:

    код веб-службы, как показано ниже. При использовании POST я просто меняю код на использование UseHttpGet = false для вызываемого метода.

    [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 WebService1 : System.Web.Services.WebService 
    { 
        [WebMethod] 
        [PrincipalPermission(SecurityAction.Assert, Unrestricted = true)] 
        [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
        public bool LoginUser(string userName, string password) 
        { 
         bool authenticated = false; 
    
         if (userName.ToLower() == "mike" && password.ToLower() == "abcd") 
         { 
    
          authenticated = true; 
         } 
         return authenticated; 
        } 
    } 
    
+3

Код JS здесь не имеет значения. Чтобы понять, почему XML отправляется вместо JSON при публикации, нам нужно будет увидеть: a) код веб-службы или b) документацию веб-службы. – Adam

+0

Хорошо. Позвольте мне добавить код веб-службы asmx. – Sunil

+0

Возможно, что веб-служба с поддержкой ajax может быть вызвана только POST, а не GET из jQuery, но не уверен. – Sunil

ответ

3

Оказывается, что его нужно использовать POST согласно тому, что я читал по следующему адресу в блоге Дэйва УордаExplanation on why POST is necessary if we are to receive JSON and not Xml when using jQuery, еще ASP.Net AJAX включен веб-сервис может реагировать с XML даже когда его украшают, чтобы вернуть JSON. Я вставил части из вышеуказанного URL-адреса, которые относятся к моему вопросу.

(Таким образом, урок, который я узнал от всего этого, является использование POST при вызове AJAX включен веб-сервисах, то есть ASMX услуги, с JQuery.)

Два простого требования

Как я упоминал ранее, одно из условий заключается в том, что эти ScriptServices возвращают только сериализованные результаты JSON, если они правильно запрошены . В противном случае даже служба, отмеченная атрибутом , вернет XML вместо JSON. Я могу только предположить, что это часть причины заблуждения, что службы ASMX не могут ответить с помощью JSON.

У Скотта Гатри есть отличная статья по конкретным требованиям для принудительного использования JSON из ScriptServices. Подводя итог, что запросы к методов обслуживания должны отвечать двум требованиям:

(1) Content-Type - запрос HTTP должен объявить тип содержимого приложения/JSON. Это сообщает ScriptService, что он получит свои параметры как JSON, а должен отвечать на него.

(2) HTTP метод - По умолчанию запрос HTTP должен быть запрос POST- . Это можно обойти это требование, но желательно желательно придерживаться запросов HTTP POST при работе с JSON.

Все.

Пока эти два требования удовлетворены, что-нибудь из кода XMLHttpRequest низкого уровня, на сторонние библиотеки, как JQuery, на самом ASP.NET AJAX можно легко получить JSON сериализованная данные ASMX услуг.

+0

Это правильно (рад, что вы нашли мое сообщение). Он всегда чувствовал себя немного «неправильно», чтобы использовать POST для того, что по существу является ресурсными запросами GET, но в рамках этого было сделано для обеспечения большей безопасности между сайтами по умолчанию в то время. Чтобы использовать GET для аналогичного API (при условии, что вам не нужен SOAP), Web API - отличный выбор в новых приложениях. Он очень похож на автоматическую сериализацию и все, но поддерживает GET, более гибкие входные параметры с кодировкой URL и обычно является стандартным подходом. –

+0

Дэйв - Ваши блоги очень полезны/блестящи и содержат информацию, которую трудно найти в другом месте. Благодарю. – Sunil