这是我在服务器端的 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”接收并继续找出它的消息/对象的类型。
如何?