Как получить ответ JSON с веб-службы asmx 3.5

У меня есть следующий метод:

using System.Web.Services;
using System.Web.Script.Services;
using System.Web.Script.Serialization;
using Newtonsoft.Json;
using System.Collections;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]

// [System.Web.Script.Services.ScriptService]
public class Tripadvisor : System.Web.Services.WebService {

    public Tripadvisor () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }


    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string HotelAvailability(string api)
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        string json = js.Serialize(api);
        //JsonConvert.SerializeObject(api);
        return json ;
    }

Здесь я устанавливаю атрибут ResponseFormat: json s все еще возвращается как XML.

Я хочу использовать json-формат, используя этот сервис asmx. Любые идеи?

Ответ 1

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

[WebMethod]
[ScriptMethod(UseHttpGet=true ,ResponseFormat = ResponseFormat.Json)]
public void HelloWorld()
{
    Context.Response.Clear();
    Context.Response.ContentType = "application/json";
    Context.Response.Write("Hello World");
    //return "Hello World";
}

Обновить:

Чтобы получить чистый формат json, вы можете использовать сериализатор javascript, как показано ниже.

public class WebService1 : System.Web.Services.WebService
{
    [WebMethod]
    [ScriptMethod(UseHttpGet=true ,ResponseFormat = ResponseFormat.Json)]
    public void HelloWorld()
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        Context.Response.Clear();
        Context.Response.ContentType = "application/json";           
        HelloWorldData data = new HelloWorldData();
        data.Message = "HelloWorld";
        Context.Response.Write(js.Serialize(data));


    }
}

public class HelloWorldData
{
   public String Message;
}

Однако это работает для сложных типов, но строка не имеет разницы.

Ответ 2

Просто сомневаюсь. Когда вы не получаете ответ JSON? Поскольку при вызове веб-службы от клиента (я предполагаю веб-браузер, т.е. Xhr), вы должны указать заголовок типа контента в запросе как "application/json; charset = yourcharset".

Я считаю, что вышеупомянутое решение всегда возвращает json, независимо от того, какой тип содержимого указан клиентом. Структура dotnet asmx позволяет это использовать метод заголовка типа контента, поэтому вышеизложенное можно классифицировать как взломать, когда доступно опрятное решение.

Аналогичный вопрос в Return Json Data из веб-службы ASMX

Это тоже может помочь → http://forums.asp.net/p/1054378/2338982.aspx#2338982

PS: Я предполагаю, что вы используете dotnet версию 4.

Ответ 3

Дорогие будущие читатели: принятый в настоящее время ответ - неправильный путь. Он связывает вас с использованием JavaScriptSerializer и вы теряете возможность запрашивать xml (или даже любой формат сериализации, который может появиться в будущем). "Правильный путь" также включает меньше кода!

Если вы украшаете свой класс службы атрибутом [ScriptService] - который у вас есть - тогда ASP.NET 3. 5+ должен автоматически сериализовать ответ на JSON, если ваш Ajax-вызов запрашивает JSON. Рекомендации по сериализации для JSON вручную просто ошибочны, если вы не хотите использовать другой сериализатор, такой как Newtonsoft.

То, что вы видели XML, предлагает одно из следующего:

  • Вы не запрашиваете JSON в своем вызове Ajax - см. Рабочий код примера ниже
  • Возможно, некоторые записи web.config отсутствуют, в соответствии с ответом здесь (отказ от ответственности: у меня не так много всего в производстве web.config, только начинайте играть с ними, если ничего не работает)

Вот простой рабочий пример веб-службы ASMX с поддержкой JSON:

<%@ WebService Language="C#" Class="WebService" %>
using System;
using System.Collections.Generic;
using System.Web.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
    [WebMethod]
    public MyClass Example()
    {
        return new MyClass();
    }

    public class MyClass
    {
        public string Message { get { return "Hi"; } }
        public int Number { get { return 123; } }
        public List<string> List { get { return new List<string> { "Item1", "Item2", "Item3" }; } }
    }
}

JavaScript, чтобы запросить его и обработать ответ (мы просто выставим предупреждение JS с сообщением из MyClass.Message):

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test</title>
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.4.js" type="text/javascript"></script>  
</head>
<body>
    <script type="text/javascript">
        $.ajax({
            type: "POST",
            url: "WebService.asmx/Example",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: "{ }",
            error: function (XMLHttpRequest, textStatus, errorThrown) { alert(langError + " " + textStatus); },
            success: function (msg) {
                alert(msg.d.Message);
            }
        });
    </script>
</body>
</html>

Запрос Http:

POST http://HOST.com/WebService.asmx/Example HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/json; charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: http://HOST.com/Test.aspx
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Connection: Keep-Alive
Content-Length: 3
Host: HOST.com

{ }

Ответ HTTP:

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 20 Feb 2018 08:36:12 GMT
Content-Length: 98

{"d":{"__type":"WebService+MyClass","Message":"Hi","Number":123,"List":["Item1","Item2","Item3"]}}

Результат:

"Привет" отображается в всплывающем окне JS.