Удаленное взаимодействие: запрошенные услуги не найдены
Я создаю удаленное приложение на 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