Служба-сервер

 
0
 
.NET
ava
Alexsar | 17.08.2007, 23:23
привет, All
есть задумка создать собственную службу, а затем подружить её с IIS.
служба должна выполнять свою работу и предоставлять функциональные возможности для клиентов(не браузеры)
веб сервер думается создать на основе ASP.NET.
а что касаемо службы - не нашёл инфы по созданию
вопросы: вообще возможно построить такой гибрид?
что посоветуете, может другой подход?
какие подводные камни могут быть?
с чего начать?

хотелось бы пример, где чётко и последовательно предоставляется алгоритм создания службы
Comments (5)
ava
Alexsar | 31.08.2007, 22:40 #
привет всем
я создал ASP сервер без поддержки IIS. для этого использовал System.Web.Hosting
сервер слушает запросы от клиентов с помощью сокета


//принимаем новое соединение
Socket socket = myListener.AcceptSocket();
Console.WriteLine("Socket Type "+socket.SocketType);
if(socket.Connected)
{
Console.WriteLine("\nClient Connected!!\n"+"=========\nClient IP {0}\n",socket.RemoteEndPoint);

//Создаю массив байтов и принимаю данные от клиента
byte[] bReceive = new byte[1024];
int i = socket.Receive(bReceive,bReceive.Length,0);

//преобразуем байты в строку
string sBuffer =Encoding.ASCII.GetString(bReceive);

//обработка и прочее
....
}


так вот в чём проблема, когда я обращаюсь через браузер к ресурсам (или на клиенте реализую подобный запрос), например http://localhost:8000/index.htm - то всё нормально, но вот есть потребность клиента передавать данные например с помощью метода UploadData. Сервер должен принять такие данные и должным образом обработать
делаю так


string siteURL;
siteURL = "http://localhost:8000/index.htm";
WebClient client = new WebClient();
client.Credentials = System.Net.CredentialCache.DefaultCredentials;
string uploadString = "Hello Force..15";

client.Headers.Add("Content-Type", "application/client_data");

byte[] sendData = Encoding.ASCII.GetBytes(uploadString);
Console.WriteLine("Uploading to {0}.. ", siteURL);

byte[] recData = client.UploadData(siteURL, "POST", sendData);

Console.WriteLine("\nResponse recieved was {0}", Encoding.ASCII.GetString(recData));


но на сервер приходит только заголовок, там верно указывается число переданных байтов, прочая иформация, но полностью отсутствует сами данные
хочется узнать, как надо отправлять и принимать данные, чтобы не терять сами данные

p.s. подобные реализации с HttpWebRequest совместо с StreamReader, а так же реализация через OpenWrite так же теряют данные
p.p.s. Socket и TcpClient решают задачу, но хочется использовать UploadData или OpenWrite
ava
Alexsar | 09.09.2007, 16:44 #
в общем сам разобрался, надо было повторно прослушать сокет
ava
Alexsar | 14.09.2007, 21:57 #
Я создал службу, для управления ей написал програмку. Чтобы передать какие либо данные службе приходится останавливать и снова перезапускать её с новыми параметрами.
А теперь такой вопрос: как программно управлять службой? Хочется сделать простейший пользовательский интерфейс для обратной связи, но службы не приемлют такого, класс Form и производные от него не помогают тут
Может есть обходные манёвры, чтобы служба стала поддерживать хотя бы мессаджбоксы?
ava
tol05 | 14.09.2007, 22:52 #
не надоело еще самому с собой общаться? :biggrin (не обижайся, просто посмотрел, в топик никто не отвечает...)

Цитата (Alexsar @ 14.9.2007, 21:57 findReferencedText)
как программно управлять службой?

класс ServiceController
Цитата (Alexsar @ 14.9.2007, 21:57 findReferencedText)
Хочется сделать простейший пользовательский интерфейс для обратной связи, но службы не приемлют такого, класс Form и производные от него не помогают тут

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

Обычно для включения интерактивного режима в консоли ("Администррование->Службы->Свойства_Нужной_Службы->Вход в систему" - это для XP) нужно чекбокс включить ("Разрешить взаимодействие с рабочим столом" или на английском - что-то там про interactive, не помню)...

Но нам стобой программно нужно. А .Net 2.0 (у меня счас другого нет) такой функциональности не предоставляет. Можно в .Net через записи в реестр, после того как installutil отработает:

RegistryKey ckey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\MyServiceName", true);
if(ckey != null)
{
if(ckey.GetValue("Type") != null)
{
ckey.SetValue("Type", ((int)ckey.GetValue("Type") | 256));
}
}

Или через API можно, надо гуглить.

найди книгу "С# 2005 для профессионалов" wrox-овскую. Там неплохо и программирование самих служб изложено, и управление службами.
ava
Alexsar | 15.09.2007, 22:09 #
ТО tol05
О, живая душа появилась smile
значит всё таки можно, значит будем копать
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Alexsar   tol05
advanced
Submit