Сам собі сервер 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 helloy()
{
return "Helloy 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/Helloy

ось приклад Post запиту:
192.168.1.1:8080/api/Users/SendData?data=1

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.