2

標準の wsdl を使用して Web サービス操作を呼び出す必要がありますが、データ オブジェクトはクライアントとサーバーで異なる必要があります。

共通ライブラリでデータ オブジェクトのインターフェイスを使用し、クライアントとサーバーでそのプロキシ クラスを作成します。

そしてインターフェースを使ってオペレーションコントラクトを宣言しているのですが、WCFが認識しません。

私はまだ DataContractSerializerBehavior を使用して knownTypes を設定しようとしましたが、まだ成功していません。

誰かが私を助けることができますか?詳細を含む完全なソリューションを添付しました。

public interface Thing
{
   Guid Id {get;set;}
   String name {get;set;}
   Thing anotherThing {get;set;}
}

[DataContract]
public class ThingAtServer: BsonDocument, Thing // MongoDB persistence
{ 
   [DataMember]
   Guid Id {get;set;}
   //... 
}

[DataContract]
public class ThingAtClient: Thing, INotifyPropertyChanged // WPF bindings
{ 
   [DataMember]
   Guid Id {get;set;}
   //... 
}

[ServiceContract]
public interface MyService
{
  [OperationContract]
  Thing doSomething(Thing input);
}

ここをクリックして、TestCases を使用した GitHub のサンプル プロジェクトを参照してください。

4

2 に答える 2

2

私は契約でWCFサービスを作成しました:

[OperationContract]
CompositeTypeServer GetDataUsingDataContract( CompositeTypeServer composite );

CompositeTypeServerはこのように見えます:

[DataContract( Namespace = "http://enes.com/" )]
public class CompositeTypeServer
{
    [DataMember]
    public bool BoolValue { get; set; }

    [DataMember]
    public string StringValue { get; set; }
}

次に、タイプのクライアント プロジェクトを作成しましたCompositeTypeClient

[DataContract( Namespace = "http://enes.com/" )]
public class CompositeTypeClient
{
    [DataMember]
    public bool BoolValue { get; set; }

    [DataMember]
    public string StringValue { get; set; }
}

次に、サービスへの参照を追加し、型を再利用することを選択しました。すべてが魅力のように機能しました。CompositeTypeClientクライアント側で使用できました。

したがって、クライアントとサービスの両方で一致するように、DataContract の Namespace を指定するのが秘訣でした。

[DataContract( Namespace = "http://enes.com/" )]

PS。リクエストに応じて、完全に機能する VS ソリューションを提供できます。

于 2013-04-05T22:35:58.033 に答える
0

ServiceKnownTypeAttribute( MSDN ドキュメント) に基づいて、状況に応じて期待される型を変更しました。主なアイデアはクラスで実装され、状況に応じてXHelper正しいものを返す責任があります。Type[]

public static class XHelper
{

    public static Boolean? IsClient = null;
    public static Type[] ClientTypes;
    public static Type[] ServerTypes;

    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider pProvider)
    {
        if (!IsClient.HasValue)
            throw new Exception("Invalid value");
        if (IsClient.Value)
            return ClientTypes;
        return ServerTypes;
    }
}

to knowクラスServiceKnownTypeを持つインターフェイスにタグを含める必要があります。ServiceContractXHelper

[ServiceContract(Namespace = MyProxyProvider.MyNamespace)]
[ServiceKnownType("GetKnownTypes", typeof(XHelper))]
public interface MyService
{
    [OperationContract]
    Thing2 CopyThing(Thing1 input);
}

Type[]あらゆる状況に対する権利が通知されたテストユニットの冒頭で:

    [AssemblyInitialize]
    public static void TestInitialize(TestContext pContext)
    {
        XHelper.ClientTypes = new Type[] { typeof(Thing1ProxyAtClient), typeof(Thing2ProxyAtClient), typeof(Thing2ProxyAtClient) };
        XHelper.ServerTypes = new Type[] { typeof(Thing1ProxyAtServer), typeof(Thing2ProxyAtServer), typeof(ThingNProxyAtServer) };
    }

ここをクリックして、TestCases を使用した GitHub の最終的なコード サンプル プロジェクトを参照してください。

于 2013-04-06T15:55:35.157 に答える