Mono WebService拒绝返回json

时间:2012-08-10 00:13:24

标签: json web-services mono

我正在尝试使用返回json的Mono 3.0.3.5创建一个Web服务。

但到目前为止,除了xml之外,我一直无法获得返回任何服务的服务。这似乎是过去很多讨论的问题,但即使在检查了我在这里和其他地方对众多资源的尝试之后,我也不知道我在忽略什么。

我创建了一个空的ASP.NET解决方案,我在其中添加了一个带有codebehind页面的asmx。据我所知,使用ScriptService属性修改服务类名称,使用ScriptMethod修改方法/函数名称,并为ResponseFormat属性指定Json是代码中唯一必要的步骤。

using System;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;

namespace MonoJsonTest
{
   [WebService]
   [ScriptService]
   public class GimmeJson : System.Web.Services.WebService
   {
      [WebMethod]
      [ScriptMethod(ResponseFormat=ResponseFormat.Json)]
      public    string  simpleTestString()
      {
         return DateTime.Now.ToString();
      }
   }
}

(我知道将日期放入json的问题,我只是想要一些随后调用我的服务而改变的字符串)

然后我将System.Web.Extensions添加到项目的References中。这是为.NET 3.5版本构建的,所以我确保我包含了3.5版本的System.Web.Extensions。

然后修改了web.config的httpHandlers以通过ScriptHandlerFactory(如我发现的几页所述)

http://vampirebasic.blogspot.com/2009/04/aspnet-ajax-in-mono.html

http://encosia.com/asmx-scriptservice-mistakes-installation-and-configuration/

敏锐的眼光可能会注意到两个页面上指定的web.config更改存在差异。 “Culture = neutral”属性指定-inside-第一页上type属性的字符串,但作为第二页上add标记的属性。但是我发现当第二种方式指定时,启动服务时会出错。

我的最终web.config:

<?xml version="1.0"?>
<configuration>
    <system.web>
    <compilation defaultLanguage="C#" debug="true">
      <assemblies>
        <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral,    PublicKeyToken=31bf3856ad364e35" />
      </assemblies>
    </compilation>
    <customErrors mode="RemoteOnly">
    </customErrors>
    <authentication mode="None">
    </authentication>
    <authorization>
      <allow users="*" />
    </authorization>
    <httpHandlers>
      <!-- should produce json responses -->
      <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" />
    </httpHandlers>
    <trace enabled="false" localOnly="true" pageOutput="false" requestLimit="10" traceMode="SortByTime" />
    <sessionState mode="InProc" cookieless="false" timeout="20" />
    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />
    <pages>
    </pages>
  </system.web>
</configuration>

但是从WSDL页面访问服务(本地)或从javascript(使用JQuery库)使用ajax查询,它总是返回XML。使用Charles和Firefox调试工具检查响应头显示了一个text / xml的响应类型。

经过研究,似乎我需要在进行调用时从服务中请求json,所以我设置ajax调用的contentType,accept和dataType参数来指定json,但这没有任何区别。奇怪的是,即使请求标头显示“Accepts”参数在我在Ajax调用中显式设置之后仍然指定了xml。

这是ajax调用(注意接受,dataType类型设置为json):

$.ajax({
url: "http://localhost:8080/GimmeJson.asmx/simpleTestString",
type: "POST",
contentType: "application/json; charset=utf-8",
accepts: "application/json; charset=utf-8",
data: "{}",
dataType: "json",
success: function (data, textStatus, jqXHR) { console.log( "success" ); alert.show("success"); },
error: function(request, type, errorThrown) { console.log( "error" ); }
});    

这是该调用生成的请求标头(Accept仍然是xml):

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip,deflate
Accept-Language:en-us,en;q=0.5
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Cache-Control:no-cache
Host:localhost:8080
Origin:null
Pragma:no-cache
Proxy-Connection:keep-alive
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:14.0) Gecko/20100101 Firefox/14.0.1

这会产生200的HTTP代码,并且此响应头(注释内容类型为xml):

Cache-Control:private
Content-Length:103
Content-Type:text/xml; charset=utf-8
Date:Thu, 09 Aug 2012 23:38:59 GMT
Keep-Alive:timeout=15, max=100
Proxy-Connection:Keep-alive
Server:Mono.WebServer2/0.2.0.0 
UnixX-AspNet-Version:2.0.50727

有一件事我注意到我不确定是一个重要的观点,但看起来很奇怪。我在Mono中浏览了System.Web.Extensions dll,发现其中似乎没有ScriptHandlerFactory。修改web.config中添加工厂以指定“FOOScriptHandlerFactory”作为类型的行在启动服务时不会产生任何错误,这似乎表明Mono没有在web.config中报告未发现的类型。但我对.Net和Mono的这方面还不太了解。但由于这个工厂是自动Json序列化的关键,这可能很重要。

我不确定我在这里省略了什么。我觉得我没有正确配置服务器端的东西,或者它会在WSDL页面的某个地方报告json的返回类型。你可能已经猜到我还是网上开发的新手,所以如果我忽略了非常明显的事情,我很抱歉。

1 个答案:

答案 0 :(得分:1)

您是否尝试过将WebMethod设为静态?

我要考虑的另一点是返回的函数是否可以返回3个值而不是只返回一个。