Развитие веб-платформы для разработчика: asp.net mvc 2.0 и...
DESCRIPTION
Краткий обзор ASP.NET MVC 2.0 и ASP.NET Web Forms 4.0.TRANSCRIPT
Развитие веб-платформы для разработчика: ASP.NET MVC 2.0 и ASP.NET Web Forms 4.0
Гайдар Магдануровt: http://twtter.com/gaidar
Платформа ASP.NET
Ядро ASP.NETПроцесс обработки Http запросов, инфраструктура
HttpModule и HttpHandler, интеграция с веб-сервером IIS, модель расширения
Службы ASP.NETКеширование, хранение состояния, маршрутизация, хранение данных пользователей,
поддержка локализация
WebFormsЭлементы управления, модель событий,
источники данных
MVC FrameworkИнфраструктура представлений и контроллеров, поддержка модели
Microsoft AjaxНабор клиентского JavaScript кода и серверных компонентов
Dynamic DataБиблиотека для автоматического создания приложений работающих с данными
4.0
2.0
Ядро и службы 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
Мониторинг производительности
<?xml version="1.0"?> <configuration> <system.web> <compilation targetFramework="4.0" /> </system.web> </configuration>
Меньше настроек в web.config
• Основные параметры конфигурации перенесены в machine.config
• Минимальный достаточный web.config
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$NamingPanel1$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 PersonController { [HttpPost] public ActionResult Update(Person p){ if(!ModelState.IsValid) ... }}
public class Person { [Required(ErrorMessage = “*”)] [StringLength(32, ErrorMessage = “Лимит – 32 символа”)] public string LastName { get; set; }}
Строгая типизация 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