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

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

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 Есть идеи?

3 ответов


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

[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;
}

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


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

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

аналогичный вопрос в возврат данных Json из веб-службы ASMX

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

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


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

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

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

  • вы не запрашиваете JSON в своем вызове Ajax - см. рабочий пример кода ниже
  • возможно, какая-то сеть.записи конфигурации отсутствуют, согласно ответу здесь (Disclaimer: не имею большинство из них в производстве сеть.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.Сообщение):

<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 popup.