1

WCFでチャットサービスを構築しました。datacontract 属性としてマークされたクラスがあります

[DataContract]
public class Message
{
    string   _sender;
    string   _content;
    DateTime _time;

    [DataMember(IsRequired=true)]
    public string Sender
    {
        get { return _sender;  }
        set { 
            _sender = value;
        }
    }

    [DataMember(IsRequired = true)]
    public string Content
    {
        get { return _content;  }
        set { 
            _content = value;
        }
    }

    [DataMember(IsRequired = true)]
    public DateTime Time
    {
        get { return _time;  }
        set { 
            _time = value;
        }
    }
}

そして、私のサービス契約は以下のようなものです

[ServiceContract(Namespace="", SessionMode = SessionMode.Required, CallbackContract = typeof(IChatCallback))]
public interface IChat
{
    [OperationContract]
    bool Connect(Client client);

    [OperationContract(IsOneWay=true, IsInitiating=false, IsTerminating=true)]
    void Disconnect();

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void Whisper(string target, string message);
}

VisualStudio 2010 からクライアント コードを生成しようとすると、クラス メッセージが生成されません。しかし、サービス コントラクトのメソッド "Whisper" のパラメーター "message" のタイプを文字列ではなくメッセージに変更すると生成されました。

パラメータ メッセージのタイプを「文字列」ではなく「メッセージ」に変更します。

[OperationContract(IsOneWay = true, IsInitiating = false)]
void Whisper(string target, Message message);

Message クラスが正しく動作する必要があるコールバック クラスがあります。

public interface IChatCallback
{
    void RefreshClient(List<Client> clients);
    void ReceiveWhisper(Message message);
    void ReceiveNotifyClientConnect(Client joinedClient);
    void ReceiveNotifyClientDisconnect(Client leaver);
}

そして問題は、サービス コントラクトのメソッド パラメータまたは戻り値に含まれていない場合に、datacontract 属性としてマークされたクラスが生成されない理由です。

4

2 に答える 2

1

さて、私は解決策を見つけました。

コールバック クラスに operationcontract 属性を追加するのを忘れていました。

public interface IChatCallback
{
    [OperationContract(IsOneWay = true)]
    void RefreshClient(List<Client> clients);

    [OperationContract(IsOneWay = true)]
    void ReceiveWhisper(Message message);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientConnect(Client joinedClient);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientDisconnect(Client leaver);
}
于 2011-11-28T07:48:58.483 に答える
1

サービス参照は、サービスを使用するために必要なクラスのみを生成します。としてマークされているすべてのクラスを生成するわけではありませDataContract

しかし、サービス コントラクトのメソッド "Whisper" のパラメーター "message" のタイプを文字列ではなくメッセージに変更すると生成されました。

それはまさにそれがどのように機能するかです。サービスがそのクラスを必要とする場合、それが生成されます。そのクラスを必要としない場合、生成されません。

于 2011-11-28T05:38:23.233 に答える