- PVSM.RU - https://www.pvsm.ru -

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

Пишем «сам себе сервер» с использованием классов пространства имен 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 [1]:8080/api/Users/Hello

вот пример Post запроса:
192.168.1.1 [1]:8080/api/Users/SendData?data=1

Автор: GolovinskayaAlbina

Источник [2]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/net/74252

Ссылки в тексте:

[1] 192.168.1.1: http://192.168.1.1

[2] Источник: http://habrahabr.ru/post/242917/