Развитие веб-платформы для разработчика: ASP.NET MVC 2.0 и ASP.NET Web Forms 4.0 Гайдар Магдануров t: http://twtter.com/gaidar e: [email protected] m: +7 (905) 504 57 16 Платформа ASP.NET Dynamic Data Библиотека для автоматического создания приложений работающих с данными Microsoft Ajax Набор клиентского JavaScript кода и серверных компонентов WebForms MVC Framework Элементы управления, модель событий, источники данных Инфраструктура представлений и контроллеров, поддержка модели Службы ASP.NET Кеширование, хранение состояния, маршрутизация, хранение данных пользователей, поддержка локализация Ядро ASP.NET Процесс обработки Http запросов, инфраструктура HttpModule и HttpHandler, интеграция с веб-сервером IIS, модель расширения Ядро и службы ASP.NET 4.0 Автоматический запуск приложений • Для приложений, требующих длительной инициализации • Работает на IIS 7.5 • Конфигурация в applicationHost.config <applicationPools> <add name="MyApplicationPool" startMode="AlwaysRunning" /> </applicationPools> Автоматический запуск приложений <sites> <site name="MySite" id="1"> <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PrewarmMyCache" > <!-- Additional content --> </application> </site> </sites> <serviceAutoStartProviders> <add name="PrewarmMyCache" type="MyNamespace.CustomInitialization, MyInitLib" /> </serviceAutoStartProviders> Автоматический запуск приложений • Управление инициализацией приложения • До отработки метода Preload приложение не принимает запросы public class CustomInitialization : System.Web.Hosting.IProcessHostPreloadClient { public void Preload(string[] parameters) { } } Расширенный механизм кеширования • Возможность добавления собственных провайдеров кеширования – Наследование System.Web.Caching.OutputCacheProvider • Конфигурирование в web.config • Возможность выбора системы хранения – Локальные или сетевые диски, база данных «в облаке», системы распределенного кеша Кеширование: настройка • Конфигурирование в web.config <caching> <outputCache defaultProvider="AspNetInternalProvider"> <providers> <add name="DiskCache" type=“ChacheProviders.DiskOutputCacheProvider, DiskCacheProvider"/> </providers> </outputCache> </caching> Кеширование: настройка • По умолчанию AspNetInternalProvider – Хранение данных в памяти • Возможность назначать провайдеры на уровне страницы и на уровне запроса Кеширование: уровень страницы <%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache" %> Кеширование: уровень запроса • В Global.asax public override string GetOutputCacheProviderName(HttpContext context) { if (context.Request.Path.EndsWith("Advanced.aspx")) return "DiskCache"; else return base.GetOutputCacheProviderName(context); } Уменьшение размера состояния сеанса • Использование System.IO.Compression.GZipStream для сжатия состояния • Особенно актуально для веб-ферм, при хранении состояния в SQL Server или out-of-proc сервере состояния <sessionState mode="SqlServer" sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate" allowCustomSqlDatabase="true" compressionEnabled="true" /> Постоянные редиректы • Метод Response.Redirect выдает 302 Moved Temporary – соответственно лишний обмен по HTTP сообщениями • PermanentRedirect выдает 301 – Moved Permanently • RedirectPermanent("/new/content.aspx"); – Поисковые системы кешируют страницы с кодом 301 и не запрашивают повторно Настройки разрешенных URL • Возможность увеличения длины путей более 260 символов: <httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" /> • Контроль допустимых символов в URL <httpRuntime requestPathInvalidChars="<,>,*,%,&,:,\" /> Валидация запросов • Создание собственного валидатора запросов регистрация в web.config секции httpRuntime – Наследование System.Web.Util.RequestValidator – <httpRuntime requestValidationType=“MyLib.MyValidator, Samples" /> • Метод IsValidRequestString public class CustomRequestValidation : RequestValidator { protected override bool IsValidRequestString( HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) {...} } Кодирование URL и HTML • Создание собственных классов для обработки вызовов при сохранении API – Наследование System.Web.Util.HttpEncoder • Автоматическая подмена вызовов методов кодирования классов System.Web.HttpUtility и System.Web.HttpServerUtility • Настойка в web.config <httpRuntime encoderType=“MyLib.MyCustomEncoder, Samples" /> Мониторинг производительности • Настройка в файле aspnet.config в директории, куда установлен .NET FW <?xml version="1.0" encoding="UTF-8" ?> <configuration> <runtime> <appDomainResourceMonitoring enabled="true"/> </runtime> </configuration> • Новые счетчики в категории ASP.NET Applications - % Managed Processor Time и Managed Memory Used Меньше настроек в web.config • Основные параметры конфигурации перенесены в machine.config • Минимальный достаточный web.config <?xml version="1.0"?> <configuration> <system.web> <compilation targetFramework="4.0" /> </system.web> </configuration> Web Forms 4.0 Маршрутизация • Cвойства для работы с маршрутами HttpRequest.RequestContext и Page.RouteData • Определение маршрута public class Global : System.Web.HttpApplication { void Application_Start(object sender, EventArgs e) { RouteTable.Routes.MapPageRoute("SearchRoute", "search/{searchterm}", "~/search.aspx"); RouteTable.Routes.MapPageRoute("UserRoute", "users/{username}", "~/users.aspx"); } } Маршрутизация • Параметр checkPhysicalUrlAccess метода MapPageRoute позволяет применить правила доступа, которые определены для физической страницы в web.config • Коллекция параметров маршрута Page.RouteData.Values["username"] Маршрутизация • Декларативное связывание • Чтение значений параметров <asp:Label ID="Label1" runat="server" Text="<%$RouteValue:Id%>" /> • Определение параметров <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="<%$RouteUrl:Id=search%>"> Search</asp:HyperLink> Маршрутизация • Связь с DataSource <asp:sqldatasource ...> <selectparameters> <asp:routeparameter name="companyname" RouteKey="searchterm" /> </selectparameters> </asp:sqldatasource> Настройки ViewState • Наследование ViewState с возможностью наследования • Атрибут ViewStateMode – Enabled (по умолчанию) – Disabled – Inherit Поддержка браузеров • Класс HttpBrowserCapabilities для получения информации о текущем браузере • • • • • • blackberry.browser • chrome.browser • Default.browser • firefox.browser • gateway.browser • generic.browser ie.browser iemobile.browser iphone.browser opera.browser safari.browser Мета-теги страницы • Свойства Keywords и Descriptions <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Keywords="These, are, my, keywords" Description="This is a description" %> • Свойства Page.MetaKeywords и Page.MetaDescription Управление атрибутом id • ClientIDMode – AutoID – автоматическая генерация – Static – статические ID – Predictable – Предсказуемые (например, для Repeater, ClientIDRowSuffix будет PrimaryKey или Object ID) – Inherit – наследовать от родителя Управление атрибутом id • Страница <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" ClientIDMode="Predictable" %> • Web.config <system.web> <pages clientIDMode="Predictable"></pages> </system.web> Управление атрибутом id <tc:NamingPanel runat="server" ID="ParentPanel" ClientIDMode="Static"> <tc:NamingPanel runat="server" ID="NamingPanel1" ClientIDMode="Predictable"> <asp:TextBox ID="TextBox1" runat="server" Text="Hello!"></asp:TextBox> </tc:NamingPanel> </tc:NamingPanel> <div id="ParentPanel"> <div id="ParentPanel_NamingPanel1"> <input name="ctl00$ContentPlaceHolder1$ParentPanel$NamingP anel1$TextBox1" type="text" value="Hello!" id="ParentPanel_NamingPanel1_TextBox1" /> </div> Атрибуты id коллекций <asp:ListView ID="ListView1" runat="server" ClientIDMode="Predictable" RowClientIDRowSuffix="ProductID"> </asp:ListView> • rootPanel_ListView1_ProductNameLabel_1 • В Repeater нет RowClientIDRowSuffix, поэтому используется индекс строки Новое выражение <% : %> • Автоматическое кодирование вывода на страницу <%: expression %> Равно <%= HttpUtility.HtmlEncode(expression) %> • Если не нужно кодировать, то <%: new HtmlString("<strong>не энкодить меня!</strong>") %> Рендеринг • Выбор уровня совместимости HTML <system.web><pages controlRenderingCompatibilityVersion="3.5|4.0"/> </system.web> • Для «скрытых» div генерируется css class aspNetHidden • Возможность отключить внешнюю таблицу для контролов FormView, Login, PasswordRecovery, ChangePassword, Wizard, CreateUserWizard <asp:FormView ID="FormView1" runat="server" RenderOuterTable="false"> Выделение строки в ListView/GridView • Раньше выделение было по индексу строки • Теперь – по ключу данных <asp:GridView id="GridView2" runat="server" EnablePersistedSelection="true"> </asp:GridView> Улучшения контролов • ListView – Не нужен LayoutTemplate <asp:ListView ID="ListView1" runat="server"> <ItemTemplate> <% Eval("LastName")%> </ItemTemplate> </asp:ListView> • CheckBoxList – Новые типы Layout = UnorderedList, OrderedList • Menu – Рендеринг в виде несортированного списка – Скрипты на стороне клиента MVC Framework 2.0 Регионы / Area • Вложенные проекты – Site • Blog • Forum • Shop Асинхронные контроллеры • Возможность избежать блокировок тредов из пула тредов ASP.NET public class MyController : AsyncController { public void MyActionAsync(string value) { AsyncManager.OutstandingOperations.Increment(); MyService myService = new MyService(); myService.GetDataCompleted += (sender, e) => { AsyncManager.Parameters[“data"] = e.Value; AsyncManager.OutstandingOperations.Decrement(); }; myService.GetDataAsync(city); } public ActionResult MyActionCompletd(string[] data) { return View(“MyData", new MyData { DataLines = date }); } } Валидация и аннотации данных public class Person { [Required(ErrorMessage = “*”)] [StringLength(32, ErrorMessage = “Лимит – 32 символа”)] public string LastName { get; set; } } public class PersonController { } [HttpPost] public ActionResult Update(Person p){ if(!ModelState.IsValid) ... } Строгая типизация UI хэлперов Html.LabelFor (c => c.Name) Html.EditorFor (c => c.Name) Html.EditorFor (c => c) Поддержка шаблонов UI • EditorTemplates • Display Templates • .ascx файлы Html.EditorFor(c => c.Name, “NameEditor”) public class Person{ [UIHint(“NameEditor”)] public string Name {get; set;} } Параметры по умолчанию public ActionResult ([DefaultValue(10)] int count) {} public ActionResult (int count = 10) {} // C# 4.0 Основные ресурсы • Библиотека MSDN – http://msdn.microsoft.com/en-us/asp.net/default.aspx • Cайт ASP.NET – http://www.asp.net • Технические видео по теме – http://www.microsoft.com/rus/web/tech/development.aspx СПАСИБО ЗА ВНИМАНИЕ! Гайдар Магдануров t: http://twtter.com/gaidar e: [email protected] m: +7 905 504-57-16