Простой и кросс-платформенный web-сервер на .net
TRANSCRIPT
![Page 1: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/1.jpg)
Простой и кросс-платформенный WEB-сервер на .NET
или скажи нет IISNOVEMBER 28, 2015
![Page 2: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/2.jpg)
2
Александр Иванов • C 2007 года занимаюсь Web разработкой на [email protected]
Роман Правук • C 2004 года занимаюсь Web разработкой• Ресурсный Менеджер группы Web .Net разраьотчиков[email protected]
Кто мы
![Page 3: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/3.jpg)
3
Мы Делали Продукт
![Page 4: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/4.jpg)
4
Муки выбора архитектуры серверной части
•Легкость владения (админы сказали - нет тяжелым веб серверам)• Слабая аппаратная часть (квоты на Cloud)• Скорость разработки
Нам был нужен REST сервис
![Page 5: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/5.jpg)
5
• Node.js• WCF self hosted• ASP.NET MVC WEB API• Spring MVC + Apache Tomcat
Из чего выбирали
![Page 6: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/6.jpg)
6
•Просто установить•Легко обслуживать•Можно быстро написать REST сервис
Первый претендент – Node.js
![Page 7: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/7.jpg)
7
•Один поток•Любой из запросов забирающий управление на себя наглухо забирает всю очередь•Нет адекватных средств работы с AD и Exchange Server•Не типизированный•Нет средств синхронизации потоков
Почему не Node.js
![Page 8: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/8.jpg)
8
• Не было экспертизы• Сложно поддерживать
Apache Tomcat. Админы отказались.
Почему не Java WEB-стэк
![Page 9: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/9.jpg)
9
• 2002 год.NET Framework 1.0 и ASP.NET Web
Forms• 2009 год
ASP.NET MVC• 2012 год
ASP.NET WEB API и Self-Hosting
ASP.NET
![Page 10: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/10.jpg)
10
Проблемы ASP.NET
• WEB-приложения только под Windows
• IIS – единственная опция WEB-сервера в .NET (кроме WEB API)
• Зависимость от System.Web.dll – огромная монолитная сборка
• ASP.NET – закрытая платформа
Проблемы ASP.NET
![Page 11: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/11.jpg)
11
Решает архитектурные проблемы ASP.NET
OWIN
![Page 12: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/12.jpg)
12
• Open • Web • Interface • for .Net
OWIN
![Page 13: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/13.jpg)
13
• OWIN – это стандарт (спецификация), не Фреймворк• ASP.NET 5 реализует стандарт OWIN• OWIN регулирует порядок взаимодействия между WEB-
сервером и WEB-приложением• Стандарт направлен на создание небольших и простых
модулей для разработки WEB-приложений• OWIN – это открытый стандарт
https://github.com/owinhttp://www.owin.org
Открытый WEB-стандарт для .NET
![Page 14: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/14.jpg)
14
Составные части OWIN
Host
Server
Middleware 1
Middleware 2
Middleware N
Framework
WEB Application
RequestRespons
e
![Page 15: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/15.jpg)
15
Environment DictionaryIDictionary<string, object>
Application DelegateFunc<IDictionary<string, object>, Task>
Интерфейсы OWIN
![Page 16: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/16.jpg)
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
![Page 17: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/17.jpg)
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
![Page 18: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/18.jpg)
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Это - HttpContext
Возвращаем TaskTask пишет в Response
![Page 19: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/19.jpg)
19
Запуск OWIN приложения
Host Server Startup
Создать
Запустить Startup код Вернуть
App DelegateЗапустить
Server
App Delegate
Создать
RequestResponse
Запуск
![Page 20: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/20.jpg)
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
Создаём Middleware pipeline
Обработчик запросов
![Page 21: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/21.jpg)
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
Цепочка Middleware
Следующий Middleware
![Page 22: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/22.jpg)
22
• Identity• Routing• Security (Cookies, Facebook, Google, Microsoft, Twitter, etc.)• Localization• Session• Diagnostics• WebSockets• StaticFiles• ResponseCaching• etc.
Доступные Middleware
![Page 23: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/23.jpg)
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-проект
![Page 24: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/24.jpg)
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 и среда выполнения
![Page 25: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/25.jpg)
25
Сборка:$ dnu restore$ dnu build
Запуск:$ dnx webHosting environment: ProductionNow listening on: http://localhost:5000Application started. Press Ctrl+C to shut down.Begin requst /index.htmlEnd requst /index.html
Запускаем WEB-сервер
![Page 26: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/26.jpg)
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
![Page 27: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/27.jpg)
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
![Page 28: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/28.jpg)
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
![Page 29: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/29.jpg)
29
1. Запустить всё под Linux на Mono
– Не получится: EWS использует SecureString
2. Всё на .NET Core
– EWS нет для .NET Core
Куда мы двигаемся дальше
![Page 30: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/30.jpg)
30
Даёт поддержку кросс-платформенности
.NET CORE
![Page 31: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/31.jpg)
31
Application Model:
Framework:
Runtime:
.NET Framework
Windows
.NET Framework Compact
Windows Mobile
Mono
Linux, Mac
Xamarin
Android, iOS
Существующие реализации .NET
![Page 32: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/32.jpg)
32
Application Model:
Framework:
Runtime:
.NET Core
Windows Windows Mobile Linux, Mac
Xamarin
Android, iOS
.NET Core
![Page 33: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/33.jpg)
33
.NET Core • CoreCLR – runtime• CoreFX – набор библиотек – Подмножество
библиотек .NET Framework.
.NET Core поддерживает платформы:• Windows• Linux• Mac
.NET Core
![Page 34: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/34.jpg)
34
•Портируемость• Кроссплатформенность•Модульность – CoreFX разбит на небольшие NuGet пакеты. Позволяет включить только те зависимости, которые нужны.•NET Core – это Open-Source проект. https://github.com/dotnet/core
Что даёт .NET Core
![Page 35: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/35.jpg)
35
.NET Core
ASP.NET 5
![Page 36: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/36.jpg)
36
ASP.NET 5
![Page 37: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/37.jpg)
37
• Оптимизирован под Cloud и Серверную архитектуру– Использует мало памяти - проект включает только те
зависимости, которые реально использует– Высокая пропускная способность
• Кросс-платформенный: Windows, Linux, Mac.• Microsoft будет развивать .NET Core
ASP.NET 5 на .NET Core
![Page 38: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/38.jpg)
38
• CoreFX – содержит лишь подмножество библиотек .NET Framework• Пока ещё мало пакетов в NuGet поддерживают .NET Core
Проблемы ASP.NET 5 и .NET Core
![Page 39: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/39.jpg)
39
• Кросс-платформенный• Независимый от WEB-сервера• Модульный подход• Выше производительность• Требует меньше памяти• Портируемое приложение
ASP.NET 5 - Summary
![Page 40: Простой и кросс-платформенный WEB-сервер на .NET](https://reader031.vdocuments.net/reader031/viewer/2022021814/58ee09751a28abd0188b4581/html5/thumbnails/40.jpg)
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
Полезные ссылки