c# SVC服务器对象有公共方法,客户端对象没有

本文关键字:对象 客户端 方法 SVC 服务器 | 更新日期: 2023-09-27 18:08:41

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

AuthenticationRequest

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
        }
    }
}

c# SVC服务器对象有公共方法,客户端对象没有

你不能做你想做的。无论你是如何生成你的客户端代码,它只会带来标记为[DataMember]的东西。

查看此答案-> WCF数据合约中的构造函数未反映在客户端

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

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

当你创建一个数据契约时,所有的属性都应该是公共的,因为这个数据契约将被外部客户端用来调用你的服务。一个DataContract不应该包含任何东西,除了带有公共getter和setter的公共属性。

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

你应该把WCF想象成一个Web API,客户端向WCF应用程序发送一个请求,在这个例子中是一个身份验证请求,设置电子邮件和密码,在WCF应用程序内部完成处理请求的工作,然后WCF应用程序发送响应。

如果上面的内容不够清楚,请告诉我,我可以试着解释清楚。

编辑:

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

相关文章: