14

我有以下方法:

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 仍然作为 XML 返回。

我想使用这个 asmx 服务的 json 格式有什么想法吗?

4

4 回答 4

52

我遇到了同样的问题,并包含以下代码以使其正常工作。

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

但是,这适用于复杂类型,但字符串没有任何区别。

于 2013-10-24T10:57:49.457 回答
2

亲爱的未来读者:当前接受的答案不是正确的方法。它将您与使用相关联,JavaScriptSerializer并且您失去了请求 xml 的能力(或者实际上将来可能出现的任何序列化格式)。“正确的方式”还涉及更少的代码!

如果您使用您拥有的[ScriptService]属性装饰您的服务类,那么ASP.NET 3.5+ 应该自动序列化对 JSON 的响应,前提是您的Ajax 调用请求 JSON。手动序列化为 JSON 的建议是完全错误的,除非您希望使用不同的序列化器,例如 Newtonsoft。

您看到的 XML 表明以下情况之一:

  • 您没有在 Ajax 调用中请求 JSON - 请参阅下面的工作示例代码
  • 根据 此处的答案,可能缺少一些 web.config 条目(免责声明:我在生产 web.config 中没有这些条目中的大部分;只有在没有其他方法的情况下才开始使用这些条目)

这是启用 JSON 的 ASMX Web 服务的简单工作示例:

<%@ 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 请求它并处理响应(我们将简单地弹出一个带有来自 MyClass.Message 的消息的 JS 警报):

<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 弹出窗口中。

于 2018-02-21T11:56:06.810 回答
1

只是一个疑问。您什么时候没有收到 JSON 响应?因为当您从客户端调用 Web 服务时(我假设是 Web 浏览器,即 xhr),您应该将请求中的内容类型标头指定为“application/json; charset=yourcharset”。

我相信上述解决方案总是返回 json,无论客户端指定什么内容类型。dotnet asmx 框架允许使用 content-type 标头方法进行此操作,因此当有一个简洁的解决方案可用时,上述内容可以归类为 hack。

从 ASMX Web 服务返回 Json 数据的类似问题

这也可能有帮助-> http://forums.asp.net/p/1054378/2338982.aspx#2338982

PS:我假设您使用的是 dotnet 版本 4。

于 2013-12-18T11:52:16.640 回答
0

有时我们无权更改WebService 定义,有时我们不应该更改WebServices!所以最好的解决方案是在您的请求中设置contentType="application/json; charset=..." 。只是这个!

例如,您可以使用下面的代码(如果您使用的是 jquery)而不是更改 WebService 中的某些内容:

$.ajax({
        type: "POST",
        url: '/ServiceName.asmx/WebMethodName',
        date: {},
        contentType: "application/json; charset=utf-8",
        success: function (data) {                
                // Some code;

        }
    });

然后您可以使用JSON.parse(data.d)访问数据的 json 结构。

于 2020-10-13T14:18:07.713 回答