3

我有一个基于编写高度可维护的 WCF 服务的 WCF 服务。使用 CommandService 处理请求:

[WcfDispatchBehaviour]
[ServiceContract(Namespace="http://somewhere.co.nz/NapaWcfService/2013/11")]
[ServiceKnownType("GetKnownTypes")]
public class CommandService
{
    [OperationContract]
    public object Execute(dynamic command)
    {
        Type commandHandlerType = typeof(ICommandHandler<>).MakeGenericType(command.GetType());
        dynamic commandHandler = BootStrapper.GetInstance(commandHandlerType);
        commandHandler.Handle(command);
        return command;
    }

    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
    {
        var coreAssembly = typeof(ICommandHandler<>).Assembly;
        var commandTypes =
            from type in coreAssembly.GetExportedTypes()
            where type.Name.EndsWith("Command")
            select type;

        return commandTypes.ToArray();
    }
}

一切都很好(感谢史蒂夫),但现在我需要添加将文件上传到服务的功能。根据我所阅读的内容以及测试期间收到的错误,WCF 需要在[MessageContract]使用Stream. 所以我装饰了我的命令类并将非流成员放入消息头中,并更新了我的绑定定义以使用流:

[MessageContract]
public class AddScadaTileCommand
{
    [MessageHeader(MustUnderstand = true)]
    public int JobId { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public string MimeType { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public string Name { get; set; }

    [MessageBodyMember(Order = 1)]
    public Stream Content { get; set; }
}

不幸的是,当我使用要上传的文件调用服务时,出现错误:

尝试序列化参数 http://somewhere.co.nz/NapaWcfService/2013/11:command时出错。InnerException 消息是 'Type 'System.IO.FileStream' ,数据合同名称为 'FileStream: http://schemas.datacontract.org/2004/07/System.IO ' 不是预期的。

所以我在服务中添加了一个新方法,专门针对文件上传请求:

[OperationContract]
public void Upload(AddScadaTileCommand addScadaTileCommand)
{
    Type commandHandlerType = typeof(ICommandHandler<>).MakeGenericType(typeof(AddScadaTileCommand));
    dynamic commandHandler = BootStrapper.GetInstance(commandHandlerType);
    commandHandler.Handle(addScadaTileCommand);
}

这非常有效,除非我在方法定义中将AddScadaTileCommand参数更改为dynamic,在这种情况下我会得到与上面相同的错误。这似乎表明属性在用作参数的类型[MessageContract]时未被应用或忽略。dynamic有什么办法可以解决这个问题,还是我需要为涉及流的请求创建单独的方法?

4

0 回答 0