Развитие веб-платформы для разработчика: ASP.NET MVC 2.0 и...

Post on 06-Dec-2014

2.723 views 1 download

description

Краткий обзор ASP.NET MVC 2.0 и ASP.NET Web Forms 4.0.

Transcript of Развитие веб-платформы для разработчика: ASP.NET MVC 2.0 и...

Развитие веб-платформы для разработчика: ASP.NET MVC 2.0 и ASP.NET Web Forms 4.0

Гайдар Магдануровt: http://twtter.com/gaidar

e: GaidarMa@microsoft.com

Платформа 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

e: GaidarMa@microsoft.com