none
WCF如何调用反射工厂模式下的逻辑层方法? RRS feed

  • 问题

  • 我用反射工厂模式写的一个BLL逻辑层代码,结构类似PetShop4,其中逻辑层BLL工程有个方法,需要在WCF里使用

    我该怎么用呢?用的是.net 4的WCF

    2014年2月9日 5:06

全部回复

  • 用工厂创建BLL实例, 调用对应方法

    不是这样吗,有什么问题?


    http://feiyun0112.cnblogs.com/

    2014年2月10日 7:31
    版主
  • 我是这样做。。但是客户端访问的时候出错。。
    2014年2月15日 15:01
  •  WCF:

    接口

        [ServiceContract]
        public interface IPassport
        {

            [OperationContract]
            string GetData(int value);

            [OperationContract]
            CompositeType GetDataUsingDataContract(CompositeType composite);

            // TODO: 在此添加您的服务操作
            [OperationContract]
            Member Login(string account, string password, string machinecode);
        }

    接口实现

            public Member Login(string account, string password, string machinecode)
            {
                return new MemberBLL().Login(account, password, machinecode);
            }




    • 已编辑 Lacuz 2014年2月15日 16:52
    2014年2月15日 15:05
  • 我是这样做。。但是客户端访问的时候出错。。

    你好!

    请问出现的是什么样错误,请提供这个error message.

    另外断点调试你的代码,看是不是BLL层的错误。还要确保返回类型是可序列化的。

    谢谢!

    2014年2月16日 3:22
    版主
  • 
    
    
    
    
    Login这个方法在web项目里也有用到啊,是好用的,我发现不是反射的问题,就算连SQLServer数据库操作也会报错。错误提示是让我通过WCF的Exception查看错误或者另外一额什么东西调试,具体我忘了,没有显示具体错误,代码晚上发上来~程序不在身边~
    
    2014年2月17日 5:20
  • Passport.svc

    namespace WcfService
    {
        public class Passport : IPassport
        {
            public Member Login(string account, string password)
            {
                Member m = null;
    
                StringBuilder strSQL = new StringBuilder();
                strSQL.Append("SELECT Id, Account, Password, Status, ExpireTime FROM [Member]");
                strSQL.Append(" WHERE Account = @Account AND Password = @Password");
    
                SqlParameter[] parms = new SqlParameter[]
                {
                    new SqlParameter("@Account",account),
                    new SqlParameter("@Password",password)
                };
    
                SqlDataReader rdr = SqlHelper.ExecuteReader(strSQL.ToString(), parms);
                if (rdr.Read())
                {
                    m = new Member(
                         rdr.GetInt32(0),
                         rdr.GetString(1),
                         rdr.GetString(2),
                         rdr.GetInt32(3),
                         rdr.GetDateTime(4)
                     );
                }
                return m;
            }
        }
    }

    IPassport.cs

    namespace WcfService
    {
        [ServiceContract]
        public interface IPassport
        {
            [OperationContract]
            Member Login(string account, string password);
        }
    }

    错误提示:

    由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或在打开每个 Microsoft .NET Framework 3.0 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)
       在 IPassport.Login(String account, String password)
       在 PassportClient.Login(String account, String password)

    2014年2月17日 13:13
  • SqlDataReader rdr = SqlHelper.ExecuteReader(strSQL.ToString(), parms); 调试的时候这里报错,貌似只要用了别的项目的引用就发生错误
    2014年2月17日 13:18
  • SqlDataReader rdr = SqlHelper.ExecuteReader(strSQL.ToString(), parms); 调试的时候这里报错,貌似只要用了别的项目的引用就发生错误

    如果是这行代码出错, 我觉得是执行ado.net语句有错误才会导致服务操作抛出异常。

    所以你应该检查sql语句和参数是否正确。

    2014年3月7日 9:00
    版主
  • 保证是你需要使用的方法的类,然后强转,如果保证不了强转会出错
    2014年3月12日 3:16
  • 代码没细看,但是错误说的是你WCF服务端发布和客户端版本不一致,更新下引用看看
    2014年3月27日 8:23
  • 我是本机测试,用WCF测试客户端试的,应该不存在版本不一致问题

    2014年4月6日 14:09
  • SQL语句没错啊,这个操作在WEB上也用的,正常的
    2014年4月6日 14:10