将服务引用添加到引用了 JSON.NET 库的项目时出现奇怪的问题

Posted

技术标签:

【中文标题】将服务引用添加到引用了 JSON.NET 库的项目时出现奇怪的问题【英文标题】:Strange issue when adding a service reference to a project that has the JSON.NET library referenced 【发布时间】:2012-12-15 19:26:37 【问题描述】:

该项目是与内部 WCF 服务通信的标准普通 ASP.NET MVC 3 应用程序。我们的 ASP.NET MVC 应用程序引用了一些外部库,包括流行的 JSON.NET 库。

仅当 JSON.NET 库是项目中的引用时才会出现此问题。我尝试使用 WebForms 和 Windows Forms 项目重新创建此问题,但同样的事情发生了。

当向我们的 WCF 服务添加服务引用时,并且 JSON.NET 是我们项目中的引用,它会像这样构建服务引用:

在项目中引用 JSON.NET - 注意请求/响应类和奇怪的属性,如 Id1 和 IdSpecified

但是删除对 JSON.NET 的引用并更新服务引用会按照我们想要的方式构建它,如下所示:

项目中未引用 JSON.NET

...

到底是什么导致了这种情况? WCF 项目中没有引用 JSON.NET,所以我非常怀疑那里可能存在某种混淆。

一些可能有帮助的信息:

尝试检查“添加服务引用”对话框中的各种选项,例如 “在引用的程序集中重用类型” - 但同样的事情发生了 Visual Studio 2010 WCF 服务使用实体框架进行数据访问

【问题讨论】:

我看到了一个类似的问题here。如果您使用 Newtonsoft.json.dll 可以正确删除和添加 Web 服务吗?您也可以浏览到 web 服务并找到 wsdl 吗? 是的,删除对 JSON.NET 的引用然后添加服务引用可以正常工作。是的,wsdl 应该是这样的。 【参考方案1】:

当您添加服务引用时,默认情况下,WCF 将重用您的程序集中与将生成的类匹配的类。

发生这种情况是因为,例如,您可能同时开发服务和客户端,并且您可能希望拥有一个包含两个项目中引用的所有类的类库。这也确保使用 .NET 默认类型(如数组、列表、日期时间)。

您可以像这样更改此默认行为:

    选择“添加服务参考”后点击高级按钮

    选择“在指定的引用程序集中重用类型”

    检查所有程序集,不希望的程序集除外 使用

请注意,如果您不检查系统程序集,您还将在代理文件中为每个 .NET 类型(如数组、列表)生成一个新类型。

【讨论】:

以上是关于将服务引用添加到引用了 JSON.NET 库的项目时出现奇怪的问题的主要内容,如果未能解决你的问题,请参考以下文章

包括来自类库的服务引用

如何将非托管库引用添加到 NUnit 测试

将托管在私有 *** 中的服务引用添加到我的项目

vs2012怎么添加web引用

无法将 Azure VM 上托管的 WCF 服务引用添加到 VS2015 项目

将 Fabric 答案添加到项目中的公共库