Asp.net WebService函数不返回JSON

时间:2012-06-27 08:32:08

标签: asp.net-mvc json web-services

我已阅读有关此问题的每篇文章,但没有解决问题。 如果有人可以帮助我,我会很高兴。

我添加了一个带有Web服务的MVC3项目。 我只有一个名为Test的函数,当我通过HTTP GET方法(常规url)调用它时,它返回XML格式而不是JSON的数据。 如何让它返回JSON?

网络服务:

namespace TestServer
{
    [WebService]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class TestWebservice : System.Web.Services.WebService
    {  
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        [WebMethod]
        public List<string> Test()
        {    
            return new List<string>
                {
                    {"Test1"},
                    {"Test2"}
                };                    
        }
    }
}

web.config(仅限相关部分):

<configuration>
  <location path="TestWebservice.asmx">
    <system.web>
      <webServices>
        <protocols>
          <add name="HttpGet"/>
        </protocols>
      </webServices>
    </system.web>
  </location>  
  <system.web>
    <webServices>
      <protocols>
        <clear/>
      </protocols>
    </webServices>
    <httpHandlers>
      <remove verb="*" path="*.asmx"/>
      <add verb="*" path="*.asmx"
        type="System.Web.Script.Services.ScriptHandlerFactory"
        validate="false"/>
    </httpHandlers>
  </system.web>
</configuration>


网址:

http://localhost:49740/testwebservice.asmx/Test


结果(这不是我想要的):

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <string>Test1</string>
  <string>Test2</string>
</ArrayOfString>


如果有人可以帮助我,我会很高兴。

2 个答案:

答案 0 :(得分:3)

发送请求时,您需要将内容类型HTTP标头指定为application/json。例如,如果您使用的是jQuery AJAX,则可以执行以下操作:

$.ajax({
    url: '/testwebservice.asmx/Test',
    type: 'GET',
    contentType: 'application/json',
    success: function(result) {
        alert(result.d[0]);
    }
});

您还需要在[ScriptMethod]属性上启用GET动词:

[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
[WebMethod]
public List<string> Test()
{
    return new List<string>
    {
        {"Test1"},
        {"Test2"}
    };
}

您还可以摆脱web.config中有关此服务的所有内容。没有必要。

哦顺便说一句,经典的ASMX Web服务是一种过时的技术。您应该使用更新的技术,例如返回JSON,WCF的ASP.NET MVC控制器操作,甚至是最新的ASP.NET MVC 4 Web API。

答案 1 :(得分:0)

REST服务根据客户端发送的Accept标头以特定格式(XML,JSON)序列化数据。 Accept标头向服务说明客户端可以接受的格式。

当您尝试直接从浏览器URL访问服务时,Accept标头的值设置为某个默认值,如下所示(在Firefox中)

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

上面的标题明确表示我可以接受html,xhtml或xml。由于application/xml格式是显式指定但不是application/json,因此REST服务以xml格式返回数据。 (我不明白ResponseFormat = ResponseFormat.Json的用途是什么。)

因此,如果要使服务返回JSON数据,则必须指定accept标头的相应格式。如果您使用的是jQuery,则可以使用$.getJSON()将接受标头设置为"application/json",或者甚至可以将$.ajaxdataType一起用作json。< / p>

http://prideparrot.com/blog/archive/2011/9/returning_json_from_wcfwebapi