WCF服务引用 - 重复使用类型时未生成代理

3
我有两个C# (.NET v4.0) 伴侣项目,一个是ASP.NET网站,另一个是“自托管”的WCF控制台应用程序。网站代码调用WCF服务执行各种任务;这两个项目都是几年前编写的,一直运行良好。
控制台应用程序和网站共享一个公共类库 (在这个例子中称为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应用程序使用与我在上面用svcutil调用的MyLibrary中相同的代码;两者同时编译。此外,我没有做任何不同于以前做过的事情。
有人能建议从哪里开始排除故障吗?如果我在代码示例中进行混淆时弄乱了语法,请提前谅解 :)

MyLibrary库的目标框架是什么?从错误信息来看,它似乎是使用Framework 2.0编译的,这可能会导致问题。您能否无误地编译WCF? - PratikDotCa
一切都已设置为目标 .Net v4.0 - 我正在使用一些之前版本中根本不存在的东西。WCF 应用程序编译正常。 - KenD
谢谢,但不幸的是我已经阅读了那篇文章。我没有使用“DataContract”(不确定是否应该使用?直到现在一切都很顺利...),而唯一适合我的选项(第二个)是更改DataContract参数。 - KenD
好的 - 为什么突然需要一个DataContract?我在更新引用时没有收到错误提示,只是我的代码(依赖于代理)停止工作了。 - KenD
显示剩余3条评论
1个回答

2
我无意中发现了答案:如果我取消“始终生成消息契约”选项,然后“更新服务引用”,一切都会恢复正常。
我确定我应该真正使用DataContract(如我的OP评论中所提到的),但我会采取快速胜利并将我的无知隐藏到另一天!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接