これは、サーバー側の私の 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" として取得し、先に進んでメッセージ/オブジェクトのタイプを見つけることです。
どのように?