积极答复者
论坛里的朋友帮帮忙,wcf调用这块遇到点问题 “基础连接已经关闭: 连接被意外关闭。”

问题
-
下面是我定义的接口,和数据协议<br/><br/>namespace WcfService1 { [ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); [OperationContract] WcfMessage GetDataUsingDataContract(CompositeType composite); [OperationContract] CompositeType GetDataUsingDataContract2(CompositeType composite); } [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] public string StringValue { get { return stringValue; } set { stringValue = value; } } } /// <summary> /// WCF传输对象 /// </summary> [DataContract] public class WcfMessage { /// <summary> /// 错误消息 /// </summary> [DataMember] public string ErrorMessage { get { return errorMessage; } set { if ((!string.IsNullOrEmpty(value)) && value.Length > 0) { HasError = true; errorMessage = value; } } } /// <summary> /// 是否包含错误 /// </summary> [DataMember] public bool HasError { get { return hasError; } set { hasError = value; } } /// <summary> /// wcf传输实体 /// </summary> [DataMember] public object Body { get; set; } private string errorMessage; private bool hasError = false; } }
调用如下:不知道上面什么地方有问题,请大家帮帮忙,是不是数据协议中的属性不能定义成object类型啊。为什么呢?public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } /// <summary> /// 出现“基础连接已经关闭: 连接被意外关闭。”错误 /// </summary> public WcfMessage GetDataUsingDataContract(CompositeType composite) { if (composite == null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue += "Suffix"; } WcfMessage wm = new WcfMessage(); wm.Body = null; //如果给Body赋值为null,没有错误 wm.HasError = true; return wm; } /// <summary> /// 可以正常使用 /// </summary> public CompositeType GetDataUsingDataContract2(CompositeType composite) { if (composite == null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } }
答案
-
继承属于C#语言的特性,WCF面向服务编程,虽然语言使用C#,但是数据契约的使用,不支持泛型或者继承机制,如果你非要使用基类型,那么必须使用KnownType属性http://msdn.microsoft.com/zh-cn/library/ms730167.aspx标记。如果你在服务端使用了Object类型,实际客户端无法知道到底是什么类型,这可能导致序列化出错。
你这个错误应该也是服务内部引起的错误,和序列化有关系吧。
Frank Xu Lei--谦卑若愚,好学若饥
【老徐的网站】:http://www.frankxulei.com/- 已标记为答案 Peter pi - MSFTModerator 2012年1月6日 9:15
全部回复
-
继承属于C#语言的特性,WCF面向服务编程,虽然语言使用C#,但是数据契约的使用,不支持泛型或者继承机制,如果你非要使用基类型,那么必须使用KnownType属性http://msdn.microsoft.com/zh-cn/library/ms730167.aspx标记。如果你在服务端使用了Object类型,实际客户端无法知道到底是什么类型,这可能导致序列化出错。
你这个错误应该也是服务内部引起的错误,和序列化有关系吧。
Frank Xu Lei--谦卑若愚,好学若饥
【老徐的网站】:http://www.frankxulei.com/- 已标记为答案 Peter pi - MSFTModerator 2012年1月6日 9:15