我的WCF服务使用.NET 4.5.1,客户端windows服务应用程序使用.NET 4.0。
在数据契约中,有一个类型为DataMember的DateTimeOffset? (可空的DataTimeOffset)。
当我将服务引用添加到WCF服务时,它认为DateTimeOffset?是一个复杂的类型。换句话说,它不认为它是System.DateTimeOffset?,它认为它是ServiceReference1.DateTimeOffset?
我该怎么解决这个问题?
到目前为止,我尝试过的是:
DataContract类注释[KnownType(typeof(DateTimeOffset?))]。不幸的是这没什么用。有人对如何解决这个问题有其他想法吗?
谢谢。
发布于 2015-07-24 21:22:59
你和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();
}
}
}发布于 2015-07-26 15:38:13
当您的数据契约项目没有正确构建,或者您没有选择重用包含DateTimeOffset和Nullable<> - mscorlib和/或数据契约项目的库时,就会发生这种情况。
所以要确保:

mscorlib和您的数据契约项目都在引用列表中,哪些类型需要重用,或者您选择在所有引用的程序集中重用类型:
发布于 2014-06-12 14:02:38
您肯定需要指定“引用程序集中的重用类型”才能获得所要寻找的行为。
接下来的问题是,是什么导致您的服务在控制台应用程序中不可用。我猜您的解决方案没有完全正确地设置,但我需要更多的细节。包含控制台应用程序的解决方案的屏幕截图将是理想的。
您是否将服务引用添加到Console App项目或其他项目?
https://stackoverflow.com/questions/24171038
复制相似问题