【问题标题】:Two services for one set of DataContracts. How do I generate only the Service and Implementaiton?一组 DataContracts 的两个服务。如何只生成服务和实施?
【发布时间】: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


    【解决方案1】:

    我想通了。

    我将 Contract 文件上的序列化程序设置为 DataContractSerializer。由于某种原因,它默认为 XmlSerializer,因此无法将 DataContracts 识别为与其创建的类型等效。

    我只是将选项“/serializer:DataContractSerializer”添加到创建 DataContracts 的第二个构建事件中。

    但是,现在我遇到了另一个问题。我的两个合约没有为其方法生成参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多