【问题标题】:Wcf service metadata is inaccessible because of wrong class name由于错误的类名,无法访问 Wcf 服务元数据
【发布时间】:2011-10-25 14:52:37
【问题描述】:

目前我编写了一个 WCF 服务。该服务返回一个对象,其类型是名为“System”的用户定义类。代码sn-p如下:

[DataContract]
public class System
{
   // ....
}

[ServiceContract]
public interface DemoServcie
{
    [OperationContract]
    System GetSystem();
}

但是我在运行 wcf 服务时遇到了一个问题。错误信息是:

添加服务失败。服务元数据可能无法访问。确保您的服务正在运行并公开元数据。

c:\Users\xxx\AppData\Local\Temp\Test Client Projects\10.0\6909a900-97bd-4efb-aae9-6c2e9b23e4b9\Client.cs(321,50):错误 CS0426:类型名称“运行时” 'Demo.DomainModel.System' 类型中不存在 c:\Users\xxx\AppData\Local\Temp\Test Client Projects\10.0\6909a900-97bd-4efb-aae9-6c2e9b23e4b9\Client.cs(264,18):错误 CS0426:类型名称“运行时”不存在在“Demo.DomainModel.System”类型中 ...

但是如果我将类名“System”重命名为“System1”等其他名称,就可以了。我猜“系统”是一个保留的命名空间名称,不能使用。是真的吗?

【问题讨论】:

  • 看到 .NET 框架中的大量程序集是如何以 System 开头的,我想说即使它不是保留的命名空间,使用它至少会让其他开发人员感到困惑。
  • 再看,错误其实是Demo.DomainModel.System类型中不存在Runtime类型。查看 Client.cs 中的第 264 行。
  • 是的。 “系统”名称令人困惑,但它是由客户指定的。
  • 我查看了Client.cs中的代码。发生错误的行就像“public partial class System : object, System.Runtime.Serialization.IExtensibleDataObject”。
  • 如果框架不允许您使用“系统”,那么您和客户将不得不提出不同的解决方案/名称。

标签: wcf system metadata


【解决方案1】:

当你有线路时:

public partial class System : object, System.Runtime.Serialization.IExtensibleDataObject
{ ... }

问题是编译器在您刚刚定义的 System 类中查找 Runtime 类型,而不是在 System Namespace 中。

如果你把 global: 放在 System.Runtime 前面,它至少会编译。

public partial class System : object, global:System.Runtime.Serialization.IExtensibleDataObject
{ ... }

看看下面的内容,它说明了您在 System 类中的确切问题:How to: Use the Global Namespace Alias

【讨论】:

  • +1 用于发布看起来可信的答案而无需查看大量代码:) 尽管您可能希望编辑答案以将 global: 放在 System.Runtime.Serialization 前面。第二个代码示例中的 IExtensibleDataObject...
  • 哦,是的。这就是问题的原因。但是文件“ClientCode.cs”是自动生成的,我们不能修改它。对吗?
  • 您不必使用自动生成的代码。查看以下文章:devx.com/codemag/Article/39837/0/page/5,其中展示了如何手动创建您自己的客户端代理。
猜你喜欢
  • 2021-04-17
  • 2015-09-09
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
相关资源
最近更新 更多