2016-07-12 11 views
0

WCF SOAPサービスを使用するには、VS2015で「サービス参照の追加」ツールを使用しています。この方法は、基本クラスのメンバーは、派生クラスで公開されていないサービスへの参照を追加するときWCFサービス参照で公開されていない基本クラスメンバ

Add a service reference

問題があります。ここで

は私のタイプのための私のインターフェイスである:

[ServiceKnownType(typeof(DbEntry))] 
public interface ILogEntry 
{ 
    [DataMember] 
    Int64 Id { get; set; } 

    [DataMember] 
    String Error { get; set; } 

    [DataMember] 
    String CustomMessage { get; set; } 

    [DataMember] 
    Int32 ApplicationId { get; set; } 

    Int32 ServiceId { get; set; } 

    [DataMember] 
    Guid ApplicationGuid { get; set; } 

    [DataMember] 
    String ApplicationName { get; set; } 
...etc. 

ここでは、インターフェイスを実装基底クラス:ここ

[DataContract] 
[KnownType(typeof(DbEntry))] 
public abstract class LogEntry : ILogEntry 
{ 
    private Int64 _Id; 
    [DataMember] 
    public Int64 Id 
    { 
     get { return _Id; } 
     set { _Id = value; } 
    } 

    private String _Error; 
    [DataMember] 
    public String Error 
    { 
     get { return _Error; } 
     set { _Error = value; } 
    } 

    private String _CustomMessage; 
    [DataMember] 
    public String CustomMessage 
    { 
     get { return _CustomMessage; } 
     set { _CustomMessage = value; } 
    } 

    private Int32 _ApplicationId; 
    [DataMember] 
    public Int32 ApplicationId 
    { 
     get { return _ApplicationId; } 
     set { _ApplicationId = value; } 
    } 

    private Int32 _ServiceId; 
    public Int32 ServiceId 
    { 
     get { return _ServiceId; } 
     set { _ServiceId = value; } 
    } 

    private Guid _ApplicationGuid; 
    [DataMember] 
    public Guid ApplicationGuid 
    { 
     get { return _ApplicationGuid; } 
     set { _ApplicationGuid = value; } 
    } 
...etc 

は私の派生クラスである:

[DataContract] 
public class DbEntry : LogEntry 
{   
    private String _Message; 
    [DataMember] 
    public String Message 
    { 
     get { return _Message; } 
     set { _Message = value; } 
    } 
} 

でクライアントは、DbEntryクラスで公開されている唯一のdatamemberはMessageです。 WSDLに直接アクセスして生成されたCSファイルを使用すると、すべてがうまくいきます。

「サービス参照の追加」ツールを使用すると、基本クラスメンバーがDbEntry派生クラスで公開されない理由を教えていただけますか?

答えて

0

私はあなたのコードをインターフェイスに対してプログラミングしようとしていることをお勧めしますが、WCFからこれを行うことはできません。私はまだインターフェイスに対してプログラムを行っていますが、WCFレベルでは、Interfaceインスタンスを受け取り、それを同等のWCFモデルに変換する変換コードが含まれています。

サービスを検出すると、サービスは渡されたり受け取ったりできるオブジェクトに基づいて作成されます。あなたの問題はまた、WCFがあなたのためにそれを推論することもないので、継承を扱います。 LogEntryとDbEntryの両方を、サービス関数によって渡されるか返される個別のオブジェクトとして参照する必要があります。言い換えれば、LogEntryとDbEntryのための別個のオペレーション契約が必要です。

おかげで、 JibbaそれはあなたのWCFサービス

0

ですか?その場合は、サービスのモデルとインターフェイスを別のプロジェクトに配置し、WCFサービスとクライアントアプリケーションの両方からそのライブラリを参照します。私はしばしばそれをMyServiceName.Interfaceのような名前にします。サービス参照を追加するとき

(それはあなたのWCFサービスではありませんが、あなたは、これはまだ動作し、クライアントアプリからモデルを参照することができるしている場合でも。)

次に、「詳細」をクリックして確認してください」という参照されたアセンブリの再利用タイプ "がチェックされます。

参照を追加すると、プロキシクラスが作成されると、インターフェイスライブラリで宣言されたモデルが再利用されます。 [DataContract][DataMember]の属性は関係ありません。定義した正確なクラス(新しいプロキシクラスを作成しない)を使用しているため、継承されたプロパティにアクセスできます。

関連する問題