WCF net.pipe在接收响应时中止
此问题已解决WCF net.pipe在接收响应时中止,wcf,named-pipes,known-types,Wcf,Named Pipes,Known Types,此问题已解决 这是一份我无法通过服务电话获得的合同: [DataContract] public class myInitializationData : ClientInitializationData { [DataMember] public Dictionary<string, string> CultureNameLookup { get; set; } } 我的目标是通过myInitializationData合同跨线路发送ServiceType实体
这是一份我无法通过服务电话获得的合同:
[DataContract]
public class myInitializationData : ClientInitializationData
{
[DataMember]
public Dictionary<string, string> CultureNameLookup { get; set; }
}
我的目标是通过myInitializationData
合同跨线路发送ServiceType
实体
我无法使用ServiceType
的KnownType装饰myInitializationData
或ClientInitializationData
类,因为这些类与Silverlight项目共享(链接)。因此,如果我用ServiceType
的KnownType修饰这两个类中的任何一个,Silverlight端将无法编译
我没有直接装饰类,而是用ServiceKnownTypeServiceType
装饰服务契约:
[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).
我已启用跟踪调试,但在客户端或服务器的跟踪中未发现有关序列化失败的消息
服务器跟踪:
- 通过一个频道接收消息 (行动:)
- 执行 (iSeries.InitializeClient)
- 发件人:执行 (iSeries.InitializeClient)
- 通过通道发送消息 (行动:)
- 警告 出现故障的系统.ServiceModel.Channel.ServerSessionPreambleConnectionReader+ServerFramingDuplexSessionChannel
- 警告 出现故障的System.ServiceModel.Channel.ServiceChannel
- 答复操作时引发异常 (ObjectContext实例已被释放,不能再用于需要连接的操作。)
- 通过通道发送消息 (行动:)
- 抛出异常 (从管道读取时出错:管道已结束。(109,0x6d)
ClientInitializationData
DataContract中选择ServiceTypes
属性,则此错误将消失。因此,我假设这一定是一个序列化问题:接口和KnownTypes,但WCF并没有声称跟踪中存在任何序列化问题,我也不确定在这种情况下跟踪意味着什么。
解决方案
这不是一个众所周知的问题。这是懒散加载在定义
ServiceType
类型的实体上下文上自发启用的结果
虽然没有提到跟踪中有过多的消息或缓冲区大小被违反(在客户端或服务器端),但我必须假设在EF上下文上启用LazyLoading会导致DataContractSerializer触发EF获取大量记录,这反过来会导致生成大量图(尝试)在线路上。在消息写入期间,服务器端只是(含糊不清地)对通道进行了故障处理
在EF上下文中将懒散加载返回到禁用状态解决了此问题。这不是KnownTypes问题。这是在定义服务类型的实体上下文上自动启用懒散加载的结果 虽然没有提到跟踪中(在客户端或服务器端)存在过多的消息或违反缓冲区大小的情况,但我必须假设在EF上下文上启用LazyLoading导致DataContractSerializer触发EF获取大量记录,这反过来又导致(尝试)大量图形在消息写入过程中,服务器端只是(含糊不清地)对通道进行了故障处理 在EF上下文中将LazyLoading返回到禁用状态解决了这个问题
[ServiceContract]
[ServiceKnownType(typeof(ServiceType))]
public interface IService
{
[OperationContract]
myInitializationData InitializeClient();
}
There was an error reading from the pipe: The pipe has been ended. (109, 0x6d).