2012-08-10 78 views
1

我正在嘗試使用返回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頁面某處的返回類型。正如你可能已經猜到的,我還是新來的在線開發,所以我很抱歉,如果我忽略了非常明顯的事情。

回答

1

您是否嘗試過使WebMethod靜態?

另一點我會考慮的是返回的函數是否可以返回3個值而不是一個。