asp.net asmx Web服务返回XML而不是JSON

为什么这个简单的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的forms返回。 我如何获得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> 

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

  • ASP.NET Web服务错误地返回XML而不是JSON
  • asmx web服务在.net 4.0中返回xml而不是json
  • http://williamsportwebdeveloper.com/cgi/wp/?p=494
  • http://encosia.com/using-jquery-to-consume-aspnet-json-web-services/
  • http://forums.asp.net/t/1054378.aspx
  • http://jqueryplugins.info/2012/02/asp-net-web-service-returning-xml-instead-of-json/

再加上其他一些通用的文章

终于搞明白了。

应用程序代码是正确的张贴。 问题在于configuration。 正确的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。 不pipe什么原因,这不适合我。 但是将注册添加到我的应用程序的web.config解决了这个问题。

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

如果它帮助其他人,如果我再次有同样的问题,这里是我将审查的清单:

  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. 您是否已经从<system.web><httpHandlers>的web.config文件中删除了所有处理程序?

希望这可以帮助任何人有同样的问题。 并感谢海报的build议。

上面的解决scheme没有成功,在这里我如何解决它。

把这一行放入你的web服务,而不是返回types只是在响应上下文中写入string

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

如果你想留在Framework 3.5中,你需要在代码中进行如下修改。

 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. [ScriptService] public class WebService : System.Web.Services.WebService { public WebService() { } [WebMethod] public void HelloWorld() // It's IMP to keep return type void. { string strResult = "Hello World"; object objResultD = new { d = strResult }; // To make result similarly like ASP.Net Web Service in JSON form. You can skip if it's not needed in this form. System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer(); string strResponse = ser.Serialize(objResultD); string strCallback = Context.Request.QueryString["callback"]; // Get callback method name. eg jQuery17019982320107502116_1378635607531 strResponse = strCallback + "(" + strResponse + ")"; // eg jQuery17019982320107502116_1378635607531(....) Context.Response.Clear(); Context.Response.ContentType = "application/json"; Context.Response.AddHeader("content-length", strResponse.Length.ToString()); Context.Response.Flush(); Context.Response.Write(strResponse); } } 

从web服务返回纯string有更简单的方法。 我称之为CROWfunction(使其易于记忆)。

  [WebMethod] public void Test() { Context.Response.Output.Write("and that's how it's done"); } 

正如你所看到的,返回types是“void”,但是CROW函数仍然会返回你想要的值。

我有一个.asmx Web服务(.NET 4.0)与返回一个string的方法。 这个string是一个序列化的List,就像你在许多例子中看到的一样。 这将返回未包装在XML中的json。 没有更改web.config或需要第三方DLL。

 var tmsd = new List<TmsData>(); foreach (DataRow dr in dt.Rows) { m_firstname = dr["FirstName"].ToString(); m_lastname = dr["LastName"].ToString(); tmsd.Add(new TmsData() { FirstName = m_firstname, LastName = m_lastname} ); } var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string m_json = serializer.Serialize(tmsd); return m_json; 

使用该服务的客户端部分如下所示:

  $.ajax({ type: 'POST', contentType: "application/json; charset=utf-8", dataType: 'json', url: 'http://localhost:54253/TmsWebService.asmx/GetTombstoneDataJson', data: "{'ObjectNumber':'105.1996'}", success: function (data) { alert(data.d); }, error: function (a) { alert(a.responseText); } }); 

对我来说,它适用于我从这篇文章得到的代码:

我怎样才能从我的WCFrest服务(.NET 4),使用Json.Net,而不是一个string,用引号包装返回JSON?

 [WebInvoke(UriTemplate = "HelloWorld", Method = "GET"), OperationContract] public Message HelloWorld() { string jsonResponse = //Get JSON string here return WebOperationContext.Current.CreateTextResponse(jsonResponse, "application/json; charset=utf-8", Encoding.UTF8); } 

我已经尝试了上述所有步骤(甚至是答案),但是我没有成功,我的系统configuration是Windows Server 2012 R2,IIS 8.下面的步骤解决了我的问题。

更改了pipe理pipeline = classic的应用程序池。

我知道这是一个非常古老的问题,但今天我遇到了同样的问题,我到处寻找答案,但没有结果。 经过长时间的研究,我find了做这个工作的方法。 要从服务中返回JSON,您必须以正确的格式提供请求中的数据,请使用JSON.stringify()在请求之前parsing数据,并且不要忘记contentType: "application/json; charset=utf-8" ,使用应该提供预期的结果。

希望这会有所帮助,即使您调用的方法没有参数,您仍然需要在请求中发送一些JSON对象。

 var params = {}; return $http({ method: 'POST', async: false, url: 'service.asmx/ParameterlessMethod', data: JSON.stringify(params), contentType: 'application/json; charset=utf-8', dataType: 'json' }).then(function (response) { var robj = JSON.parse(response.data.d); return robj; }); 
 response = await client.GetAsync(RequestUrl, HttpCompletionOption.ResponseContentRead); if (response.IsSuccessStatusCode) { _data = await response.Content.ReadAsStringAsync(); try { XmlDocument _doc = new XmlDocument(); _doc.LoadXml(_data); return Request.CreateResponse(HttpStatusCode.OK, JObject.Parse(_doc.InnerText)); } catch (Exception jex) { return Request.CreateResponse(HttpStatusCode.BadRequest, jex.Message); } } else return Task.FromResult<HttpResponseMessage>(Request.CreateResponse(HttpStatusCode.NotFound)).Result;