戻り値の型をインターフェイスとして持つ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;
}
}
しかし、誰成功!
WCFメソッドからインターフェイスを返す目的を尋ねることはできますか? – CSharpenter
メソッドからiterfaceを返す場合も同じです:wcfのユーザーから実装を隠す。私のwcfユーザーは、インターフェイス用に実装したクラスについて知っておくべきですか?ユーザは、オブジェクトがどのプロパティまたはメソッドを拒否しているかを知るだけでよい。私の例では、いくつかのパラメータに基づいてIMyObjectの異なるインプリメンテーションを返すかもしれません。 – mans
一般的に、それは良い意図ですが、むしろ意味がありません。いずれにしても、呼び出し側には「実装」は表示されません。また、 'DataContract'の中に' OperationContract'を持つことはサポートされていません。 2つは本当に別々の概念です。詳細については、MSDNの[Designing Service Contracts](http://msdn.microsoft.com/en-us/library/ms733070.aspx)を参照してください。 –