我已经声明了一个名为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
}
}
}
答案 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()方法将是发送请求时调用的实际方法。