asp.net asmx web服务如何返回xml而不是json?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

为什么这个简单的Web服务拒绝将JSON返回给客户端?

这是我的客户代码:

        var params = { };
        $.ajax({
            url: "/Services/SessionServices.asmx/HelloWorld",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            timeout: 10000,
            data: JSON.stringify(params),
            success: function (response) {
                console.log(response);
            }
        });

服务:

namespace myproject.frontend.Services
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class SessionServices : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

web.config中:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
</configuration>

答案是:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">Hello World</string>

无论我做什么,响应总是以XML的形式返回。我如何获得Web服务来返回Json?

这是Fiddler HTTP跟踪:

REQUEST
-------
POST http://myproject.local/Services/SessionServices.asmx/HelloWorld HTTP/1.1
Host: myproject.local
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json; charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: http://myproject.local/Pages/Test.aspx
Content-Length: 2
Cookie: ASP.NET_SessionId=5tvpx1ph1uiie2o1c5wzx0bz
Pragma: no-cache
Cache-Control: no-cache

{}

RESPONSE
-------
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 19 Jun 2012 16:33:40 GMT
Content-Length: 96

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">Hello World</string>

我已经失去了多少文章,我已经阅读,现在试图解决这个问题。说明不完整或由于某种原因不能解决我的问题。一些更相关的包括(都未成功):

再加上其他几篇一般文章。

提问于
用户回答回答于

最后算出来了。

该应用程序代码是正确的发布。问题出在配置上。正确的web.config是:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.webServer>
        <handlers>
            <add name="ScriptHandlerFactory"
                 verb="*" path="*.asmx"
                 type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                 resourceType="Unspecified" />
        </handlers>
    </system.webServer>
</configuration>

根据文档,从.NET 4向上注册处理程序应该是不必要的,因为它已被移动到machine.config中。无论出于何种原因,这不适合我。但是为我的应用添加注册到web.config解决了这个问题。

很多关于此问题的文章都指示将处理程序添加到该<system.web>部分。这不起作用,并导致其他问题的整个负载。我试着将处理程序添加到两个部分,这会产生一组其他错误,这些错误完全误导了我的疑难解答。

如果它可以帮助其他人,如果我再次遇到同样的问题,请查看以下清单:

  1. type: "POST"在ajax请求中指定了吗?
  2. contentType: "application/json; charset=utf-8"在ajax请求中指定了吗?
  3. dataType: "json"在ajax请求中指定了吗?
  4. .asmx网络服务是否包含[ScriptService]属性?
  5. 你的web方法是否包含[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 属性?(即使没有这个属性,我的代码也能正常工作,但很多文章都说它是必需的)
  6. 你有没有添加ScriptHandlerFactory到web.config文件<system.webServer><handlers>
  7. 你是否从in的web.config文件中删除了所有处理程序<system.web><httpHandlers>
用户回答回答于

上述解决方案没有成功,在这里我是如何解决它的。

把这一行放到你的web服务中,而只是在响应上下文中写入字符串

this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(serial.Serialize(city));

扫码关注云+社区