这是我的基本情景。我有三项服务。一个是独立的,大多数不会引起问题。其他两个服务托管在同一个项目中,并共享几乎所有相同的DataContracts。这意味着包含在同一个项目中会导致很多冲突。
不幸的是,只是删除重复的类不是一个选项,因为我的公司开始自动化我们的构建,这需要进入预构建事件并使用svcutil.exe。
我首先尝试添加一个名为MyProject.DataContracts的程序集。然后,在MyProject.DataContracts的预构建中,我将运行:
mkdir "$(ProjectDir)SVC"
chdir "$(ProjectDir)SVC"
svcutil /t:metadata http://localhost/Cmpny.FirstHost.ServiceHost/Foo.svc http://localhost/Cmpny.FirstHost.ServiceHost/Bar.svc http://localhost/Cmpny.StandaloneService.ServiceHost/Service.svc /r:"D:\TFSMAP\AssemblyReferences\Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll" /collectionType:System.Collections.Generic.List`1
svcutil /t:code /language:VB Cmpny.FirstHost.DataContracts*.xsd /serializer:DataContractSerializer /dcOnly /out:Cmpny.FirstHost.DataContracts /n:*,Contracts
svcutil /t:code /language:VB Cmpny.StandaloneService.DataContracts*.xsd /serializer:DataContractSerializer /dcOnly /out:Cmpny.StandaloneService.DataContracts /n:*,Contracts
copy Cmpny.StandaloneService.DataContracts.vb "$(ProjectDir)Service References"
copy Cmpny.FirstHost.DataContracts.vb "$(ProjectDir)Service References"
chdir "$(ProjectDir)"
rmdir /S /Q "$(ProjectDir)SVC"
运行,替换文件,并使用新文件构建项目。这部分工作正常,因为所有类型输出到文件,并显示在程序集中。
下一部分给我带来麻烦。我已将此添加到主项目的Pre-Build事件中。
mkdir "$(ProjectDir)SVC"
chdir "$(ProjectDir)SVC"
svcutil /t:code http://localhost/Cmpny.FirstHost.ServiceHost/BusinessDataService.svc?singleWsdl /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\MyProject.DataContracts.dll" /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll" /language:VB /out:BusinessDataService /collectionType:System.Collections.Generic.List`1
svcutil /t:code http://localhost/Cmpny.FirstHost.ServiceHost/PremiumReportingService.svc?singleWsdl /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\MyProject.DataContracts.dll" /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll" /language:VB /out:PremiumReportingService /collectionType:System.Collections.Generic.List`1
svcutil /t:code http://localhost/Cmpny.StandaloneService.ServiceHost/Service.svc?singleWsdl /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\MyProject.DataContracts.dll" /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll" /language:VB /out:PaymentService /collectionType:System.Collections.Generic.List`1 /et:"$(SolutionDir)MyProject.DataContracts\bin\Release\MyProject.DataContracts.dll"
copy BusinessDataService.vb "$(ProjectDir)Service References"
copy PremiumReportingService.vb "$(ProjectDir)Service References"
copy PaymentService.vb "$(ProjectDir)Service References"
chdir "$(ProjectDir)"
rmdir /S /Q "$(ProjectDir)SVC"
此过程成功,但是,它再次生成DataContract类型,尽管事实上我已经包含了MyProject.DataContracts.dll。在此之后,我在我的项目中有三组DataContracts,来自Foo.svc的那些,来自Bar.svc的那些,以及DataContract文件中它们应该是的那些。
我尝试将clr名称空间更改为与DataContract名称空间相同,但这不起作用。它也改变了我的方法签名,并给了我一个真正惊人的错误数量。
TL; DR;我需要一个服务的公共DataContract文件,所以我不会得到重复的DataContract类型。我似乎无法正确地将我的DataContract dll导入svc,因此它会生成两次新的DataContracts,每个服务一个,并且再次在原始dll中(它们应该在那里)。
如果有任何不清楚的地方,请告诉我,我试图尽可能具有描述性。
答案 0 :(得分:0)
我想出来了。
我将 Contract 文件上的序列化程序设置为DataContractSerializer。由于某种原因,它默认为XmlSerializer,因此无法将DataContracts视为与其创建的类型等效。
我只是将选项'/ serializer:DataContractSerializer'添加到创建DataContracts的第二个构建事件中。
然而,现在我遇到了另一个问题。我的两个合同没有为他们的方法生成论据。