Пишем «сам себе сервер» с использованием классов пространства имен System.Web.Http.SelfHost.
Столкнулась с использованием классов этого пространства имен, когда появилась необходимость в написании веб-морды, доступной из:
службы Windows.
Создадим два проекта
1й — собственно наш сервер
2й будет содержать api контроллеры
Наш сервер будет выглядеть так:
Теперь нашей службе нужно указать, откуда будут браться наши api контроллеры, для этого в проекте сервера наследуем класс:
Переходим ко второму проекту с контроллерами. Здесь добавляем класс, имя которого должно содержать окончание Controller, например:
UsersController
RegionsController
DevicesController
Перегружаем класс ApiController пространства имен System.Web.Http и добавляем несколько методов:
Давайте еще раз обратим внимание на строчку:
Это строка описывает шаблон маршрута.
Запросы мы будем слать на прописанный в 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
Столкнулась с использованием классов этого пространства имен, когда появилась необходимость в написании веб-морды, доступной из:
службы 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
