我正在嘗試使用返回json的Mono 3.0.3.5創建Web服務。Mono WebService拒絕返回json
但到目前爲止,我一直無法得到一個服務來返回任何東西,但XML。這似乎是過去很多討論的問題,但即使在查看我在這裏和其他地方的衆多資源的嘗試之後,我也無法知道我在省略什麼。
我創建了一個空的ASP.NET解決方案,我添加了一個帶有代碼隱藏頁的asmx。據我所知,裝飾服務類名稱與ScriptService屬性和方法/函數名稱與ScriptMethod和指定Json的ResponseFormat屬性是代碼中唯一必要的步驟。
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程序的參考的項目。這是建立到.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更改有所不同。指定了「文化=中性」屬性 - 在第一頁中指定type屬性的字符串,但作爲第二個頁面上添加標籤的屬性。但是我發現,當指定第二種方式時,啓動服務時出現錯誤。
我最後的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,accepting和dataType參數以指定json,但這沒什麼區別。奇怪的是,即使請求標頭顯示「接受」參數仍然指定xml後,我已明確設置它在Ajax調用。
這裏是AJAX調用(注接受和數據類型類型設置爲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"); }
});
這裏是由通話產生請求頭(接受還在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似乎並不存在於其中。修改網絡中的行。配置文件中添加了工廠以指定「FOOScriptHandlerFactory」,因爲類型在啓動服務時不會產生任何錯誤,這似乎表明Mono不報告web.config中的不合適的類型。但是我對.NET和Mono的這方面知之甚少,無法確定。但由於這家工廠是自動Json系列化的關鍵,這可能很重要。
我不知道我在這裏略過了什麼。我覺得我沒有正確地在服務器端配置某些東西,或者它將報告json作爲WSDL頁面某處的返回類型。正如你可能已經猜到的,我還是新來的在線開發,所以我很抱歉,如果我忽略了非常明顯的事情。