1

サーバーで受信した datacontract オブジェクトを取得しようとしていますが、それを操作してから、アップキャストされたバージョンを返そうとしていますが、機能していないようです。KnownType または ServiceKnownType 属性を使用して動作させることはできますが、すべてのデータをラウンドトリップしたくはありません。以下に例を示します。

[DataContract]
public class MyBaseObject
{
    [DataMember]
    public int Id { get; set; }
}

[DataContract]
public class MyDerivedObject : MyBaseObject
{
    [DataMember]
    public string Name { get; set; }
}


[ServiceContract(Namespace = "http://My.Web.Service")]
public interface IServiceProvider
{
    [OperationContract]
    List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects);
}

public class ServiceProvider : IServiceProvider
{
    public List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects)
    {
        ... do some work ...

        myDerivedObjects[0].Id = 123;
        myDerivedObjects[1].Id = 456;
        myDerivedObjects[2].Id = 789;

        ... do some work ...

        return myDerivedObjects.Cast<MyBaseObject>().ToList();
    }
}

新しいオブジェクトを再作成したり、KnownType 属性を使用したりせずに、これを機能させる方法を知っている人はいますか?

4

4 に答える 4

0

WCF (および .net リモーティング) の問題の 1 つは、「メッセージ パッシング」をメソッド呼び出しのように見せようとすることです。

これは、あまりにも多くの「oop」タイプのデザインを使用しようとすると失敗します。

メッセージが .net クラスによって表されるという事実は、 すべての動作が .net クラスのようになるわけではありませ

抽象化の漏れの問題について詳しくは、thisおよびthisを参照してください。

したがって、WCF インターフェイスを設計するときは、オブジェクトではなくメッセージの受け渡しについて考え始める必要があります。そうしないと、このような多くの問題に遭遇することになります。

于 2010-05-11T10:04:29.720 に答える
0

DataContractSurrogate (IDataContractSurrogate) を作成し、GetDataContractType への呼び出しの基本型を返すこともできます。それがどのように使用されることを意図していたのかよくわからないので、「余分な作業」の方が良いかもしれませんが、その余分な作業の範囲を理解していないかもしれません。

于 2009-11-08T06:55:33.790 に答える
0

あなたの問題は、一般的なリストを送信しようとしていることにあると思います。

リストをオブジェクトにカプセル化すると機能します。つまり、ジェネリック リストである単一のパブリック プロパティを持つオブジェクトを作成します。

また、コントラクトで直接使用されていないすべてのクラスがシリアライズ可能としてマークされていることを確認する必要があります。

于 2009-06-21T21:28:39.383 に答える
0

派生オブジェクトを返したい場合は、クライアントとサービスが分離されているため、常にラウンド トリップが発生します。クライアントが MyBaseObjects の独自のリストを更新するには、サーバーから取得した MyDerivedObjects のリストを逆シリアル化する必要があります。

KnownType や ServiceKnownType を使用する必要があるのは、これによりその型情報が WSDL に追加され、クライアントがメッセージを正しい型に逆シリアル化するために使用されるためです。

手始めに、説明したシナリオをテストするための便利なツール: http://www.wcfstorm.com

于 2009-06-22T06:30:09.247 に答える