这是我的基本情况。我有三项服务。一个是自包含的,并且大多数情况下不会引起问题。另外两个服务托管在同一项目中,并且几乎共享所有相同的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"
尽管我包含了MyProject.DataContracts.dll,但此过程成功完成,但是它再次生成了DataContract类型。之后,我的项目中有三套DataContract,分别是Foo.svc,Bar.svc和DataContract文件中的三套。
我尝试将clr命名空间更改为与DataContract命名空间相同,但这不起作用。它也改变了我的方法签名,并给了我一个真正惊人的错误量。
TL; DR; 我需要用于服务的通用DataContract文件,所以不会得到重复的DataContract类型。我似乎无法将我的DataContract dll正确地导入svc,因此它会生成两次新的DataContract,分别为每个服务生成一个,并在原始dll中再次生成新的DataContract(应该位于该位置)。
如果有任何不清楚的地方,请告诉我,我尝试过尽可能地描述。
我想通了。
我将合同文件上的序列化器设置为DataContractSerializer。由于某种原因,它默认使用XmlSerializer,因此无法将DataContracts识别为与其创建的类型等效的对象。
我只是将选项“ / serializer:DataContractSerializer”添加到了创建DataContracts的第二个构建事件中。
但是,现在我遇到了另一个问题。我的两个合同没有为其方法生成参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句