2011-04-10 64 views
5

我知道即时不是第一次这个问题,但我似乎无法找到一个有效的解决方案ResponseFormat.Json返回XML

使用web服务设置为返回JSON时

,.NET还是把它封装在一个XML包装。

我搜索并尝试了很多东西

  1. 我尝试添加各种HttpHandler的设置,我的web.config,在某些职位的建议,但这些都没有效果。我也不认为它是必要的,因为我正在一个全新的win7/iis7.5/.net4盒子上工作。我读到,自.NET 3.5以来应该没有任何问题。但是还有!
  2. 我试过,没有responseformat.json装饰。我的web服务返回有效的json(我可以解析它与parsejson,解压缩字符串后)
  3. 我试着明确设置contenttype和数据类型。这会导致错误,抱怨响应无效json。哪个是对的!

正在发生的事情是非常混乱,在IE浏览器,至少在我的devbox,响应返回为XML文档在那里我可以只使用msg.text,轻松地获得JSON字符串,但在生产中我测试中FF,它作为一个文档返回,没有“文本”属性。

继承人我的JavaScript/jQuery的

$.ajax({ 
error: function (xhr, ajaxOptions, thrownError) { 
    alert(xhr.status+'-'+xhr.statusText); 
    alert(thrownError); 
    }, 
    url: '<%=ResolveUrl("~/WebService.asmx")%>' + "/JackJill", 
    contentType: "application/json", 
    success: function (msg) { 
     alert(msg.d); 
    } 
}); 

这么回事,我怎么能简单地问.NET返回,而不是包装一个有效的常规JSON字符串。我相信这将解决所有问题。它也将使我的服务更容易被全世界访问,所以他们不必做任何特殊的解析。

非常感谢你提出的任何建议或指针

真诚

编辑: 继承人,我只是测试的样本Web服务:

<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> <WebMethod()> Public Function JackJill() As String 
    Return "[{""Name"":""Jack""},{""Name"":""Jill""}]" 
End Function 

然后当我把这个在浏览器

http://localhost:81/webservice.asmx/JackJill

我得到

<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://tempuri.org/"> 
[{"Name":"Jack"},{"Name":"Jill"}] 
</string> 

为什么到处都是XML的东西在这里?

+0

我猜你的服务WebService.asmx正在返回XML。你能提供关于它的细节吗?代码和配置将会有所帮助。 – Paulczy 2011-04-10 12:35:40

+0

感谢paulczy,我只是添加了一些示例代码到我原来的帖子。感谢您对此感兴趣! – 2011-04-10 19:47:31

+1

我现在也在msconnect中添加了一个建议https://connect.microsoft.com/VisualStudio/feedback/details/676218/json-in-webservices – 2011-06-21 07:11:44

回答

7

我意识到这个问题是旧的,但以防万一别人是看这个答案在未来....

我发现(根据本http://encosia.com/asmx-and-json-common-mistakes-and-misconceptions/http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx),如果你希望消费JSON来自。ASMX有必要:

  • 内容类型设置为“应用/ JSON”和
  • 设置方法为“POST”

截至上述Yisman说,他并不想限制他的服务POST请求,但(根据这两个引用),似乎如果你想使用.ASMX和接收JSON,这是你将不得不做的。

+0

一个耻辱,但非常真正。因为在我对Paulczy的回答的评论中已经提到过。 – 2011-06-21 07:07:06

3

我意识到这是有点旧,但我也在这个问题上敲我的头,即使输出类型被指定为Json,它仍然被包装在XML中。上述解决方案的问题在于我需要通过GET调用它。

虽然不使用Web服务的解决方案为我做的工作。 我所做的只是创建另一个aspx页面并把它添加到我的项目,在aspx页面我建立了JSON对象,并做了如下(所有内部Page_Load方法):

Response.ContentType = "application/json"; 
Response.Write(JsonObject.ToString()); 
Response.End(); 

然后调用客户端的“页面”只需使用URL即可。 “http://aspjsonpage.aspx?parameter = value”

然后你得到你需要的Json。

+0

足够真实,我也使用了'response.end'黑客。但自从转移到WCF后,并没有回头呢;-) – 2012-05-06 07:56:03

1

嗨我只是有同样的问题,当使用web服务集返回json,.net仍然包装在一个XML包装。我的老师告诉我正确的答案,那就是重新安装.NET Framework 4.0,所有问题都解决了。 thansJoséBeas !!!!

1

涉及很多小时的问题非常相似。我使用.net2.0,并且Web服务无法在运行Windows Server 2008 R2的生产服务器上运行IIS 7.5。 Web服务返回XML的所有问题都必须处理web.config。我构建了一个基于ajax的web应用程序,并将配置文件复制到我的配置中,并且完美运行。这需要更新的代码行低于:

<httpHandlers> 
     <remove verb="*" path="*.asmx"/> 
     <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/> 
    </httpHandlers> 
    <httpModules> 
     <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    </httpModules> 

和:

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules> 
     <remove name="ScriptModule"/> 
     <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    </modules> 
    <handlers> 
     <remove name="WebServiceHandlerFactory-Integrated"/> 
     <remove name="ScriptHandlerFactory"/> 
     <remove name="ScriptHandlerFactoryAppServices"/> 
     <remove name="ScriptResource"/> 
     <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    </handlers> 
</system.webServer> 

我在安装了Microsoft的Visual Web Developer 2008

<configSections> 
    <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
     <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
      <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
      <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
       <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/> 
       <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
       <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
       <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
      </sectionGroup> 
     </sectionGroup> 
    </sectionGroup> 
</configSections> 
在web.server

生产服务器并创建一个新的Web站点,然后选择ASP.NET Web服务。我认为,如果你在生产服务器上创建了一个项目并且它能正常工作,那么配置应该有一切正确。希望这可以帮助。