Пишем «сам себе сервер» с использованием классов пространства имен System.Web.Http.SelfHost.
Столкнулась с использованием классов этого пространства имен, когда появилась необходимость в написании веб-морды, доступной из:
службы 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
Автор: GolovinskayaAlbina