我观察到SvcUtils.exe的奇怪行为。
如果我传递/ reference参数,由于某种原因它不会生成* .cs文件。
C:\test>"C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\SvcUtil.exe" /t:code http://localhost/Api/Common.svc /r:Api.dll
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.17929]
Copyright (c) Microsoft Corporation. All rights reserved.
Attempting to download metadata from 'http://localhost/Api/Common.svc' using WS-Metadata Exchange or DISCO.
Generating files...
C:\test\output.config
同时,如果我删除参数,它会正常生成它。
C:\test>"C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\SvcUtil.exe" /t:code http://localhost/Api/Common.svc
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.17929]
Copyright (c) Microsoft Corporation. All rights reserved.
Attempting to download metadata from 'http://localhost/Api/Common.svc' using WS-Metadata Exchange or DISCO.
Generating files...
C:\test\CommonService.cs
C:\test\output.config
为什么呢? 如何从Api.svc中使用的Api.dll中获取在CommonService.cs中生成的类?
UPD。让我添加一些在我看来很明显但仍然很重要的细节。 Api.dll包含标有 [DataContract] 属性的类,其属性标有 [DataMember] 属性。这些类是从Api.svc中可见的方法返回的。我的目标是在生成的代理代码中重用来自Api.dll的类。
为什么我发现这种行为很奇怪?它通常为服务生成代理类而不重用,但如果我将/ r参数添加到重用类中,它就会拒绝生成代码。那么问题是做错了什么?如果能够做到这一行为以及如何正确地实现目标,可能会做错什么?
UPD2。最奇怪的是,使用选中的“重用”选项更新Visual Studio中的引用非常有效。
答案 0 :(得分:2)
我遇到了同样的问题。我实际上是在使用svcutil,因为Visual Studio给了我错误,无法创建WCF引用的代码并且没有提供更多信息。我最终在VS中启用了警告,这给了我更多信息。事实证明,我正在引用一个本身引用WCF服务的程序集。因为某些类型包括两次。然后,类型的映射失败。我做的是我配置了哪些程序集被引用。因此,我只选择了WCF服务,然后选择了标准的.NET系统程序集。我也禁用了生成数据合同(我已经启用了它来试试这个)并且能够构建。
简而言之:确保您要使用的类型仅被引用一次。