我有一个基于编写高度可维护的 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
有什么办法可以解决这个问题,还是我需要为涉及流的请求创建单独的方法?