首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTimeOffset的WCF服务参考?不使用FCL类型

DateTimeOffset的WCF服务参考?不使用FCL类型
EN

Stack Overflow用户
提问于 2014-06-11 19:27:21
回答 3查看 885关注 0票数 12

我的WCF服务使用.NET 4.5.1,客户端windows服务应用程序使用.NET 4.0。

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

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

我该怎么解决这个问题?

到目前为止,我尝试过的是:

  1. 创建演示这一点的最简单的示例解决方案。不幸的是,我无法重新创建这个问题,所以它肯定是我的配置所特有的。
  2. DataContract类注释[KnownType(typeof(DateTimeOffset?))]。不幸的是这没什么用。
  3. 检查“引用程序集中的重用类型”。这导致"ServiceReference1“对象在控制台应用程序中根本不可用。

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

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-07-24 21:22:59

你和KnownType走在正确的轨道上。

为了达到您的目标,您不能使用“添加服务引用”。相反,客户端应用程序必须具有对ServiceContract类的引用。然后,可以使用ChannelFactory直接调用服务。

服务器代码:

代码语言:javascript
复制
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; }
    }
}

客户代码

代码语言:javascript
复制
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();
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-07-26 15:38:13

当您的数据契约项目没有正确构建,或者您没有选择重用包含DateTimeOffsetNullable<> - mscorlib和/或数据契约项目的库时,就会发生这种情况。

所以要确保:

  1. 数据契约项目目标框架不大于.NET Framework4.0。因为.NET框架是not forward compatable。客户项目对它的引用不得标记为警告标志:

  1. 建立数据合同项目
  2. mscorlib和您的数据契约项目都在引用列表中,哪些类型需要重用,或者您选择在所有引用的程序集中重用类型:

票数 1
EN

Stack Overflow用户

发布于 2014-06-12 14:02:38

您肯定需要指定“引用程序集中的重用类型”才能获得所要寻找的行为。

接下来的问题是,是什么导致您的服务在控制台应用程序中不可用。我猜您的解决方案没有完全正确地设置,但我需要更多的细节。包含控制台应用程序的解决方案的屏幕截图将是理想的。

您是否将服务引用添加到Console App项目或其他项目?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24171038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档