Devforce 7.4.0.0。
我们有一个在服务器和客户端之间共享的DLL。目标是创建一个服务器方法,它将返回一些自定义(可序列化)对象的列表。
所以我在共享DLL中声明了这一点,没有创建服务器方法或更改任何其他方法,只是启动了项目。它崩溃了。然后我稍微更改了这段代码,它再次起作用。
我有一个带有" IKnownType"的接口的相同模式。和应用程序中另一个地方的一些子类,我没有这些问题。看起来它可能发生也可能不发生,这取决于命名空间或我无法发现的东西。
但是,这不是我第一次遇到DevForce继承问题。我在前一次提到的另一个案例中发现,如果你的继承深度高于两个级别(即基本类型' A'它是" IKnownType" - > B (衍生自A) - > C(衍生自B)),然后我遇到了同样的问题。最糟糕的是,您从DevForce获得的消息并未提示您类型存在问题。
服务器/客户端DevForce日志中没有提到类型错误的内容。这两个都显示为IdeaBlade.EntityModel.KnownTypeHelper +<> c:b__5_1
我还尝试了一种基于IKnownTypeProvider的替代方法,这次应用程序启动了,但是当我调用使用这些类型的服务器方法时它就崩溃了。
非工作代码,编译,启动,崩溃(请参阅下面的堆栈跟踪):
public interface IMyProjection : IKnownType {
long Id {
get;set;
}
}
public class MyProjection : IMyProjection {
public long Id {
get; set;
}
public string Name {
get; set;
}
public bool IsLocked {
get;set;
}
}
工作代码,没有继承,编译,运行..:
public class MyProjection : IKnownType {
public long Id {
get; set;
}
public string Name {
get; set;
}
public bool IsLocked {
get;set;
}
}
服务器堆栈跟踪:
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at IdeaBlade.EntityModel.IEntityServerContract.Login(ILoginCredential credential)
at IdeaBlade.EntityModel.RemoteEntityServerProxy.<>c__DisplayClass3_0.<Login>b__0()
at IdeaBlade.EntityModel.WCF.RetryStrategy.ExecuteAction[TResult](Func`1 func)
at IdeaBlade.EntityModel.RemoteEntityServerProxy.ExecuteOnServer[T](Func`1 function, IRetryPolicy policy)