我有两个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应用程序使用MyLibrary
中的相同代码,因为我正在使用上面的svcutil
调用;两者都在同时编译。此外,我没有采取任何不同的方式,而我之前没有做过几十次。
有人可以建议从哪里开始解决此问题吗?如果我在混淆期间修改了代码示例中的任何语法,请提前道歉:)
答案 0 :(得分:2)
我无意中偶然发现了答案:如果我取消选中&#34;始终生成邮件合同&#34;选项,然后&#34;更新服务参考&#34;,一切都恢复正常。
我确定我应该真正使用DataContract(正如我在OP上的评论中提到的那样),但是我会快速取胜并将我的无知隐藏一天!