0

サービスを定義するインターフェイスに問題があります。Silverlight と WPF、およびバックエンドで同じインターフェイスを使用しています。

例えば:

#if !SILVERLIGHT
    [OperationContract(IsOneWay = false)]
    SecurityOperationInfo LogonUser(string sessionId, string username, string password);
#else
    [OperationContract(IsOneWay = false, AsyncPattern = true)]
    IAsyncResult BeginLogonUser(string sessionId, string username, string password, AsyncCallback callback, object state);        
    SecurityOperationInfo EndLogonUser(IAsyncResult result);
#endif

問題は、Silverlight でインターフェイスを使用していることです (うまく機能しています)。WPF で Async の方法も使用したいのですが、サーバー側で Begin と End を実装する必要はありません。しかし、私の WPF プロジェクトは、このインターフェイスを実装する同じ DLL にリンクしています!

これを簡単に達成する方法はありますか?

4

1 に答える 1

0

幸いなことに、WCF では、クライアント側とサーバー側の実装に個別のインターフェイスを使用できます。サーバー側の実装は完全に非同期にすることができますが、クライアント側のインターフェイスには同期操作があり、その逆も同様です。あなたの場合、クライアント側の非同期操作用の派生インターフェイスを作成します。そうすれば、サーバー側の実装は同期を維持できますが、クライアントは操作を非同期に実装できます。

[ServiceContract(Name = "IMyService", ...)]
public interface IMyService {
   [OperationContract(IsOneWay=false)]
   SecurityOperationInfo LogonUser(string sessionId, string username, string password);

   // other methods ...
}

[ServiceContract(Name = "IMyService", ...)]
public interface IMyServiceAsync : IMyService {
    [OperationContract(IsOneWay = false, AsyncPattern = true)]
    IAsyncResult BeginLogonUser(string sessionId, string username, string password, AsyncCallback callback, object state);        
    SecurityOperationInfo EndLogonUser(IAsyncResult result);
}

両方のサービス コントラクトの名前が一致している必要があることに注意してください。一致していないと、WCF はサービスに接続できません。

于 2013-06-25T12:17:44.467 に答える