如何通过WCF传递System.Drawing.Rectangle?

时间:2013-07-10 12:28:09

标签: c# wcf namespaces system.drawing

我有一个使用类

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

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

1 个答案:

答案 0 :(得分: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重用。