关于 CSLA 服务器部署WCF访问出错的问题

时间:2024-10-04 11:05:20

MDAA项目 在以前的项目中,只要部署,从来没有发生过 通过WCF访问出错的问题,但是此次却出现如下问题:

2018-04-21 13:45:39,744 [119] ERROR Galaxy.OTC.VWGUI.FrmPaymentMethodManager [(null)] - System.ServiceModel.FaultException: 由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或打开对每个 Microsoft .NET Framework SDK 文档的跟踪并检查服务器跟踪日志。
Server stack trace: 
   在 System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
   在 System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]: 
   在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   在 Csla.Server.Hosts.IWcfPortal.Fetch(FetchRequest request)
   在 Csla.DataPortalClient.WcfProxy.Fetch(Type objectType, Object criteria, DataPortalContext context)
   在 Csla.DataPortal.Fetch(Type objectType, Object criteria)
   在 Csla.DataPortal.Fetch[T](Object criteria)
   在 PaymentMethodList.GetByName(String name, Int32 maxResult) 位置 \Objects\01地区\PaymentMethod.cs:行号 89
   在 FrmPaymentMethodManager.QueryItem(Object[] args) 位置 \地区\FrmPaymentMethodManager.cs:行号 241

感觉很是诧异,访问其它业务类却没有这个问题,百思不得其解,以为是不是 业务类中的字段 命名有问题,偿试了也是问题依旧。

最后根据方法访问的顺序思考了一下,是不是 查询参数类有问题啊,干脆照原类的定义照抄了一下,什么也没变,问题解决。

问题的结论:原参数类是定义在 MDAACommon类的,但现在是其它类库访问它,权限已经不同,不是同一个 包内的类,权限有限制,检查了原类的属性定义如下:

        #region 公有属性
        public string Name
        { get; internal set; }
        #endregion

把 internal 去掉就OK了。

记录于此,方便以后复查