ݺߣ

ݺߣShare a Scribd company logo
Простой и
кросс-платформенный
WEB-сервер на .NET
или скажи нет IIS
NOVEMBER 28, 2015
2
Александр Иванов
• C 2007 года занимаюсь Web разработкой на .NET
Aleksandr_Ivanov@epam.com
Роман Правук
• C 2004 года занимаюсь Web разработкой
• Ресурсный Менеджер группы Web .Net разраьотчиков
Roman_Pravuk@epam.com
Кто мы
3
Мы Делали Продукт
4
Муки выбора архитектуры серверной части
• Легкость владения (админы сказали - нет тяжелым веб
серверам)
• Слабая аппаратная часть (квоты на Cloud)
• Скорость разработки
Нам был нужен REST сервис
5
• Node.js
• WCF self hosted
• ASP.NET MVC WEB API
• Spring MVC + Apache Tomcat
Из чего выбирали
6
•Просто установить
•Легко обслуживать
•Можно быстро написать REST сервис
Первый претендент – Node.js
7
• Один поток
• Любой из запросов забирающий управление на себя
наглухо забирает всю очередь
• Нет адекватных средств работы с AD и Exchange Server
• Не типизированный
• Нет средств синхронизации потоков
Почему не Node.js
8
• Не было экспертизы
• Сложно поддерживать Apache
Tomcat. Админы отказались.
Почему не Java WEB-стэк
9
• 2002 год
.NET Framework 1.0 и ASP.NET Web Forms
• 2009 год
ASP.NET MVC
• 2012 год
ASP.NET WEB API и Self-Hosting
ASP.NET
10
Проблемы ASP.NET
• WEB-приложения только под Windows
• IIS – единственная опция WEB-сервера в .NET (кроме
WEB API)
• Зависимость от System.Web.dll – огромная монолитная
сборка
• ASP.NET – закрытая платформа
Проблемы ASP.NET
11
Решает архитектурные проблемы ASP.NET
OWIN
12
• Open
• Web
• Interface
• for .Net
OWIN
13
• OWIN – это стандарт (спецификация), не Фреймворк
• ASP.NET 5 реализует стандарт OWIN
• OWIN регулирует порядок взаимодействия между WEB-сервером и
WEB-приложением
• Стандарт направлен на создание небольших и простых модулей
для разработки WEB-приложений
• OWIN – это открытый стандарт
https://github.com/owin
http://www.owin.org
Открытый WEB-стандарт для .NET
14
Составные части OWIN
Host
Server
Middleware 1
Middleware 2
Middleware N
Framework
WEB Application
Request
Response
15
Environment Dictionary
IDictionary<string, object>
Application Delegate
Func<IDictionary<string, object>, Task>
Интерфейсы OWIN
16
Key Name Description
"owin.RequestBody" A Stream with the request body (Stream.Null if no request
body)
"owin.RequestHeaders" An IDictionary<string, string[]> of request headers.
"owin.RequestMethod" "GET", "POST", etc.
"owin.RequestPath" A string containing the request path relative to the "root" of app
delegate.
"owin.RequestPathBase" A string containing the portion of the request path
corresponding to the "root"
"owin.RequestProtocol" "HTTP/1.0", "HTTP/1.1"
"owin.RequestQueryString" "foo=bar&baz=qx" (without leading "?"; empty string if no query
params)
"owin.RequestScheme" "http", "https"
Environment Dictionary – Request Data
17
Key Name Description
"owin.ResponseBody" A Stream used to write out the response body, if any.
"owin.ResponseHeaders" An IDictionary<string, string[]> of response headers.
"owin.ResponseStatusCode"
An optional int containing the HTTP response status code. The
default is 200.
"owin.ResponseReasonPhrase"
An optional string containing the reason phrase associated the
given status code.
"owin.ResponseProtocol"
An optional string containing the protocol name and version
(e.g. "HTTP/1.0")
"owin.CallCancelled"
A CancellationToken indicating if the request has been
cancelled/aborted.
"owin.Version" The string "1.0" indicating OWIN version.
Environment Dictionary – Response Data &
other
18
public Task AppDelegate(IDictionary<string, object> environment) {
string responseText = "Hello, World!";
byte[] responseBytes = Encoding.UTF8.GetBytes(responseText);
Stream responseStream = (Stream) environment["owin.ResponseBody"];
IDictionary<string, string[]> responseHeaders =
(IDictionary<string, string[]>) environment["owin.ResponseHeaders"];
responseHeaders["Content-Type"] = new [] {"text/plain"};
responseHeaders["Content-Length"] = new [] {responseBytes.Length.ToString()};
return responseStream.WriteAsync(responseBytes, 0, responseBytes.Length);
}
Application Delegate + Environment Dictionary
19
Запуск OWIN приложения
Host Server Startup
Создать
Запустить
Startup код
Вернуть
App Delegate
Запустить
Server
App
Delegate
Создать
Request
Response
Запуск
20
Пример WEB-сервера
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
namespace My.OwinServer {
public class Startup {
public void Configure(IApplicationBuilder app) {
app.Use(next => AppDelegate);
}
private Task AppDelegate(HttpContext context) {
string responseText = "Hello, World!";
return context.Response.WriteAsync(responseText);
}
}
}
Startup.cs
21
Цепочка Middleware
public class Startup {
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<LogMiddleware>();
app.Run(AppDelegate);
}
private Task AppDelegate(HttpContext context)
{
string responseText = "Hello World!";
return context.Response
.WriteAsync(responseText);
}
}
public class LogMiddleware {
private readonly RequestDelegate _next;
public LogMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
string path = context.Request.Path;
Console.WriteLine("Begin requst " + path);
await _next(context);
Console.WriteLine("End requst " + path);
}
}
Server
LogMiddleware
AppDelegate
22
• Identity
• Routing
• Security (Cookies, Facebook, Google, Microsoft, Twitter, etc.)
• Localization
• Session
• Diagnostics
• WebSockets
• StaticFiles
• ResponseCaching
• etc.
Доступные Middleware
23
Собираем WEB-сервер
{
"dependencies": {
"Microsoft.AspNet.Owin": "1.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.Hosting": "1.0.0-rc1-final"
},
"frameworks": {
"dnxcore50": {}
},
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5000"
}
}
DNX-проект
24
DNX
• dnvm - .NET Version Manager
• dnu - .NET Development Utility
• dnx - The .NET Execution Environment.
Команды определены в файле project.json:
"commands": {
“kestrel": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5000",
"web": "Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"
}
DNX - это SDK и среда выполнения
25
Сборка:
$ dnu restore
$ dnu build
Запуск:
$ dnx web
Hosting environment: Production
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
Begin requst /index.html
End requst /index.html
Запускаем WEB-сервер
26
Добавляем ASP.NET WEB API
{
"webroot": "wwwroot",
"dependencies": {
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final"
},
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5000/"
},
"frameworks": {
"dnxcore50": { }
},
"exclude": [
"wwwroot",
"node_modules",
"bower_components"
]
}
project.json
27
WEB API приложение
using Microsoft.AspNet.Builder;
using Microsoft.Framework.DependencyInjection;
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services.AddMvc();
}
public void Configure(IApplicationBuilder app) {
app.UseStaticFiles();
app.UseMvc();
}
}
Startup.cs
28
WEB API контроллер
using Microsoft.AspNet.Mvc;
[Route("api/[controller]")]
public class ValuesController : Controller {
private readonly List<string> _values = new List<string> { "value1", "value2" };
[HttpGet]
public IEnumerable<string> Get() {
return _values;
}
[HttpGet("{id}")]
public string Get(int id) {
return 0 <= id && id < _values.Count
? _values[id] : "Value not found";
}
[HttpPost]
public void Post([FromBody]string value) {
_values.Add(value);
}
[HttpPut("{id}")] ...
}
ValuesController.cs
29
1. Запустить всё под Linux на Mono
– Не получится: EWS использует SecureString
2. Всё на .NET Core
– EWS нет для .NET Core
Куда мы двигаемся дальше
30
Даёт поддержку кросс-платформенности
.NET CORE
31
Application
Model:
Framework:
Runtime:
.NET
Framework
Windows
.NET
Framework
Compact
Windows
Mobile
Mono
Linux, Mac
Xamarin
Android, iOS
Существующие реализации .NET
32
Application
Model:
Framework:
Runtime:
.NET Core
Windows
Windows
Mobile
Linux, Mac
Xamarin
Android, iOS
.NET Core
33
.NET Core
• CoreCLR – runtime
• CoreFX – набор библиотек – Подмножество библиотек
.NET Framework.
.NET Core поддерживает платформы:
• Windows
• Linux
• Mac
.NET Core
34
• Портируемость
• Кроссплатформенность
• Модульность – CoreFX разбит на небольшие NuGet
пакеты. Позволяет включить только те зависимости,
которые нужны.
• NET Core – это Open-Source проект.
https://github.com/dotnet/core
Что даёт .NET Core
35
.NET Core
ASP.NET 5
36
ASP.NET 5
37
• Оптимизирован под Cloud и Серверную архитектуру
– Использует мало памяти - проект включает только те зависимости,
которые реально использует
– Высокая пропускная способность
• Кросс-платформенный: Windows, Linux, Mac.
• Microsoft будет развивать .NET Core
ASP.NET 5 на .NET Core
38
• CoreFX – содержит лишь подмножество библиотек .NET Framework
• Пока ещё мало пакетов в NuGet поддерживают .NET Core
Проблемы ASP.NET 5 и .NET Core
39
• Кросс-платформенный
• Независимый от WEB-сервера
• Модульный подход
• Выше производительность
• Требует меньше памяти
• Портируемое приложение
ASP.NET 5 - Summary
40
• http://www.asp.net
• https://github.com/aspnet
• https://github.com/dotnet
• https://github.com/owin
• https://docs.asp.net
• http://blogs.msdn.com/b/dotnet/archive/2014/12/04/introducing-net-core.aspx
Полезные ссылки

More Related Content

What's hot (20)

Service Discovery. More that it seems
Service Discovery. More that it seemsService Discovery. More that it seems
Service Discovery. More that it seems
Aleksandr Tarasov
Meet up windows-workflow_foundation
Meet up windows-workflow_foundationMeet up windows-workflow_foundation
Meet up windows-workflow_foundation
Igor Khokhryakov
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
Ivan Krylov
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр КовалевПакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Positive Hack Days
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
rit2010
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Fwdays
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency Injection
Platonov Sergey
Денис Паясь
Денис ПаясьДенис Паясь
Денис Паясь
CodeFest
Будущее ASP.NET
Будущее ASP.NETБудущее ASP.NET
Будущее ASP.NET
GoSharp
Игорь Кашкута
Игорь КашкутаИгорь Кашкута
Игорь Кашкута
CodeFest
4 особенности платформы microsoft .net для разработки корпоративных систем
4 особенности платформы microsoft .net для разработки корпоративных систем4 особенности платформы microsoft .net для разработки корпоративных систем
4 особенности платформы microsoft .net для разработки корпоративных систем
KewpaN
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур ГильмуллинvSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
Positive Hack Days
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
Igor Shkulipa
8 создание приложений по технологии windows communications foundation
8 создание приложений по технологии windows communications foundation8 создание приложений по технологии windows communications foundation
8 создание приложений по технологии windows communications foundation
KewpaN
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting
KewpaN
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
JSib
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
Dev2Dev
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
DevDay
Service Discovery. More that it seems
Service Discovery. More that it seemsService Discovery. More that it seems
Service Discovery. More that it seems
Aleksandr Tarasov
Meet up windows-workflow_foundation
Meet up windows-workflow_foundationMeet up windows-workflow_foundation
Meet up windows-workflow_foundation
Igor Khokhryakov
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
Ivan Krylov
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр КовалевПакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Positive Hack Days
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
rit2010
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Fwdays
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency Injection
Platonov Sergey
Денис Паясь
Денис ПаясьДенис Паясь
Денис Паясь
CodeFest
Будущее ASP.NET
Будущее ASP.NETБудущее ASP.NET
Будущее ASP.NET
GoSharp
Игорь Кашкута
Игорь КашкутаИгорь Кашкута
Игорь Кашкута
CodeFest
4 особенности платформы microsoft .net для разработки корпоративных систем
4 особенности платформы microsoft .net для разработки корпоративных систем4 особенности платформы microsoft .net для разработки корпоративных систем
4 особенности платформы microsoft .net для разработки корпоративных систем
KewpaN
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур ГильмуллинvSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
Positive Hack Days
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
Igor Shkulipa
8 создание приложений по технологии windows communications foundation
8 создание приложений по технологии windows communications foundation8 создание приложений по технологии windows communications foundation
8 создание приложений по технологии windows communications foundation
KewpaN
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting
KewpaN
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
JSib
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
Dev2Dev
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
DevDay

Similar to Простой и кросс-платформенный WEB-сервер на .NET (20)

.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
NETFest
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
Igor Shkulipa
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
Vitaly Baum
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
-Доминанта
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukWeb and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard Lebedyuk
InterSystems
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Alina Dolgikh
Разработка мобильного ивеб интерфейса для Caché
Разработка мобильного ивеб интерфейса для CachéРазработка мобильного ивеб интерфейса для Caché
Разработка мобильного ивеб интерфейса для Caché
InterSystems CEE
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаРазработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
DotNetConf
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаРазработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Denis Tsvettsih
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Noveo
Хватит писать инфраструктурный код
Хватит писать инфраструктурный кодХватит писать инфраструктурный код
Хватит писать инфраструктурный код
Vadim Martynov
Что нового в ASP.NET 5
Что нового в ASP.NET 5Что нового в ASP.NET 5
Что нового в ASP.NET 5
Microsoft
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформу
Vadim Kruchkov
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Andrey Rebrov
Автоматизация тестирования iOS приложений: от идеи к готовому решению
Автоматизация тестирования iOS приложений: от идеи к готовому решениюАвтоматизация тестирования iOS приложений: от идеи к готовому решению
Автоматизация тестирования iOS приложений: от идеи к готовому решению
SQALab
Руководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из Selenium
Uladzimir Kryvenka
Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков" Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков"
Fwdays
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
NETFest
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
Igor Shkulipa
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
-Доминанта
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukWeb and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard Lebedyuk
InterSystems
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Alina Dolgikh
Разработка мобильного ивеб интерфейса для Caché
Разработка мобильного ивеб интерфейса для CachéРазработка мобильного ивеб интерфейса для Caché
Разработка мобильного ивеб интерфейса для Caché
InterSystems CEE
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаРазработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
DotNetConf
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаРазработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Denis Tsvettsih
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Noveo
Хватит писать инфраструктурный код
Хватит писать инфраструктурный кодХватит писать инфраструктурный код
Хватит писать инфраструктурный код
Vadim Martynov
Что нового в ASP.NET 5
Что нового в ASP.NET 5Что нового в ASP.NET 5
Что нового в ASP.NET 5
Microsoft
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформу
Vadim Kruchkov
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Andrey Rebrov
Автоматизация тестирования iOS приложений: от идеи к готовому решению
Автоматизация тестирования iOS приложений: от идеи к готовому решениюАвтоматизация тестирования iOS приложений: от идеи к готовому решению
Автоматизация тестирования iOS приложений: от идеи к готовому решению
SQALab
Руководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из Selenium
Uladzimir Kryvenka
Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков" Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков"
Fwdays

More from Mikhail Shcherbakov (20)

Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
Mikhail Shcherbakov
Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
Mikhail Shcherbakov
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
Mikhail Shcherbakov
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действии
Mikhail Shcherbakov
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
Mikhail Shcherbakov
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
Mikhail Shcherbakov
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
Mikhail Shcherbakov
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
Mikhail Shcherbakov
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
Mikhail Shcherbakov
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
Mikhail Shcherbakov
Project Rider
Project RiderProject Rider
Project Rider
Mikhail Shcherbakov
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
Mikhail Shcherbakov
Structured logging
Structured loggingStructured logging
Structured logging
Mikhail Shcherbakov
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Mikhail Shcherbakov
Sandboxing in .NET CLR
Sandboxing in .NET CLRSandboxing in .NET CLR
Sandboxing in .NET CLR
Mikhail Shcherbakov
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
Mikhail Shcherbakov
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
Mikhail Shcherbakov
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
Mikhail Shcherbakov
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
Mikhail Shcherbakov
Visual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsVisual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging Tools
Mikhail Shcherbakov
Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
Mikhail Shcherbakov
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
Mikhail Shcherbakov
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
Mikhail Shcherbakov
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
Mikhail Shcherbakov
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
Mikhail Shcherbakov
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
Mikhail Shcherbakov
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
Mikhail Shcherbakov
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
Mikhail Shcherbakov
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
Mikhail Shcherbakov
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Mikhail Shcherbakov
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
Mikhail Shcherbakov
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
Mikhail Shcherbakov
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
Mikhail Shcherbakov
Visual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsVisual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging Tools
Mikhail Shcherbakov

Простой и кросс-платформенный WEB-сервер на .NET

  • 1. Простой и кросс-платформенный WEB-сервер на .NET или скажи нет IIS NOVEMBER 28, 2015
  • 2. 2 Александр Иванов • C 2007 года занимаюсь Web разработкой на .NET Aleksandr_Ivanov@epam.com Роман Правук • C 2004 года занимаюсь Web разработкой • Ресурсный Менеджер группы Web .Net разраьотчиков Roman_Pravuk@epam.com Кто мы
  • 4. 4 Муки выбора архитектуры серверной части • Легкость владения (админы сказали - нет тяжелым веб серверам) • Слабая аппаратная часть (квоты на Cloud) • Скорость разработки Нам был нужен REST сервис
  • 5. 5 • Node.js • WCF self hosted • ASP.NET MVC WEB API • Spring MVC + Apache Tomcat Из чего выбирали
  • 6. 6 •Просто установить •Легко обслуживать •Можно быстро написать REST сервис Первый претендент – Node.js
  • 7. 7 • Один поток • Любой из запросов забирающий управление на себя наглухо забирает всю очередь • Нет адекватных средств работы с AD и Exchange Server • Не типизированный • Нет средств синхронизации потоков Почему не Node.js
  • 8. 8 • Не было экспертизы • Сложно поддерживать Apache Tomcat. Админы отказались. Почему не Java WEB-стэк
  • 9. 9 • 2002 год .NET Framework 1.0 и ASP.NET Web Forms • 2009 год ASP.NET MVC • 2012 год ASP.NET WEB API и Self-Hosting ASP.NET
  • 10. 10 Проблемы ASP.NET • WEB-приложения только под Windows • IIS – единственная опция WEB-сервера в .NET (кроме WEB API) • Зависимость от System.Web.dll – огромная монолитная сборка • ASP.NET – закрытая платформа Проблемы ASP.NET
  • 12. 12 • Open • Web • Interface • for .Net OWIN
  • 13. 13 • OWIN – это стандарт (спецификация), не Фреймворк • ASP.NET 5 реализует стандарт OWIN • OWIN регулирует порядок взаимодействия между WEB-сервером и WEB-приложением • Стандарт направлен на создание небольших и простых модулей для разработки WEB-приложений • OWIN – это открытый стандарт https://github.com/owin http://www.owin.org Открытый WEB-стандарт для .NET
  • 14. 14 Составные части OWIN Host Server Middleware 1 Middleware 2 Middleware N Framework WEB Application Request Response
  • 15. 15 Environment Dictionary IDictionary<string, object> Application Delegate Func<IDictionary<string, object>, Task> Интерфейсы OWIN
  • 16. 16 Key Name Description "owin.RequestBody" A Stream with the request body (Stream.Null if no request body) "owin.RequestHeaders" An IDictionary<string, string[]> of request headers. "owin.RequestMethod" "GET", "POST", etc. "owin.RequestPath" A string containing the request path relative to the "root" of app delegate. "owin.RequestPathBase" A string containing the portion of the request path corresponding to the "root" "owin.RequestProtocol" "HTTP/1.0", "HTTP/1.1" "owin.RequestQueryString" "foo=bar&baz=qx" (without leading "?"; empty string if no query params) "owin.RequestScheme" "http", "https" Environment Dictionary – Request Data
  • 17. 17 Key Name Description "owin.ResponseBody" A Stream used to write out the response body, if any. "owin.ResponseHeaders" An IDictionary<string, string[]> of response headers. "owin.ResponseStatusCode" An optional int containing the HTTP response status code. The default is 200. "owin.ResponseReasonPhrase" An optional string containing the reason phrase associated the given status code. "owin.ResponseProtocol" An optional string containing the protocol name and version (e.g. "HTTP/1.0") "owin.CallCancelled" A CancellationToken indicating if the request has been cancelled/aborted. "owin.Version" The string "1.0" indicating OWIN version. Environment Dictionary – Response Data & other
  • 18. 18 public Task AppDelegate(IDictionary<string, object> environment) { string responseText = "Hello, World!"; byte[] responseBytes = Encoding.UTF8.GetBytes(responseText); Stream responseStream = (Stream) environment["owin.ResponseBody"]; IDictionary<string, string[]> responseHeaders = (IDictionary<string, string[]>) environment["owin.ResponseHeaders"]; responseHeaders["Content-Type"] = new [] {"text/plain"}; responseHeaders["Content-Length"] = new [] {responseBytes.Length.ToString()}; return responseStream.WriteAsync(responseBytes, 0, responseBytes.Length); } Application Delegate + Environment Dictionary
  • 19. 19 Запуск OWIN приложения Host Server Startup Создать Запустить Startup код Вернуть App Delegate Запустить Server App Delegate Создать Request Response Запуск
  • 20. 20 Пример WEB-сервера using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace My.OwinServer { public class Startup { public void Configure(IApplicationBuilder app) { app.Use(next => AppDelegate); } private Task AppDelegate(HttpContext context) { string responseText = "Hello, World!"; return context.Response.WriteAsync(responseText); } } } Startup.cs
  • 21. 21 Цепочка Middleware public class Startup { public void Configure(IApplicationBuilder app) { app.UseMiddleware<LogMiddleware>(); app.Run(AppDelegate); } private Task AppDelegate(HttpContext context) { string responseText = "Hello World!"; return context.Response .WriteAsync(responseText); } } public class LogMiddleware { private readonly RequestDelegate _next; public LogMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { string path = context.Request.Path; Console.WriteLine("Begin requst " + path); await _next(context); Console.WriteLine("End requst " + path); } } Server LogMiddleware AppDelegate
  • 22. 22 • Identity • Routing • Security (Cookies, Facebook, Google, Microsoft, Twitter, etc.) • Localization • Session • Diagnostics • WebSockets • StaticFiles • ResponseCaching • etc. Доступные Middleware
  • 23. 23 Собираем WEB-сервер { "dependencies": { "Microsoft.AspNet.Owin": "1.0.0-rc1-final", "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final", "Microsoft.AspNet.Hosting": "1.0.0-rc1-final" }, "frameworks": { "dnxcore50": {} }, "commands": { "web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5000" } } DNX-проект
  • 24. 24 DNX • dnvm - .NET Version Manager • dnu - .NET Development Utility • dnx - The .NET Execution Environment. Команды определены в файле project.json: "commands": { “kestrel": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5000", "web": "Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000" } DNX - это SDK и среда выполнения
  • 25. 25 Сборка: $ dnu restore $ dnu build Запуск: $ dnx web Hosting environment: Production Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down. Begin requst /index.html End requst /index.html Запускаем WEB-сервер
  • 26. 26 Добавляем ASP.NET WEB API { "webroot": "wwwroot", "dependencies": { "Microsoft.AspNet.Mvc": "6.0.0-rc1-final", "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final", "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final" }, "commands": { "web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5000/" }, "frameworks": { "dnxcore50": { } }, "exclude": [ "wwwroot", "node_modules", "bower_components" ] } project.json
  • 27. 27 WEB API приложение using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); app.UseMvc(); } } Startup.cs
  • 28. 28 WEB API контроллер using Microsoft.AspNet.Mvc; [Route("api/[controller]")] public class ValuesController : Controller { private readonly List<string> _values = new List<string> { "value1", "value2" }; [HttpGet] public IEnumerable<string> Get() { return _values; } [HttpGet("{id}")] public string Get(int id) { return 0 <= id && id < _values.Count ? _values[id] : "Value not found"; } [HttpPost] public void Post([FromBody]string value) { _values.Add(value); } [HttpPut("{id}")] ... } ValuesController.cs
  • 29. 29 1. Запустить всё под Linux на Mono – Не получится: EWS использует SecureString 2. Всё на .NET Core – EWS нет для .NET Core Куда мы двигаемся дальше
  • 33. 33 .NET Core • CoreCLR – runtime • CoreFX – набор библиотек – Подмножество библиотек .NET Framework. .NET Core поддерживает платформы: • Windows • Linux • Mac .NET Core
  • 34. 34 • Портируемость • Кроссплатформенность • Модульность – CoreFX разбит на небольшие NuGet пакеты. Позволяет включить только те зависимости, которые нужны. • NET Core – это Open-Source проект. https://github.com/dotnet/core Что даёт .NET Core
  • 37. 37 • Оптимизирован под Cloud и Серверную архитектуру – Использует мало памяти - проект включает только те зависимости, которые реально использует – Высокая пропускная способность • Кросс-платформенный: Windows, Linux, Mac. • Microsoft будет развивать .NET Core ASP.NET 5 на .NET Core
  • 38. 38 • CoreFX – содержит лишь подмножество библиотек .NET Framework • Пока ещё мало пакетов в NuGet поддерживают .NET Core Проблемы ASP.NET 5 и .NET Core
  • 39. 39 • Кросс-платформенный • Независимый от WEB-сервера • Модульный подход • Выше производительность • Требует меньше памяти • Портируемое приложение ASP.NET 5 - Summary
  • 40. 40 • http://www.asp.net • https://github.com/aspnet • https://github.com/dotnet • https://github.com/owin • https://docs.asp.net • http://blogs.msdn.com/b/dotnet/archive/2014/12/04/introducing-net-core.aspx Полезные ссылки