无法序列化界面

时间:2012-05-08 10:19:31

标签: wcf

这是我在服务器端的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”并继续查找消息/对象的类型。

如何?

1 个答案:

答案 0 :(得分:3)

您的合同是一个接口,但合同中的定义必须是具体的类。

在您的情况下,您似乎想要发送一系列事物,这些事情可能会有所不同,但它们都支持相同的界面。

问题在于,当WCF对通过线路发送的内容进行反序列化时,需要将其反序列化为具体类型。如果它只有定义中的接口和实现该定义的20种不同类型,它就不知道如何处理它。

你可以做的是有一个实现接口的基类型,你的所有类都继承自基类型,你在联系人中使用基类型。