List を返す ServiceStack を使用して Web サービスを作成しました<SyncUserDTO>
。より多くのプロパティがありますが、Timestamp という 1 つのフィールドに単純化しました。
[DataContract]
public class SyncUserDTO
{
public SyncUserDTO()
{
Timestamp = new TimestampDTO();
}
[DataMember(Order = 1)]
public TimestampDTO Timestamp { get; set; }
}
[DataContract]
public class TimestampDTO
{
[DataMember]
public bool DataValid { get; set; }
[DataMember]
public DateTime? Value { get; set; }
}
このサービスは (他のテストでは) 完全に動作しているように見えますが、クライアント コンソール アプリケーションを作成してサービス参照を追加すると、SyncUserDTO にコンストラクターがないため、動作しません。
static void SendUsersServiceReference()
{
var users = new List<SyncUserDTO>();
for (var i = 0; i < 5; i++)
{
var user = new SyncUserDTO();
user.Timestamp.Value = DateTime.Now; // NullReferenceException,
user.Timestamp.DataValid = true; // as Timestamp is null
}
}
SyncUserDTO で F12 キーを押すと、Reference.cs にコンストラクター メソッドが見つからないようで、上記が機能しない理由を説明しています。
しかし、クライアント アプリケーションのプロキシ クラスにコンストラクターが作成されないのはなぜですか?
クライアントで自分で「構築」を行う必要があり、それが機能します:
var user = new SyncUserDTO() { Timestamp = new TimestampDTO() };
もちろん、私のサービスを利用する人が自分で作成する必要はありません。彼らは、基礎となる TimestampDTO に注意を払う必要があります。コンストラクターはこれを行う必要があります。
ところで、私はGoogleとSOを検索して、「サービス参照を追加してプロキシクラスで作成されたコンストラクターではありません」などの用語を「ServiceStack」の有無にかかわらず検索しましたが、このクエストで私を助ける結果はありません...
pps。Demis (ServiceStack) さん、あなたがこれを読んでいるなら、そうです、SOAP は消えつつあります。REST は新しい闇です。しかし、私は両方をサポートしたいと考えています。私はServiceStackが大好きです:D