wcf net.pipe在接收回复时中止
-
30-09-2019 - |
题
这已经解决
这是我无法从服务电话获得的合同:
[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
是一个接口。我意识到我无法在电线上发送接口。有一个实体框架实体, ServiceType
, ,实施 IServiceType
界面:
public partial class ServiceType : IServiceType
{
//...
}
我的目标是发送 ServiceType
通过电线穿过电线的实体 myInitializationData
合同。
我阻止了装饰 myInitializationData
或者 ClientInitializationData
著名类型的课程 ServiceType
, ,因为这些类是共享(链接)到Silverlight项目的。因此,如果我用著名的象图装饰这两个课程 ServiceType
, ,Silverlight侧(S)将无法编译。
我没有直接装饰课程,而是用一个服务众所周知的服务合同装饰 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).
我启用了跟踪调试,但没有发现有关客户端或服务器中未能在跟踪中序列化的消息。
服务器跟踪:
- 接收到频道的消息(行动: http://tempuri.org/iservice/initializeclient)
- 执行 (iservice.Initializeclient)
- 来自:执行(执行iservice.Initializeclient)
- 通过频道发送消息(行动: http://tempuri.org/iservice/initializeclientresponse)
- 警告故障系统。ServiceModel.Channels.ServersessionPreambleconNectionReader+ServerFramingDuplexSessionChannel
- 警告故障系统。ServiceModel.Channels.ServiceChannel
- 回复操作的例外(ObjectContext实例已被处置,不再可用于需要连接的操作。)
客户端跟踪:
- 通过频道发送消息(行动: http://tempuri.org/iservice/initializeclient)
- 抛出例外(管道上有一个错误读数:管道已经结束。 (109,0x6d)。)
如果我选择 ServiceTypes
属性 ClientInitializationData
数据合同,此错误消失了。因此,我认为这一定是一个序列化问题:接口和著名象征,但是WCF并未声称在跟踪中存在任何序列化问题,并且在这种情况下,我不确定跟踪的含义。
解决方案
这不是著名的问题。这是在实体上下文上自发启用懒惰的结果 ServiceType
类型。
尽管没有提及在跟踪中(在客户端或服务器侧)中违反过多的消息或缓冲区大小,但我必须假设在EF上下文上延迟载荷的启用导致Datacontractserialializer触发EF触发EF以获取EF 很多 记录,这又导致了电线上的大量图(尝试)。在消息写入期间,服务器端简单地(歧义地)对通道的错误。
此后,在EF上下文上返回Lazyloadation已解决了此问题。
解决方案
这不是著名的问题。这是在定义ServiceType类型的实体上下文上自发启用的懒惰的结果。
尽管没有提及在跟踪中(在客户端或服务器侧)中违反过多的消息或缓冲区大小,但我必须假设在EF上下文上延迟载荷的启用导致Datacontractserialializer触发EF触发EF,以获取许多记录,这又导致了电线上的大量图(尝试)。在消息写入期间,服务器端简单地(歧义地)对通道的错误。
此后,在EF上下文上返回Lazyloadation已解决了此问题。