2011-07-20 4 views
1

System.Versionを返すWCF操作MyGetVersion()があります。 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.Version..ctor()' System.Xml.XmlDictionaryString []、System.Xml.XmlDictionaryString [])が失敗しました。

これを確認するには、「break on CLR exception」ヘルパーを有効にする必要がありました。それ以外の場合は、TargetInvocationExceptionです。私が知る限り、System.Version()コンストラクタはpublicです。私は間違って何をしていますか?

答えて

1

問題は、System.Versionのコンストラクタは.NET Frameworkではパブリックですが、Silverlightにはありません(内部はReflectorによる)。したがって、型が完全なフレームワークでシリアライズ可能なのはSilverlightではなく、Service Referenceの追加ツールは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でバージョンオブジェクトを逆シリアル化するために使用できます。

[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

関連する問題