此问题已解决
这是我无法通过服务电话获得的合同:
[DataContract]
public class myInitializationData : ClientInitializationData
{
[DataMember]
public Dictionary<string, string> CultureNameLookup { get; set; }
}
这是它的基本类型,
[DataContract]
public class ClientInitializationData
{
[DataMember]
public List<IServiceType> ServiceTypes { get; set; }
}
IServiceType
是一个界面。我意识到我不能通过电线发送接口。有一个EntityFramework实体ServiceType
,实现了IServiceType
接口:
public partial class ServiceType : IServiceType
{
//...
}
我的目标是通过ServiceType
合同发送myInitializationData
个实体。
我无法使用KnownType myInitializationData
来装饰ClientInitializationData
或ServiceType
类,因为这些类与Silverlight项目共享(链接)。因此,如果我使用ServiceType
的KnownType装饰这些类中的任何一个,Silverlight端将无法编译。
我没有直接装饰类,而是用ServiceKnownType ServiceType
修饰了服务合同:
[ServiceContract]
[ServiceKnownType(typeof(ServiceType))]
public interface IService
{
[OperationContract]
myInitializationData InitializeClient();
}
这应该有用吗?
调用IService.InitializeClient
时,我在客户端收到以下错误:
There was an error reading from the pipe: The pipe has been ended. (109, 0x6d).
我已启用跟踪调试,但未发现有关客户端或服务器的跟踪序列化失败的消息。
服务器跟踪:
客户跟踪:
如果我从ServiceTypes
DataContract中选择ClientInitializationData
属性,则此错误消失。所以我认为这必须是一个序列化问题:接口和KnownTypes,但WCF并没有声称在跟踪中有任何序列化问题,我不确定跟踪在这种情况下意味着什么。
这不是KnownTypes问题。这是LazyLoading在定义ServiceType
类型的实体上下文中自发启用的结果。
虽然在跟踪中没有提到过多的消息或缓冲区大小(在客户端或服务器端),但我必须假设在EF上下文中启用LazyLoading导致DataContractSerializer触发EF获取<强大>很多的记录,这反过来导致在线上(尝试)大量图表。服务器端在消息写入期间简单地(并且模糊地)故障通道。
在EF上下文中将LazyLoading返回到禁用状态已经解决了这个问题。
答案 0 :(得分:1)
这不是KnownTypes问题。这是在定义ServiceType类型的实体上下文中自发启用LazyLoading的结果。
虽然跟踪中没有提到过多的消息或缓冲区大小(在客户端或服务器端),但我必须假设在EF上下文中启用LazyLoading导致DataContractSerializer触发EF获取许多记录,这反过来导致在线上(尝试)大量图表。服务器端在消息写入期间简单地(并且模糊地)故障通道。
在EF上下文中将LazyLoading返回到禁用状态已经解决了这个问题。