1

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

如何?

4

1 回答 1

3

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

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

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

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

于 2012-05-08T21:00:54.700 回答