【发布时间】:2015-03-15 14:50:59
【问题描述】:
这是我的基本情况。我有三项服务。一种是自给自足的,大多数情况下不会引起问题。其他两个服务托管在同一个项目中,并共享几乎所有相同的 DataContract。这意味着包含在同一个项目中,它们会引起很多冲突。
不幸的是,简单地删除重复的类不是一个选项,因为我的公司开始自动化我们的构建,这需要进入预构建事件并使用 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。在此之后,我的项目中有三组 DataContract,一组来自 Foo.svc,一组来自 Bar.svc,以及 DataContract 文件中它们应该在的位置。
我尝试将 clr 命名空间更改为与 DataContract 命名空间相同,但这不起作用。它也改变了我的方法签名,给了我大量的错误。
TL;DR;我需要一个用于服务的通用 DataContract 文件,这样我就不会得到重复的 DataContract 类型。我似乎无法将我的 DataContract dll 正确导入到 svc,因此它会生成两次新的 DataContracts,每个服务一个,然后在原始 dll(它们应该在的位置)中再次生成。
如果有任何不清楚的地方,请告诉我,我已尽量做到描述性。
【问题讨论】:
标签: vb.net visual-studio wcf svcutil.exe