2012-05-08 5 views
1

をシリアル化できません:これは、サーバー側で私のABCであるインターフェース

<endpoint address="msmq.formatname:DIRECT=OS:.\private$\imhmsgs" 
      binding="msmqIntegrationBinding" 
      bindingConfiguration="IncomingMessageHandlerBinding" 
     contract="TMC.Services.Contracts.Messages.IInboundMessageHandlerService"> 

できるだけ早く私は、サービスをホストする.Open()がそうであるように、私は例外を取得:

はインターフェース XYZをシリアル化することはできません.Services.Contracts.Messages.Interfaces.IMyMessage。

マイIMyMessageインタフェース:

[ServiceContract] 
[ServiceKnownType(typeof(IMyMessage))] 
[ServiceKnownType(typeof(ConcreteMessage))] 
public interface IInboundMessageHandlerService 
{ 
    [OperationContract(IsOneWay = true, Action = "*")] 
    void ProcessIncomingMessage(MsmqMessage<IMyMessage> incomingMessage); 
} 

そのインターフェイスのインプリ:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
       ReleaseServiceInstanceOnTransactionComplete = false)] 
public class InboundMessageHandlerService : IInboundMessageHandlerService 
{ 
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
    public void ProcessIncomingMessage(MsmqMessage<IMyMessage> incomingMessage) 
    { 
    } 
} 

クライアントによって作成されているタイプは、基本的な塩基に由来する具象クラス、クラスとインターフェイス(IMyMessage)を作成し、これをMSMQに配置します。

サービスの既知のタイプの属性を削除し、代わりに「文字列」と言う代わりに、メッセージタイプが予期したものではないため、ホストをオープンしているように見えます。

どこが間違っていますか?

具体的なタイプのみを指定すると、それが動作することがわかります。

これは私が期待していたものではありません。 サービスが既知のインターフェイスとそのインターフェイスが持つクラスを利用できるように、どのように作成できますか?アイデアは、クライアントが(同じ契約とクラスを使用して)メッセージを「IMyMessage」として送信し、WCFサービスがそれを「IMyMessage」として取り上げて、メッセージ/オブジェクトのタイプを調べることです。

どのようにですか?

+0

このスレッドをチェックする[http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/ff81b538-939e-4acf-bef3-40d3677f2f1d]それは同様の問題のようです。 –

+0

ありがとうKevin。残念ながらそのリンクは私のためには機能しませんが、私はここでそれをやったと思います。インターフェイスを使用する代わりに、代わりに基本クラスを使用して、それをWCFサービスにシリアライズ/パッシングします。これは期待されるパラメータとして使用されますが、基本クラスから派生した可能性のあるすべての既知の型でサービスが修飾されていることを確認します。これは完全に(今のところ!) –

+0

実際には幾分奇妙な理由のために働くようである。それは私が最初にやりたかったやり方で動作します。 *スクラッチヘッド* ...クライアントは、インタフェースを実装するベースから派生した具象クラスを作成しました。クライアントはインターフェイスタイプのクラスを送信します.WCFはそれを問題なく選択し、コンクリートクラスのタイプを確認できます。たぶん、既知の型を基底クラスに追加して、おそらくそれを「仕事」にしました。わかりません。 –

答えて

3

契約はインタフェースですが、契約内の定義は具体的なクラスでなければなりません。

あなたの場合は、物のリストを送信するように見えますが、それらは異なるものの、すべてが同じインターフェースをサポートしているようです。

問題は、WCFがワイヤを介して送信されたものをデシリアライズするときに、具体的なタイプをデシリアライズする必要があることです。定義にインタフェースがあり、その定義を実装する20種類のインタフェースがあるだけであれば、それをどうしたらいいのか分かりません。

あなたができることは、インターフェイスを実装する基本タイプを持ち、すべてのクラスが基本タイプから継承し、あなたの連絡先に基本タイプを使用することです。

+0

ありがとうございます。はい、これは私がそれが "壊れた"しかし今はその魔法の "固定"の前に働いていた方法です。 –

+0

別のタイプのプロジェクトは作品にありますが、その構造は異なっています。すべての具体的なクラスには独自の基本クラスがあります。すべての基本クラスは1つの基本クラスから派生します。基本と具体的なクラスは別々のプロジェクトです。キューに具体的なメッセージを送信できますが、WCFはデシリアライズに失敗します。サービスコントラクトは、パラメータ(メインベース)として基本クラスを取ります。これらは単にデータクラス(datacontract属性を持つ)なので、サービス操作はありません。ここで間違っているアイデアは?私はどこで知っているのですか?これらもすべて基本型のものでしょうか? –

関連する問題