1

サービス契約に操作契約があります

Schedule[] GetScheduleObjects();

サブオブジェクトのリストを返す「タスク」と呼ばれる操作コントラクトにデータメンバーがあります。

[DataMember()]
public Task[] Tasks

問題は、操作コントラクトが呼び出されてメソッドが実行されるが、「タスク」の「取得」が 2 回発生する場合です。最初は有効なランタイム インスタンスが含まれていますが、2 回目は null であり、シリアライゼーション例外が発生します。これは、サービスへの呼び出しが 1 回だけであるにもかかわらず発生します。バインディングは、二重プロキシを使用する tcp 接続です。アイデア???????

データコントラクト

[DataContract()]
public class Schedule
{
    public Schedule(string name)
    {
        this.Name = name;
    }

    [DataMember()]
    public string Name { get; private set; }

    [DataMember()]
    public bool Running { get; set; }

    /// <summary>
    /// Schedule Task is a DataMember object, do not modify
    /// </summary>
    [DataMember()]
    public Task[] Tasks
    {
        get { return _Tasks.ToArray(); }
    }

    private List<Task> _Tasks = new List<Task>();

     ///<summary>
     /// Use this property to add objects 
     ///</summary>
    public List<Task> ScheduleTasks 
    {
        get { return _Tasks; }
    }
}

サービス契約

[ServiceContract(CallbackContract = typeof(ISummitDashboardCallbackContract))]
public interface ISchedulerContract : ISummitDashboardContract
{
    /// <summary>
    /// Sets the named schedule into "run" mode
    /// </summary>
    /// <param name="scheduleName"></param>
    /// <returns></returns>
    [OperationContract()]
    void StartSchedule(string scheduleName);

    /// <summary>
    /// Pauses the currently running schedule
    /// </summary>
    /// <param name="scheduleName"></param>
    [OperationContract()]
    void PauseSchedule(string scheduleName);

    /// <summary>
    /// Removes the named schedule from "run" mode
    /// </summary>
    /// <param name="scheduleName"></param>
    /// <returns></returns>
    [OperationContract()]
    void StopSchedule(string scheduleName);

    /// <summary>
    /// Flips the "active" state of the task with the named id
    /// </summary>
    /// <param name="scheduleName"></param>
    /// <param name="Id"></param>
    [OperationContract()]
    void ToggleTaskState(string scheduleName, string Id);

    /// <summary>
    /// Flips the "active" state of the action with the named id
    /// </summary>
    /// <param name="scheduleName"></param>
    /// <param name="Id"></param>
    /// <returns></returns>
    [OperationContract()]
    void ToggleActionState(string scheduleName, string Id);

    /// <summary>
    /// Returns the information to build the tree list in the dashboard
    /// </summary>
    /// <returns></returns>
    [OperationContract()]
    Schedule[] GetScheduleObjects();

    /// <summary>
    /// Returns the events of the scheduler
    /// </summary>
    /// <returns></returns>
    [OperationContract()]
    SchedulerEvent[] GetSchedulerEvents(int startIndex, int count, int eventLogEntryType);

}
4

1 に答える 1

0

プロパティにセッターを追加する必要がTasksあります。また、少なくとも保護されNameた の可視性を高める必要があります。WCF は、このクラスのオブジェクトを逆シリアル化するためにこれらを使用する必要があります。

二次的な問題として、クライアントがプロキシを生成する場合 (例: を使用Add Service Referenceまたは経由SvcUtil.exe)、「コード ビハインド」Tasks(つまりreturn _Tasks.ToArray();に結合されているものScheduledTasks) が失われ、代わりにクライアントは単純な自動バッキング プロパティをプロパティに取得しますTasks(を使用)。プロキシ生成時に選択されたコレクション クラス)。ただし、 type を共有する場合、この 2 番目の問題は発生しません。

于 2013-09-17T15:29:31.133 に答える