2011-07-20 33 views
1

我有一個WCF操作MyGetVersion(),它返回一個System.Version。在從Silverlight服務引用調試對其的調用時,我驗證了該服務返回了正確的System.Version對象。在服務引用,自動生成方法,包括:Silverlight ServiceReference導致MethodAccessException

 public System.Version EndMyGetVersion(System.IAsyncResult result) { 
      object[] _args = new object[0]; 
      System.Version _result = ((System.Version)(base.EndInvoke("MyGetVersion", _args, result))); 
      return _result; 
     } 

引發異常:

嘗試通過方法「DynamicClass.ReadVersionFromXml(System.Runtime.Serialization.XmlReaderDelegator,System.Runtime.Serialization.XmlObjectSerializerReadContext, System.Xml.XmlDictionaryString [],System.Xml.XmlDictionaryString [])'訪問方法'System.Version..ctor()'失敗。

我不得不打開「CLR異常中斷」助手來看看這個。否則,它是一個TargetInvocationException。據我所知,System.Version()構造函數是公開的。我究竟做錯了什麼?

回答

1

問題是System.Version的構造函數在.NET Framework中是公共的,但它不在Silverlight中(根據Reflector,它是內部的)。因此,雖然類型在完整框架中是可序列化的,但它不在Silverlight中,並且添加服務引用工具應該用SL中的等效類型替換它 - 這是該工具中的一個錯誤(我會將其報告給產品團隊,謝謝你找到它)。

至於解決方法,我建議使用的版本是「代孕」型,而在只用於數據傳輸服務合同使用它:

[DataContract] 
public class VersionDTO 
{ 
    [DataMember] 
    public int Major { get; set; } 
    [DataMember] 
    public int Minor { get; set; } 
    [DataMember] 
    public int Build { get; set; } 
    [DataMember] 
    public int Revision { get; set; } 

    public VersionDTO(Version version) { 
     this.Major = version.Major; 
     this.Minor = version.Minor; 
     this.Build = version.Build; 
     this.Revision = version.Revision; 
    } 
} 

[ServiceContract] 
public interface ITest 
{ 
    [OperationContract] 
    VersionDTO GetVersion(); 
} 

另一種選擇,給你在提到的問題註釋,可以將生成的Silverlight代理中的Version類的引用替換爲與其等效的類。下面的類可以用來從.NET反序列化SL中的Version對象。

[DataContract(Name = "Version", Namespace = "http://schemas.datacontract.org/2004/07/System")] 
    public class SLVersion 
    { 
     [DataMember(Order = 1, Name = "_Build")] 
     public int Build { get; set; } 
     [DataMember(Order = 2, Name = "_Major")] 
     public int Major { get; set; } 
     [DataMember(Order = 3, Name = "_Minor")] 
     public int Minor { get; set; } 
     [DataMember(Order = 4, Name = "_Revision")] 
     public int Revision { get; set; } 
    } 
+0

謝謝,不幸的是合同被其他服務和其他客戶使用期望一個System.Version。我可能不得不添加另一個操作,我只是將它作爲字符串返回給Silverlight客戶端。 – GWTF

+0

您也可以更改上面的答案中添加的SL生成的代理。這種方法唯一的問題是,無論何時從Silverlight更新服務引用,都必須重新替換類。 – carlosfigueira

相關問題