2011-02-08 89 views
1

在我的asmx文件,我有傳遞IDictionary的對象,以Web服務

 [WebMethod] 
     [ScriptMethod] 
     public void Method(IDictionary<string, CustomClass> objectOfCustomClass) 
     { 
      //do stuff 
     } 

自定義類的定義爲:

public class CustomClass 
    { 
     public string Prop1 { get; set; } 
     public string Prop2 { get; set; }  
    } 

一切順利和Web服務被成功地從jQuery的AJAX消耗方法。最近,我決定測試和嘗試,並從直接URL如http://localhost/Services.asmx/Method

訪問它,我得到這個消息

「無法序列接口System.Collections.Generic.IDictionary」

這似乎關閉。是什麼導致它,這是正常的?我很困惑 - 它看起來像乾淨的做事方式,但根據微軟不應該這樣做,但它的工作原理,只有直接訪問Web服務時纔有效。是什麼賦予了?我也讀過一些MS站點,你不能將IDictionary作爲參數傳遞給Web服務,但它工作正常......所以可以做到或不做?有人能澄清這一勞永逸嗎?

回答

2

不幸的是,這是正常的。您看到的是經典ASP.NET Web服務堆棧中XML序列化(XmlSerializer)的限制 - 它拒絕使用實現IDictionary的任何東西。

通過[ScriptMethod]公開的JavaScript服務使用不同的序列化程序(JavaScriptSerializer),該程序沒有此限制。

從JavaScript調用服務時,調用JSON端點(使用[ScriptMethod]聲明)。但是,當您從瀏覽器進行測試時,您會到達傳統的XML enpoint(使用[WebMethod]聲明)。

有一些解決方法,請參閱this question。但是,如果您只需要支持AJAX客戶端,則可以簡單地刪除XML端點([WebMethod]屬性)並避免該問題。

附註:WCF中的改進序列化程序支持字典序列化。

+0

明白了。我實際上並不需要通過瀏覽器訪問Web服務 - 我只是使用ajax方法(以JSON格式)在我的JQuery中調用它,所以也許我會保持原樣。我只是想找出問題所在。 – sarsnake 2011-02-09 00:37:16

1

ASMX Webservices使用XmlSerializer對對象進行序列化和反序列化,並且沒有一種好的方法可以用適當的XML模式來表示Dictionary。不幸的是,我不認爲有一個很好的解決方法,除了將您的IDictionary轉換爲可以由XmlSerializer序列化的另一種類型的對象。

從本文摘自 「XML序列化在.NET Framework」(http://msdn.microsoft.com/en-us/library/ms950721.aspx):

問:爲什麼我不能序列化哈希表?

答:XmlSerializer無法處理 類實現IDictionary 接口。這部分是由於 時間表約束,部分是由於 這一事實,即哈希表不包含在XSD類型 系統中的對應項。唯一的解決方案是 實現一個自定義散列表,它確實不會實現IDictionary 接口。