2012-03-07 15 views
7

戻り値の型をインターフェイスとして持つWCFサービスで関数を作成したいのですが、クライアントから呼び出したときに、インターフェイスを実装するクラスではなくSystem.Objectが返されます。サービスが送信されました。私は、このサービスの実装ではWebサービスでインターフェイスを公開する方法

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string SayHello(); 

    [OperationContract] 
    IMyObject GetMyObject(); 
} 

public interface IMyObject 
{ 
    int Add(int i, int j); 
} 

[DataContract] 
public class MyObject : IMyObject 
{ 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

:ここ

は、いくつかのサンプルコードです

public class LinqService : IService 
{ 
    public string SayHello() 
    { 
     return "Hello"; 
    } 

    public IMyObject GetMyObject() 
    { 
     return new MyObject(); 
    } 
} 

SayHello()はうまく動作しますが、GetMyObject()System.Objectを返します。 GetMyObject()IMyObjectを実装するオブジェクトを返すように、このコードをどのように変更できますか?

編集は1

は、次のようにコードを変更:

using System.Runtime.Serialization; 
using System.ServiceModel; 

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string SayHello(); 

    [OperationContract] 
    IMyObject GetMyObject(); 
} 

[ServiceKnownType(typeof(MyObject))] 
public interface IMyObject 
{ 
    [OperationContract] 
    int Add(int i, int j); 
} 

[DataContract] 
public class MyObject:IMyObject 
{ 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

しかし、誰成功!

+0

WCFメソッドからインターフェイスを返す目的を尋ねることはできますか? – CSharpenter

+0

メソッドからiterfaceを返す場合も同じです:wcfのユーザーから実装を隠す。私のwcfユーザーは、インターフェイス用に実装したクラスについて知っておくべきですか?ユーザは、オブジェクトがどのプロパティまたはメソッドを拒否しているかを知るだけでよい。私の例では、いくつかのパラメータに基づいてIMyObjectの異なるインプリメンテーションを返すかもしれません。 – mans

+0

一般的に、それは良い意図ですが、むしろ意味がありません。いずれにしても、呼び出し側には「実装」は表示されません。また、 'DataContract'の中に' OperationContract'を持つことはサポートされていません。 2つは本当に別々の概念です。詳細については、MSDNの[Designing Service Contracts](http://msdn.microsoft.com/en-us/library/ms733070.aspx)を参照してください。 –

答えて

9

すべてのWCF契約引数と戻り値の型はシリアル化可能でなければなりません。インターフェイスはそうではありません。 This questionは、KnownType属性を中心とする回答で同じ問題を探ります。 IMyObjectのさまざまな実装をやり直す場合は、これをお勧めします。そうでなければ、戻り値の型をMyObjectに変更する必要があります。シリアライズ 上

+0

オリジナルの質問の私の編集をご覧ください。 – mans

+1

純粋なデザインの観点から、あなたの質問はなぜ私のインターフェースのために実装したクラスについて知っておくべきなのですか?残念ながら、それはWCFの仕組みの事実だけです。 –

+0

'KnownType'と' ServiceKnownType'属性を追加して、 'IMyObject'ではなく' IService'に追加してください。 –

1

追加の注意事項は、次の規則は、Data契約シリアライザでサポートされているタイプに適用されます。

ジェネリック型は、完全にデータコントラクトシリアライザでサポートされています。

null不可能な型は、データコントラクトシリアライザによって完全にサポートされています。

インターフェイスタイプは、オブジェクトとして、またはコレクションインターフェイスの場合はコレクションタイプとして扱われます。

.....

はEDITフルMSDN Additional Notes on Serialization


を参照してください。私はあなたがクライアント活性化オブジェクトについて話していると思います

。詳細については、次の記事を参照してください。Returning an interface from a WCF service WCFでのシリアライズによってのみデータを送信できますが、実装はできません。あなたの問題を解決するもう一つの方法は、インスタンス化を使用することです。

関連する問題