MaximusDebois Ответов: 0

Удаленное взаимодействие: запрошенные услуги не найдены


Я создаю удаленное приложение на c# с серверным приложением и клиентским приложением, а также централизованной базой данных с использованием sql server. Каждый раз, когда я запускаю приложение, серверное приложение работает нормально, но клиентское приложение сталкивается с ошибкой, говорящей, что запрошенные службы не найдены.
Клиентское и серверное приложения зависят от dll-файла, созданного из библиотеки классов. dll-файл-это то, что клиентское приложение использует для подключения к базе данных, но всякий раз, когда я запускаю его, я получаю запрошенные службы, которые не найдены.

Что я уже пробовал:

в серверном приложении у меня есть такой код
public TcpChannel channel;
        public Main()
        {
            
            InitializeComponent();
            channel = new TcpChannel(9090);
            ChannelServices.RegisterChannel(channel, false);
            RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType("RemotingClass.RemoteClass,RemotingClass"), 
			"RemoteClass", WellKnownObjectMode.Singleton);

        }

        private void Main_Load(object sender, EventArgs e)
        {
            Loadall();
        }


и серверное приложение имеет этот код
private RemoteClass remoteClass;
        private string URL;
        public Main()
        {
            InitializeComponent();
            URL = "tcp://localhost:9090/RemoteClass";
            remoteClass = (RemoteClass)Activator.GetObject(typeof(RemoteClass), URL);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            remoteClass.Add_Student(txtName.Text, txtAddress.Text, txtPhone.Text);
            Loadall();
        }

ДЛЛ файл, созданный на основе библиотеки классов называется remotingclass который содержит класс с именем remoteclass и имеет следующий код
public class RemoteClass : MarshalByRefObject
    {
        DataAccessLayer DAL = new DataAccessLayer();
        public DataTable Get_Students()
        {
            DAL.Open();
            DataTable dt = new DataTable();
            dt = DAL.SelectData("Get_Student", null);
            DAL.Close();
            return dt;
        }

        public void Add_Student(string Name, string Address, string Phone)
        {
            DAL.Open();
            SqlParameter[] para = new SqlParameter[3];
            para[0] = new SqlParameter("@Name", SqlDbType.NVarChar, 50);
            para[0].Value = Name;
            para[1] = new SqlParameter("@Address", SqlDbType.NVarChar, 50);
            para[1].Value = Address;
            para[2] = new SqlParameter("@Phone", SqlDbType.NVarChar, 10);
            para[2].Value = Phone;
            DAL.ExecuteCommand("Add_Student", para);
        }
        public void Update_Student(int ID, string Name, string Address, string Phone)
        {
            DAL.Open();
            SqlParameter[] para = new SqlParameter[4];
            para[1] = new SqlParameter("@Name", SqlDbType.NVarChar, 50);
            para[1].Value = Name;
            para[2] = new SqlParameter("@Address", SqlDbType.NVarChar, 50);
            para[2].Value = Address;
            para[3] = new SqlParameter("@Phone", SqlDbType.NVarChar, 10);
            para[3].Value = Phone;
            para[0] = new SqlParameter("@ID", SqlDbType.Int);
            para[0].Value = ID;
            DAL.ExecuteCommand("Update_Student", para);
        }
        public void Delete_Student(int ID)
        {
            DAL.Open();
            SqlParameter[] para = new SqlParameter[1];
            para[0] = new SqlParameter("@ID", SqlDbType.Int);
            para[0].Value = ID;
            DAL.ExecuteCommand("Delete_Student", para);
        }


dll файл также содержит класс для подключения к базе данных под названием dataaccesslayer
class DataAccessLayer
    {
        SqlConnection con = new SqlConnection();

        public DataAccessLayer()
        {
            con.ConnectionString = "Data Source=MaximusDebois;Initial Catalog=Remoting;Integrated Security=True";
        }

        public void Open()
        {
            if (con.State != ConnectionState.Open)
            {
                con.Open();
            }
        }
        public void Close()
        {
            if (con.State != ConnectionState.Closed)
            {
                con.Close();
            }
        }

        public DataTable SelectData(string procedureName, SqlParameter[] para)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = procedureName;
            cmd.Connection = con;
            if (para != null)
            {
                for (int i = 0; i < para.Length; i++)
                {
                    cmd.Parameters.Add(para);
                }
            }
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            return dt;
        }

        public void ExecuteCommand(string procedureName, SqlParameter[] para)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = procedureName;
            cmd.Connection = con;
            if (para != null)
            {
                cmd.Parameters.AddRange(para);
            }
            cmd.ExecuteNonQuery();
        }
    }

Richard MacCutchan

Пожалуйста, правильно отформатируйте свой код, а также укажите, где возникает проблема.

MaximusDebois

Проблема возникает, когда я запускаю клиентское приложение, есть ошибка запрошенная служба не найдена

Gerry Schmitz

Вы "тестировали" свою строку подключения? Именно при "открытом" соединении вы обычно сталкиваетесь с проблемами (если приложение вообще будет работать).

MaximusDebois

Я нашел решение проблемы в серверном приложении. Первоначально это было так:
частный RemoteClass remoteClass;
частная строка URL;
основные общественные()
{
метод InitializeComponent();
URL = "tcp://localhost:9090/RemoteClass";
remoteClass = (RemoteClass)активатор.GetObject(typeof(RemoteClass), URL);
}

частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
дистанционный класс.Add_Student(txtName.Текст, txtAddress.Текст, txtPhone.Текст);
Loadall();
}
проблема была в url-адресе. Я вызывал класс в dll который был remoteclass вместо того чтобы вызывать саму dll которая является RemotingClass

0 Ответов