【发布时间】:2009-09-07 12:01:11
【问题描述】:
我在使用 WCF 服务时遇到问题。返回类型是一个半复杂类型,它引用了各种基本类型和每个类型继承的基本接口。
在我的调试中,序列化消息的总字节大小远低于默认的 65535 字节阈值。尽管如此,我已将 maxReceivedMessageSize 属性增加到 1000000,但问题仍然存在。
WCF服务定义如下:
[ServiceContract]
public interface ILoggingService
{
[OperationContract]
NotesInfo ListNotes(NotesQueryOptions options);
}
NotesInfo 返回对象的定义如下:
[DataContract]
public class NotesInfo
{
[DataMember] public List<TokenizedNote> Notes { get; set; }
[DataMember] public Dictionary<long, User> Users { get; set; }
[DataMember] public Dictionary<long, NoteCategory> NoteCategories { get; set; }
[DataMember] public Dictionary<string, Dictionary<long, IIdentifiable<long>>> EntitiesByToken { get; set; }
}
当我尝试调用服务时,抛出以下异常:
服务器没有提供 有意义的回复;这可能是由于 由于合同不匹配,过早 会话关闭或内部服务器 错误。描述:一个未处理的 期间发生异常 执行当前的 Web 请求。 请查看堆栈跟踪以获取更多信息 有关错误和位置的信息 它起源于代码。
异常详情: System.ServiceModel.CommunicationException: 服务器没有提供 有意义的回复;这可能是由于 由于合同不匹配,过早 会话关闭或内部服务器 错误。
来源错误:
Line 242:
Line 243: public AxeFrog.Mobile.NotesInfo ListNotes(AxeFrog.Mobile.NotesQueryOptions options) {
Line 244: return base.Channel.ListNotes(options);
Line 245: }
Line 246: }
源文件: C:\用户\内森\工作\内部 项目\AxeFrog System\Source\Trunk\AxeFrog.Mobile.WebInterface\Service 参考\LoggingServiceReference\Reference.cs 线路:244
以下是其他相关实体的代码:
public interface IIdentifiable<TID>
{
TID ID { get; set; }
}
[DataContract]
public class Note : IIdentifiable<long>
{
[DataMember] public long ID { get; set; }
[DataMember] public DateTime DateStamp { get; set; }
[DataMember] public long? UserID { get; set; }
[DataMember] public long NoteCategoryID { get; set; }
[DataMember] public NoteType NoteType { get; set; }
[DataMember] public string Message { get; set; }
}
public enum NoteType
{
Information = 0,
Warning = 10,
Failure = 20
}
[DataContract]
public class NoteCategory : IIdentifiable<long>
{
[DataMember] public long ID { get; set; }
[DataMember] public string Name { get; set; }
}
[DataContract]
public class NoteEntityType : IIdentifiable<long>
{
[DataMember] public long ID { get; set; }
[DataMember] public Type TypeName { get; set; }
}
[DataContract]
public class TokenizedNote
{
[DataMember] public Note Note { get; set; }
[DataMember] public List<NoteSegment> NoteSegments { get; set; }
}
public abstract class NoteSegment
{
public abstract string Render(INoteRenderer renderer, Dictionary<string, Dictionary<long, IIdentifiable<long>>> entitiesByToken);
}
[DataContract]
public class NoteTextSegment : NoteSegment
{
[DataMember]
public string Text { get; set; }
}
[DataContract]
public class NoteEntitySegment : NoteSegment
{
[DataMember] public long EntityID { get; set; }
[DataMember] public string Token { get; set; }
}
请注意,为了便于阅读,我已从 NoteSegment 的抽象实现中删除了 Render() 覆盖。
以下是来自调试器的一些信息,以便您查看返回的内容:
对我在这里可能做错的任何见解将不胜感激。谷歌搜索很少能找到有用的答案。
【问题讨论】:
-
这是在防火墙后面的公司 LAN 上吗?在这种情况下,我会推荐 NetTcp 绑定——比标准的、重量级的 wsHttpBinding 更快、更高效...
-
但 netTcp 需要 IIS7(Win Server 2008 或更高版本或 Vista)或自托管
-
不,现在都在本地主机上。