ASP.NET MVC 2.0 и ASP.NET Web Forms 4.0

advertisement
Развитие веб-платформы для
разработчика: ASP.NET MVC
2.0 и ASP.NET Web Forms 4.0
Гайдар Магдануров
t: http://twtter.com/gaidar
e: GaidarMa@microsoft.com
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: GaidarMa@microsoft.com
m: +7 905 504-57-16
Download