C#SVC Server对象具有公共方法,客户端对象不具有

时间:2016-09-26 03:29:23

标签: c# .net wcf

我已经声明了一个名为Authentication的方法,此方法将AuthenticationRequest作为输入。所以这就是我的问题开始的地方。我已将AuthenicationRequest上的用户名和密码变量设置为private,因此我使用重载的构造函数来设置它们并使用getter来返回它们。在我的客户端上,我试图调用Authentication(new AuthenticationRequest("",""))但是无法识别重载的构造函数。我正在使用C#WCF服务。我正在使用visual studio从Web地址生成客户端代码。 下面我将发布我的课程副本。我不太了解WCF,但据我所知,在某些事情上你需要[属性]。

鉴权请求

using Classes.General;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Web;

namespace Classes.Authentication
{
    [DataContract]
    public class AuthenicationRequest : Status
    {

        [DataMember]
        private String Email, Password;


        public AuthenicationRequest(String Email, String Password)
        {
            this.Email = Email;
            this.Password = Password;
        }

        public void doWork()
        {

        }

        public String GetEmail()
        {
            return this.Email;
        }

        public String GetPassword()
        {
            return this.Password;
        }
    }
}

Authentication.svc.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using MySql.Data.MySqlClient;
using Classes.General;
using Classes.Users;
using Classes.Authentication;

namespace WebApi_Nepp_Studios.Endpoints
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Authentication" in code, svc and config file together.
    // NOTE: In order to launch WCF Test Client for testing this service, please select Authentication.svc or Authenication.svc.cs at the Solution Explorer and start debugging.
    [ServiceContract]
    public class Authentication
    {
        //Declare the MySQL variable for global databse operations
        MySqlConnection conn = new MySqlConnection(Properties.Resources.Cs);
        MySqlCommand cmd;
        MySqlDataReader reader;

        [OperationContract]
        public AuthenicationResponse Authenicate(AuthenicationRequest input)
        {
            //Blah blah blah
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你无法做你想做的事。但是,您要生成客户端代码,它只会带来标有[DataMember]的内容。

查看此答案 - > Constructor in WCF DataContract not reflected on Client

这意味着你不应该使用私有的setter。我不知道你正在做什么的规范,但一般来说,数据合同的所有属性都应声明如下:

[DataMember]
string Email { get; set; }
string Password { get; set; }

当您创建DataContract时,所有属性都应该是公共的,因为外部客户端将使用此数据协定来调用您的服务。除了具有公共getter和setter的公共属性之外,DataContract不应包含任何内容。

从您的其他问题来看,听起来您并不十分清楚WCF应该用于什么。您当前的身份验证请求上有doWork()方法。 WCF生成的代码无法传递这样的逻辑,它只能传递属性定义。如果您需要完成逻辑,它应该在WCF应用程序内部发生。

您应该将WCF视为Web API,客户端向WCF应用程序发送请求,在这种情况下是一个身份验证请求,设置电子邮件和密码,在WCF应用程序内部完成处理该请求的工作,然后WCF应用程序发送响应。

如果上述内容不够明确,请告诉我,我可以尝试清理它。

编辑:

DoWork()方法可以移出DataContract,而是放在Authentication serviceContract上的Authenticate()方法中。 Authenticate()方法将是发送请求时调用的实际方法。