をシリアル化できません:これは、サーバー側で私の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」として取り上げて、メッセージ/オブジェクトのタイプを調べることです。
どのようにですか?
このスレッドをチェックする[http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/ff81b538-939e-4acf-bef3-40d3677f2f1d]それは同様の問題のようです。 –
ありがとうKevin。残念ながらそのリンクは私のためには機能しませんが、私はここでそれをやったと思います。インターフェイスを使用する代わりに、代わりに基本クラスを使用して、それをWCFサービスにシリアライズ/パッシングします。これは期待されるパラメータとして使用されますが、基本クラスから派生した可能性のあるすべての既知の型でサービスが修飾されていることを確認します。これは完全に(今のところ!) –
実際には幾分奇妙な理由のために働くようである。それは私が最初にやりたかったやり方で動作します。 *スクラッチヘッド* ...クライアントは、インタフェースを実装するベースから派生した具象クラスを作成しました。クライアントはインターフェイスタイプのクラスを送信します.WCFはそれを問題なく選択し、コンクリートクラスのタイプを確認できます。たぶん、既知の型を基底クラスに追加して、おそらくそれを「仕事」にしました。わかりません。 –