这是我在服务器端的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 :(得分:3)
您的合同是一个接口,但合同中的定义必须是具体的类。
在您的情况下,您似乎想要发送一系列事物,这些事情可能会有所不同,但它们都支持相同的界面。
问题在于,当WCF对通过线路发送的内容进行反序列化时,需要将其反序列化为具体类型。如果它只有定义中的接口和实现该定义的20种不同类型,它就不知道如何处理它。
你可以做的是有一个实现接口的基类型,你的所有类都继承自基类型,你在联系人中使用基类型。