使用抽象类进行WCF序列化
我的合同定义如下:使用抽象类进行WCF序列化,wcf,inheritance,serialization,abstract-class,Wcf,Inheritance,Serialization,Abstract Class,我的合同定义如下: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class CommandWebService : ICommandWebService { public Exec
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CommandWebService : ICommandWebService
{
public ExecuteResponse Execute(CommandBase command)
{
...
}
}
命令库为抽象类时:
[Serializable]
[KnownType("GetKnownTypes")]
public abstract class CommandBase : Message, ICommand
{
public static Type[] GetKnownTypes()
{
var types = from asm in AppDomain.CurrentDomain.GetAssemblies()
from type in asm.GetTypes()
where typeof(CommandBase).IsAssignableFrom(type) && !type.IsAbstract
select type;
return types.ToArray();
}
}
我在另一个项目中使用这些工具来实例化我的WCF服务:
var bus = RabbitHutch.CreateBus("host=localhost"); ;
var commandHandler = new CommandHandlerService();
var projectionHandler = new ProjectionHandlerService();
var commandWebService = new CommandWebService(bus, commandHandler, projectionHandler);
using (var commandServiceHost = new ServiceHost(commandWebService))
{
commandServiceHost.Open();
Console.WriteLine("service started");
var quitFlag = false;
while (!quitFlag)
{
var keyInfo = Console.ReadKey();
quitFlag = keyInfo.Key == ConsoleKey.C
&& keyInfo.Modifiers == ConsoleModifiers.Control;
}
}
使用以下服务模型:
<system.serviceModel>
<bindings/>
<services>
<service name="CommandService.CommandWebService" >
<host>
<baseAddresses>
<add baseAddress="http://localhost:1338/MyApp"/>
</baseAddresses>
</host>
<endpoint address=""
binding="basicHttpBinding"
contract="CommandService.ICommandWebService"/>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
对我的web服务的调用详细信息如下:
var id = Guid.NewGuid();
var cmdCreate = Build.Cmd1
.ForCreationDate(DateTime.Now)
.ForDescription("test")
.Build(id);
var client = new Ref1.CommandWebServiceClient();
client.Execute(cmdCreate);
生成的消息具有正确的id,因为此信息是抽象类CommandBase的一部分,但creationdate和description不是xml的一部分
有什么我遗漏的吗
[编辑]
有一件重要的事我没说。我不希望命令类中有任何属性。
[/编辑]
感谢您的阅读,如评论中所述,我的命令Cmd1具有用于说明和创建日期的专用设置器。与使用WCF一样,我使用的是xmlserializer,有两件事需要知道: 一定有个裸体医生 属性必须具有公共setter才能序列化
如果可以的话,我现在要把xml序列化程序改成不同的东西,以绕过这两个障碍。Ok找到了解决方案。。对不起打扰了你的睡眠。我的命令Cmd1具有描述和创建日期的专用设置器。。。我将删除此问题…您应该自己回答,并将答案标记为解决方案,以帮助其他用户解决类似问题
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="Contabilita.ICommandWebService")]
public interface ICommandWebService
{
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ICommandWebService/Execute", ReplyAction="http://tempuri.org/ICommandWebService/ExecuteResponse")]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyNamespace.Cmd1))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyNamespace.Cmd2))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyNamespace.Cmd3))]
MyConsole.Ref1.ExecuteResponse Execute(Common.CommandBase command);
}
var id = Guid.NewGuid();
var cmdCreate = Build.Cmd1
.ForCreationDate(DateTime.Now)
.ForDescription("test")
.Build(id);
var client = new Ref1.CommandWebServiceClient();
client.Execute(cmdCreate);