我有两个 C# (.NET v4.0) 配套项目,一个 ASP.NET 网站和一个“自托管”WCF 控制台应用程序。网站代码为各种事情调用 WCF 服务;两者都是几年前编写的,并且一直运行良好。
控制台应用程序和网站共享它们之间的公共(public)类库(在本例中称为 MyLibrary
);这是作为对两个项目的引用添加的。
控制台应用程序非常简单 - 例如,我有 IService.cs
:
[ServiceContract]
public interface IService
{
[OperationContract]
List<MyLibrary.MyClass> DoSomething(int ID);
}
然后是Service.cs
:
public class Service : IService
{
public List<MyLibrary.MyClass> DoSomething(int ID)
{
// etc
return result;
}
}
...所有这些都有效。但是,今天我需要向双方添加一些微不足道的东西——其中一个方法需要添加另一个参数。我已经更新了 WCF 应用程序、构建它、运行它,然后转到该网站并尝试“更新服务引用”。
此时,站点崩溃了:生成服务引用不再是创建代理。但是,如果我取消选择“重用所有引用”选项,则会创建代理:尽管这会严重破坏我的代码,但我需要在整个代码中共享对 MyLibrary
的引用。
在做了一些挖掘之后,我尝试使用 svcutil
创建引用:
svcutil/t:code http://localhost/MyService/r MyLibrary.dll
抛出错误:
Attempting to download metadata from 'http://localhost/MyService' using WS-Metadata Exchange or DISCO. Error: Cannot import wsdl:portType Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Referenced type 'MyLibrary.MyClass, MyLibrary, Version=2.0.53
33.26816, Culture=neutral, PublicKeyToken=null' with data contract name 'MyLibrary.MyClass' in namespace 'http://schemas.datacontract.org/2004/07/MyService' cannot be used since it does not match imported DataContract. Need to exclude this type from referenced types.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='IService']
我不知道哪里出了问题;我看过关于此错误的其他帖子,但他们都提到确保引用的类相同 - WCF 应用程序在 MyLibrary
中使用相同的代码,因为我正在调用 svcutil
上面;两者都在同时编译。此外,我没有做任何我以前没有做过几十次的不同的事情。
谁能建议从哪里开始解决这个问题?如果我在混淆过程中破坏了我的代码示例中的任何语法,请提前致歉:)
最佳答案
我无意中发现了答案:如果我取消选中“始终生成消息契约(Contract)”选项,然后取消选中“更新服务引用”,一切都会恢复正常。
我确定我真的应该使用 DataContract(如我的 OP 的评论中所述),但我会快速获胜,改天隐藏我的无知!
关于c# - WCF 服务引用 - 重用类型时未生成代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25207343/