【问题标题】:WCF Service Reference for DateTimeOffset? not using FCL typeDateTimeOffset 的 WCF 服务参考?不使用 FCL 类型
【发布时间】:2014-06-11 19:27:21
【问题描述】:

我将 .NET 4.5.1 用于我的 WCF 服务,将 .NET 4.0 用于客户端 Windows 服务应用程序。

在数据协定中,有一个 DateTimeOffset? 类型的 DataMember(可以为空的 DataTimeOffset)。

当我向 WCF 服务添加服务引用时,它认为DateTimeOffset? 是一个复杂类型。换句话说,它不认为是System.DateTimeOffset?,而是认为是ServiceReference1.DateTimeOffset?

我该如何解决这个问题?

这是我迄今为止尝试过的:

  1. 创建最简单的示例解决方案来演示这一点。不幸的是,我无法重现该问题,因此它必须是我的配置所独有的。

  2. [KnownType(typeof(DateTimeOffset?))] 注释DataContract 类。不幸的是,这并没有做任何事情。

  3. 选中“在引用的程序集中重用类型”。这导致“ServiceReference1”对象在控制台应用程序中根本不可用。

有人对如何解决这个问题有任何其他想法吗?

谢谢。

【问题讨论】:

  • 您的客户端解决方案是什么样的?您是否在测试客户端中包含服务程序集?
  • @dblood,感谢您的回复。是的,这很奇怪。我在自己的项目(类库)中有数据协定,WCF 项目和控制台应用程序项目都引用了它。
  • 好的,很好。我们以前使用过这种确切类型的解决方案。可以为客户发布解决方案资源管理器的屏幕截图吗?
  • 你写的是客户端认为它是一个类型ServiceReference1.DataTimeOffset?(注意Data中的第二个a)。我认为这只是这个问题的拼写错误?或者代码中是否有一些命名错误能够以某种方式避免引发错误?
  • @Kjartan 修正错字,谢谢

标签: c# .net wcf


【解决方案1】:

使用 KnownType,您走在正确的轨道上。

为了实现您的目标,您不能使用“添加服务参考”。相反,您的客户端应用程序必须引用您的 [ServiceContract] 类。然后,您可以使用 ChannelFactory 直接调用服务。

服务器代码:

using System;
using System.Runtime.Serialization;
using System.ServiceModel;

namespace Server
{
    public class Service : IService
    {
        public ReturnContract GetOffset()
        {
            return new ReturnContract { Offset = new DateTimeOffset(DateTime.Now) };
        }
    }

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        ReturnContract GetOffset();
    }

    [DataContract]
    [KnownType(typeof(DateTimeOffset))]
    public class ReturnContract
    {
        [DataMember]
        public DateTimeOffset? Offset { get; set; }
    }
}

客户代码

using Server;
using System;
using System.ServiceModel;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            var cf = new ChannelFactory<Server.IService>("endpoint");
            var service = cf.CreateChannel();
            ReturnContract c = service.GetOffset();

            Console.WriteLine(c.Offset);
            Console.ReadLine();
        }
    }
}

【讨论】:

    【解决方案2】:

    当您的数据合同项目未正确构建或您未选择重用包含 DateTimeOffsetNullable&lt;&gt; - mscorlib 和/或您的数据合同项目的库时,可能会发生这种情况。

    所以请确保:

    1. 数据合同项目目标框架不大于 .NET Framework 4.0。因为 .NET Framework 是 not forward compatable。客户项目对其的引用不得标有警告标志:

    2. 数据合约项目搭建
    3. mscorlib 和您的数据协定项目都在参考列表中,哪些类型需要重用,或者您选择在 所有 引用的程序集中重用类型:

    【讨论】:

      【解决方案3】:

      您肯定必须指定“在引用的程序集中重用类型”才能获得您正在寻找的行为。

      那么问题就变成了,是什么导致您的服务在您的控制台应用程序中不可用。我猜您的解决方案设置不正确,但我需要更多详细信息。包含控制台应用程序的解决方案的屏幕截图将是理想的。

      您是否将服务引用添加到控制台应用项目或其他项目?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多