【问题标题】:How do I pass a System.Drawing.Rectangle over WCF?如何通过 WCF 传递 System.Drawing.Rectangle?
【发布时间】:2013-07-10 12:28:08
【问题描述】:

我有一个使用类的 WCF 服务

namespace MyService
{
    [DataContract]
    public class SomeResponse
    {
        [DataMember]
        public System.Drawing.Rectangle BoundingBox { get; set; }
    }
}

在客户端,当我尝试访问BoundingBox 矩形时,矩形将其命名空间从System.Drawing.Rectangle 更改为MyServiceReference.Rectangle。 我希望 WCF 框架足够聪明,能够意识到 System.Drawing.Rectangle 也存在于客户端并因此使用正确的命名空间。是否可以告诉服务这样做?

【问题讨论】:

  • 我认为这应该回答你的问题:stackoverflow.com/questions/1200346/…
  • 嗯...我不这么认为。我不想更改SomeResponse 的命名空间,而是更改BoundingBox 之一。而[DataMember] 不接受命名空间。
  • 糟糕,错误的链接:)。试试这个:blogs.msdn.com/b/jannemattila/archive/2008/10/15/…
  • 没有帮助 :( 在所有引用的程序集中重用类型已被激活。但是,当激活“在指定引用的程序集中重用类型”时,我没有选择 System.Drawing 的选项。
  • 啊……我的错!我只是没有添加 System.Drawing 作为对我项目的引用!

标签: c# wcf namespaces system.drawing


【解决方案1】:

这里的主要问题是 WCF 使用 SOAP 来发送/接收数据,它不是直接连接到 .net 而是一个开放的 Web 标准。例如。 java 客户端也可能使用数据,因此对System.Drawing.Rectangle 命名空间一无所知。但是,它可以使用 Web 服务定义语言中提供的 Rectangle 并将其映射到 java Rectangle 结构。

在您的情况下,您可能希望将System.Drawing.Rectangle 转换为MyServiceReference.Rectangle。但是,WCF 通过检查属性中的“Reuse types in all referenced assemblies”选项为此提供了内置支持:

将服务引用添加到项目时,在 该服务是在本地项目中生成的。在很多情况下,这 当服务使用通用 .NET Framework 时创建重复类型 类型或在共享库中定义类型时。

为避免此问题,引用程序集中的类型由 默认。如果您想为一个或多个禁用类型共享 程序集,您可以在“配置服务引用”对话框中执行此操作 盒子。

link 提供了有关如何启用/使用此功能的示例。

最后,确保在您的客户端应用程序中引用了所有正确的程序集。如果不被引用,显然不能被 WCF 重用。

【讨论】:

  • 是的,我知道。但我认为该框架足够聪明,可以将其映射到已知名称空间,而不是创建一个新名称空间。 And it actually does, when 'Reuse types in all referenced assemblies' is checked.我的问题是,System.Drawing 没有被引用,因此我的客户项目不知道。如果您相应地编辑您的分析器,我可以接受它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2011-01-30
  • 2023-03-14
相关资源
最近更新 更多