Как открыть несколько каналов TCP (Remoting)

 
0
 
.NET
ava
CityAC | 25.09.2007, 23:22
Мне нужно на сервере зарегистрировать 2 канала один для приема сообщений другой для отправки.
В книге .NET сетевое прогр-е для профи написано:
"Нельзя зарегистрировать в домене приложения два канала с одним и тем же именем. По умолчанию ТСР канал получает имя "tcp" . Для регистрации двух каналов необходимо изменить имя соответствующего канала в свойстве ChanneName".
Пробовал -

TcpChannel tcpchan = new TcpChannel(4747);
tcpchan.ChannelName = "tcp2";

Ошибка! cвойство СhannelName - ReadOnly smile
Как же тогда его поменять?

UnregisterChannel первого канала и RegisterChannel второго канала не подходит т.к. нужно чтоб оба канала работали одновременно.
Каналы создаю и регистрирую в кострукторе формы сервера.
Comments (2)
ava
CityAC | 25.09.2007, 23:12 #
код удаленного объекта:

public class Proxy : MarshalByRefObject, IRemout
{
SqlConnection DBConnection;
public DataTable LoadCallBase(string login, string passw)
{
DBConnection = new SqlConnection();
DBConnection.ConnectionString = @"server=(local); uid=sa;pwd=;database=Taxi;Trusted_Connection=Yes";
DBConnection.Open();
// string query = @"USE taxi SELECT distinct dr.driver_id, p.*
// FROM tx_drivers dr INNER JOIN tx_person p ON dr.person_id = p.person_id";
string query2 = "Select* From tx_callbase";
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(query2, DBConnection);

da.Fill(dt);
DBConnection.Close();

return dt;
}
}

Этот код работает и возвращает клиенту таблицу.
Дополнительно нужно реализовать авторизацию
Клиент вызвывает этот метод передавая в параметрах свой логин и пароль.
Серверу нужно произвести авторизацию и по результатам вернуть таблицу(или не вернуть)
Проблема в том что я не могу понять как использовать переданные параметры.
Например я хочу сравнить логин и пароль с базой логинов в SQL2000 - это не проблема - сделал запрос в базу и вперед,
но как мне скажем получить здесь доступ к контроллу расположенному на форме сервера.
Типа в поле текст отобразить "Клиент {login}" авторизовался.
Наподобие как чат: на клиенте написал - на сервере отобразилось.
В консольном сервере можно же на написать Console.WriteLine(login) . А здесь как?
ava
HAL707 | 26.09.2007, 13:42 #
Цитата


Ошибка! cвойство СhannelName - ReadOnly

Как же тогда его поменять?



Ну, можно так попробовать

IDictionary props = new Hashtable();
props["port"] = 0;
props["name"] = "ch1";//имя канала задается только так
TcpChannel chan = new TcpChannel(props, clientProv, provider);
ChannelServices.RegisterChannel(chan, false);


added later:
Цитата

  но как мне скажем получить здесь доступ к контроллу расположенному на форме сервера.
  Типа в поле текст отобразить "Клиент {login}" авторизовался.

Наподобие как чат: на клиенте написал - на сервере отобразилось.

В консольном сервере можно же на написать Console.WriteLine(login) . А здесь как?



Чет я не понял... Что тут непонятного. На клиенте юзер вводит логин в какой-нить текстбокс, мы можем его дальше использовать для сообщений...
Проверяем на сервере так (в твоем случае)
public DataTable LoadCallBase(string login, string passw)
делаем так, чтобы при неправильных логин-пароль возвращался null.
Соответственно на клиенте - если не null - гденить отображаем "Клиент такой-то авторизовался"

Вообще, конечно, авторизацию лучше делать отдельно, а нет так как у тебя..
Типа написать отдельный метод, возврвщающий true, false.
Если клиент авторизовался, то разрешить ему вызывать какие-то процедуры бизнес-логики.., нет - сообщение об ошибке..
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  CityAC   HAL707
advanced
Submit