Как стать автором
Обновить

Сам себе сервер SelfHost

Время на прочтение2 мин
Количество просмотров10K
Пишем «сам себе сервер» с использованием классов пространства имен System.Web.Http.SelfHost.

Столкнулась с использованием классов этого пространства имен, когда появилась необходимость в написании веб-морды, доступной из:

image службы Windows.

Создадим два проекта
1й — собственно наш сервер
2й будет содержать api контроллеры

Наш сервер будет выглядеть так:

public class HTTPServer
	{
		public static string ServiceAddress = string.Format("http://{0}:{1}", 
                          Common.Config.HTTPServerIP /*собственно прописываем IP*/, 
                          Common.Config.HTTPServerPort /*а здесь прописываем порт*/);
		private HttpSelfHostServer _HTTPserver = null;
		private static HttpSelfHostConfiguration _config = null;

		private static HttpSelfHostServer CreateHost()
		{
			_config = new HttpSelfHostConfiguration(ServiceAddress);

			AssembliesResolver assemblyResolver = new AssembliesResolver();
			_config.Services.Replace(typeof(IAssembliesResolver), assemblyResolver);

			_config.Routes.MapHttpRoute(
			  name: "default",
			  routeTemplate: "api/{controller}/{action}/{id}",
			  defaults: new { controller = "Home", id = RouteParameter.Optional });


			HttpSelfHostServer server = new HttpSelfHostServer(_config);
			server.OpenAsync().Wait();

			return server;
		}

		public void Start()
		{
			_HTTPserver = CreateHost();
		}

		public void Stop()
		{
			if (_HTTPserver != null)
				_HTTPserver.CloseAsync().Wait();
		}
	}


Теперь нашей службе нужно указать, откуда будут браться наши api контроллеры, для этого в проекте сервера наследуем класс:

DefaultAssembliesResolver


class AssembliesResolver : DefaultAssembliesResolver
	{
		public override ICollection<Assembly> GetAssemblies()
		{
			ICollection<Assembly> baseAssemblies = base.GetAssemblies();
			List<Assembly> assemblies = new List<Assembly>(baseAssemblies);

			string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Infrastructure.Server.HTTP.Controllers.dll" /*библиотека, получившаяся при компиляции проекта с api контроллерами */);

			assemblies.Add(Assembly.LoadFrom(path));

			return assemblies;
		}
	}


Переходим ко второму проекту с контроллерами. Здесь добавляем класс, имя которого должно содержать окончание Controller, например:

UsersController
RegionsController
DevicesController

Перегружаем класс ApiController пространства имен System.Web.Http и добавляем несколько методов:

public class UsersController : ApiController
	{
		[HttpGet]
		public object hello()
		{
			return "Hello page";
		}

                [HttpPost]
		public object SendData(int data)
		{
			return new HttpResponseMessage(HttpStatusCode.OK);
		}
       }



Давайте еще раз обратим внимание на строчку:

"api/{controller}/{action}/{id}"


Это строка описывает шаблон маршрута.
Запросы мы будем слать на прописанный в ServiceAddress ip-адрес и порт, потом писать /api, потом /имя нашего класса-контроллера без приставки Controller, например:

Users
Regions
Devices
, — а потом /название метода и список параметров через &

Для отладки приложения я использую расширение для хрома Postman — REST Client 0.8.4.10.

вот пример Get запроса:
192.168.1.1:8080/api/Users/Hello

вот пример Post запроса:
192.168.1.1:8080/api/Users/SendData?data=1
Теги:
Хабы:
Всего голосов 12: ↑9 и ↓3+6
Комментарии3

Публикации

Истории

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань