为什么这个简单的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?

EDIT:

以下是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>

根据文件,登记处理人员从现在起应该是不必要的.将网4向上移动到机器上.配置.不管出于什么原因,这对我不起作用.但是在网上注册.我的应用程序的配置解决了这个问题.

关于这个问题的许多文章都指示将处理程序添加到<system.web>部分.这不起作用,还会导致一大堆其他问题.我try 将处理程序添加到这两个部分,这会产生一组其他迁移错误,这完全误导了我的故障排除.

如果这对其他人有帮助,如果我再次遇到同样的问题,下面是我要回顾的 list :

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

希望这能帮助有同样问题的人.感谢海报的建议.

Asp.net相关问答推荐

JWT 和 Google 在 Razor 页面中进行身份验证和授权

使用 Asp.Net MVC 和 KnockoutJS 处理日期

如何在没有 Select 按钮的情况下在 GridView 中实现全行 Select ?

如何获取已构建、编码的 ViewState 的值?

AppendHeader 是否与 AddHeader 完全相同?

在每页级别增加 ASP.Net 超时

'Access-Control-Allow-Origin' 标头包含多个值 '*, *',但只允许一个

如何使用特定视图(不是控制器名称)返回 ActionResult

解析器错误消息:文件/TestSite/Default.aspx.cs不存在

如果站点在 localhost 或 127.0.0.1 上运行,如何判断 ASP.NET MVC 视图

我可以根据角色隐藏/显示 asp:Menu 项吗?

使用 JavaScript 禁用 ASP.NET 验证器

Gridview ItemTemplate 中多个判断字段的最佳技术?

问题映射 HttpHandler --> HTTP Error 404 Not Found

如何在 ASP.NET 下拉列表中添加选项组?

会话变量保存在哪里?

如何在 ASP.NET 站点中添加 favicon.ico

System.Linq.IQueryable 不包含Where的定义

判断 IQueryable 结果集的最佳方法是什么?

Session.Clear() 与 Session.RemoveAll()