the old new asp.net

88
Старый новый Microsoft ASP.NET <%= ASP.NET.Current.Version %>

Upload: vitaly-baum

Post on 07-Nov-2014

4.343 views

Category:

Technology


4 download

DESCRIPTION

This slides from ALT.NET meeting about ASP.NET at Saint-Petersburg 03/12/09

TRANSCRIPT

Page 1: The Old New ASP.NET

Старый новый Microsoft ASP.NET <%= ASP.NET.Current.Version %>

Page 2: The Old New ASP.NET

Senior Developer http://conteq.ru

Personal Journal http://butaji.ru

Vitaly Baum

Page 3: The Old New ASP.NET

Термины

o Microsoft ASP.NET

oMVC

o AJAX Library

oDynamicData

oWebForms

Page 4: The Old New ASP.NET

Содержание доклада

o Сравнение WebForms и MVC

o Препарируем ASP.NET

o Будущее с ASP.NET 4.0

Page 5: The Old New ASP.NET

Сравнение WebForms и MVC

ASP.NET Framework

Page 6: The Old New ASP.NET

Сравнение WebForms и MVC

Page 7: The Old New ASP.NET

Сравнение WebForms и MVC

Page LifeCycle

Page 8: The Old New ASP.NET

Page request Start Initialization Load Validation Event handling Rendering Unload

Page 9: The Old New ASP.NET

Сравнение WebForms и MVC

WebForms

o Тяжело тестировать

o RAD ориентация

o Проще научится .NET разработчику

o Большое количество сторонних компонентов

o ViewState можно убрать со страницы

MVC

o Легко тестировать* (SoC)

o Контроль разметки (SEO)

o Проще научится веб-разработчику

o Мало сторонних компонентов и решений

o Ориентирован на хороший дизайн

*SoC можно получить и в разработке для WebForms

Page 10: The Old New ASP.NET

Сравнение WebForms и MVC

.NET Framework

ASP.NET Framework

WebForms MVC

Page 11: The Old New ASP.NET

Сравнение WebForms и MVC

o Incoming HTTP Request

o ApplicationManager

o HttpApplication

o Global.asax

o Modules (IHttpModule)

o UrlRoutingModule

o IIS 7.0

Page 12: The Old New ASP.NET

Сравнение WebForms и MVC

Page 13: The Old New ASP.NET

Сравнение WebForms и MVC

public interface IViewEngine { // Methods ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache); ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache); void ReleaseView(ControllerContext controllerContext, IView view); }

Page 14: The Old New ASP.NET

Сравнение WebForms и MVC

o WebFormsViewEngine работает с ViewPage : System.Web.UI.Page

o Сохранены все принципы

o Возможна работа с MasterPage

o Можно писать обработку Page LifeCycle во ViewPage

Page 15: The Old New ASP.NET

Сравнение WebForms и MVC

Framework Solutions Platform

Page 16: The Old New ASP.NET

Сравнение WebForms и MVC

Framework Solutions Platform

Page 17: The Old New ASP.NET

Сравнение WebForms и MVC

Framework Solutions Platform

Page 18: The Old New ASP.NET

Сравнение WebForms и MVC

Framework Solutions Platform

Page 19: The Old New ASP.NET

Препарируем ASP.NET

ASP.NET Framework

Page 20: The Old New ASP.NET

Препарируем ASP.NET

o ASP.NET Framework

o Providers

oModules

oHandlers

Page 21: The Old New ASP.NET

Препарируем ASP.NET

o MVC Framework

o ViewEngines

o ControllerFactories

o Filters

o Routing

Page 22: The Old New ASP.NET

Препарируем ASP.NET

o Dynamic Language Support

o ControlBuilder

o BuildProvider

Page 23: The Old New ASP.NET

Препарируем ASP.NET : CB

o ASP.NET Framewrok строит дерево System.Web.UI.ControlBuilder для построения страницы

o От ControlBuilder можно наследоваться и переопределять логику построения

Page 24: The Old New ASP.NET

Препарируем ASP.NET : CB

o Constructor Injection в UserControl

Page 25: The Old New ASP.NET

Препарируем ASP.NET : DLR

o ASP.NET on IronPython

Page 26: The Old New ASP.NET

Препарируем ASP.NET : DLR

o IronPython.dll

o IronPython.Modules.dll

o Microsoft.Scripting.dll

o Microsoft.Scripting.Core.dll

o Microsoft.Web.Scripting.dll

Page 27: The Old New ASP.NET

Препарируем ASP.NET : DLR

<httpModules> <add name="DynamicLanguageHttpModule" type="Microsoft.Web.Scripting.DynamicLanguageHttpModule"/> </httpModules>

Page 28: The Old New ASP.NET

Препарируем ASP.NET : DLR

Internal class DynamicLanguageHttpModule : IHttpModule, IBuildProvider { private class GlobalAsaxBuildResult : TypeWithEventsBuildResult {

private void CallFunction(ScriptEngine engine, DynamicFunction f) { f.Invoke(engine, new object[0]); }

} }

Page 29: The Old New ASP.NET

Препарируем ASP.NET : DLR

<microsoft.scripting debugMode="true"> <languages> <language names="IronPython;Python;py" extensions=".py" displayName="IronPython 2.0 Beta" type="IronPython.Runtime.PythonContext, IronPython, Version=2.0.0.5000, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </languages> </microsoft.scripting>

Page 30: The Old New ASP.NET

Препарируем ASP.NET : BP

o История о BuilderProvider от David Ebbo http://blogs.msdn.com/davidebb/archive/2009/06/01/a-buildprovider-to-simplify-your-asp-net-mvc-action-links.aspx

Page 31: The Old New ASP.NET

Препарируем ASP.NET : BP

<%= Html.ActionLink("Home", "Index", "Home")%>

public ActionResult Test(int id, string name)

{

return View();

}

<%= Html.ActionLink("Test Link", "Test", "Home",

new { id = 17, name = "David" }, null) %>

Page 32: The Old New ASP.NET

Препарируем ASP.NET : BP

<%= Html.ActionLinkToHomeIndex("Home")%>

<%= Html.ActionLinkToHomeTest("Test Link", 17, "David")%>

<buildProviders>

<add extension=".actions« type="MvcActionLinkHelper.MvcActionLinkBuildProvider" />

</buildProviders>

Page 33: The Old New ASP.NET

Препарируем ASP.NET : BP

<%= Html.ActionLink<HomeController>(c => c.Index(), "Home")%>

ASP.NET MVC 2 Beta Futures

http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36054

Page 34: The Old New ASP.NET

Препарируем ASP.NET : BP

o 200 строк кода

o Колкость работы с CodeDom

o 2 комментария HACK

o Несколько комментариев «К сожалению нельзя…»

Page 35: The Old New ASP.NET

Препарируем ASP.NET : BP

o Переделано на T4

o Простота реализации и сопровождения

o Необходимость перекомпиляции при выкладывании на сервер

Page 36: The Old New ASP.NET

Будущее с ASP.NET 4.0

ASP.NET Framework

Page 37: The Old New ASP.NET

Core Services

ASP.NET Framework

Page 38: The Old New ASP.NET

Будущее с ASP.NET 4.0

<?xml version="1.0"?>

<configuration>

<system.web>

<compilation targetFramework="4.0" />

</system.web>

</configuration>

Web.config File Minification

Page 39: The Old New ASP.NET

Будущее с ASP.NET 4.0

<caching>

<outputCache defaultProvider="AspNetInternalProvider">

<providers>

<add name="DiskCache"

type="Test.OutputCacheEx.DiskOutputCacheProvider, DiskCacheProvider"/>

</providers>

</outputCache>

</caching>

Extensible Output Caching

Page 40: The Old New ASP.NET

Будущее с ASP.NET 4.0

<%@ OutputCache="" Duration="60" VaryByParam="None" providerName="DiskCache" %>

Extensible Output Caching

Page 41: The Old New ASP.NET

Будущее с ASP.NET 4.0

public class HttpApplication : …

{ public override string GetOutputCacheProviderName(HttpContext context)

{

if (context.Request.Path.EndsWith("Advanced.aspx"))

return "DiskCache";

else

return base.GetOutputCacheProviderName(context);

}

}

Extensible Output Caching

Page 42: The Old New ASP.NET

Будущее с ASP.NET 4.0

IIS 7.5 applicationHost.config

<applicationPools>

<add name="MyApplicationPool" startMode="AlwaysRunning" />

</applicationPools>

Auto-Start Web Applications

Page 43: The Old New ASP.NET

Будущее с ASP.NET 4.0

<sites> <site name="MySite" id="1"> <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PrewarmMyCache" > <!-- Additional content --> </application> </site> </sites> <serviceAutoStartProviders> <add name="PrewarmMyCache" type="MyNamespace.CustomInitialization, MyLibrary" /> </serviceAutoStartProviders>

Auto-Start Web Applications

Page 44: The Old New ASP.NET

Будущее с ASP.NET 4.0

public class CustomInitialization : System.Web.Hosting.IProcessHostPreloadClient

{

public void Preload(string[] parameters)

{

// Perform initialization.

}

}

Auto-Start Web Applications

Page 45: The Old New ASP.NET

Будущее с ASP.NET 4.0

RedirectPermanent("/newpath/foroldcontent.aspx");

Permanently Redirecting a Page (301)

Page 46: The Old New ASP.NET

Будущее с ASP.NET 4.0

<sessionState

mode="SqlServer"

sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate"

allowCustomSqlDatabase="true"

compressionEnabled="true"/>

Compression with System.IO.Compression.GZipStream

The Incredible Shrinking Session State

Page 47: The Old New ASP.NET

Будущее с ASP.NET 4.0

In previous versions 260 characters (based on NTFS)

<httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" />

<httpRuntime requestPathInvalidChars=""<,>,*,%,&,:,\" />

Expanding the Range of Allowable URLs

Page 48: The Old New ASP.NET

Будущее с ASP.NET 4.0

<httpRuntime requestValidationType="Samples.MyValidator, Samples" /> public class CustomRequestValidation : RequestValidator { protected override bool IsValidRequestString( HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) {...} }

Extensible Request Validation

Page 49: The Old New ASP.NET

Будущее с ASP.NET 4.0

Большая популярность кеша из ASP.NET, его использование в настольных и др. приложениях.

Появится новая сборка System.Runtime.Caching.dll с абстрактными классами для реализации собственных кешей, а так же реализация кеша в памяти System.Runtime.Caching.MemoryCache

Object Caching Extensibility

Page 50: The Old New ASP.NET

Будущее с ASP.NET 4.0

private void btnGet_Click(object sender, EventArgs e) { ObjectCache cache = MemoryCache.Default; fileContents = cache["filecontents"] as string; if (fileContents == null) { CacheItemPolicy policy = new CacheItemPolicy(); List<string> filePaths = new List<string>(); filePaths.Add("c:\\data.txt"); policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); fileContents = File.ReadAllText("c:\\data.txt"); cache.Set("filecontents", fileContents, policy); } MessageBox.Show(fileContents); }

Object Caching Extensibility

Page 51: The Old New ASP.NET

Будущее с ASP.NET 4.0

System.Web.Util.HttpEncoder

System.Web.HttpUtility

System.Web.HttpServerUtility

<httpRuntime encoderType="Samples.MyCustomEncoder, Samples" />

HTML, URL, and HTTP Header Encoding

Page 52: The Old New ASP.NET

Будущее с ASP.NET 4.0

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>

<runtime>

<appDomainResourceMonitoring enabled="true"/>

</runtime>

</configuration>

Performance Monitoring for Individual Applications in a Single Worker Process

Page 53: The Old New ASP.NET

Будущее с ASP.NET 4.0

<compilation targetFramework="4.0"/>

1. Если не указано, то в AppPool под 4.0

2. Нужно обязательно указывать версию при объявлении типов в web.config

3. Разные варианты скрипты предкомпиляции

4. Будут исползоваться новые версии

Multi-Targeting

Page 54: The Old New ASP.NET

Microsoft AJAX Library

ASP.NET Framework

Page 55: The Old New ASP.NET

Будущее с ASP.NET 4.0

<script type="text/javascript">

Sys.create.watermark("#Name", { WatermarkText: "Add name here..." });

</script>

Работает IntelliSense

Imperative Syntax

Page 56: The Old New ASP.NET

Будущее с ASP.NET 4.0

• Автоматически подгружает ресурсы

• Проверяет, чтобы скрипт был загружен единожды

• Параллельная загрузка скриптов

• Ленивая загрузка скриптов

• Работает так же со сторонними библиотеками

Script Loader

Page 57: The Old New ASP.NET

Будущее с ASP.NET 4.0

<script src="../Scripts/MicrosoftAjax/start.js" type="text/javascript"></script> <script src="../Scripts/ACT/ACTRegisterExtended.js" type="text/javascript"></script> <script type="text/javascript"> Sys.require(Sys.components.watermark, function() { Sys.create.watermark("#Name", { WatermarkText: "Add name here..." }); }); </script>

Script Loader

Page 58: The Old New ASP.NET

Будущее с ASP.NET 4.0

o MicrosoftAjaxComponentModel.js

o MicrosoftAjaxCore.js

o MicrosoftAjaxGlobalization.js

o ACTCommon.js

o ACTExtenderBase.js

o ACTWatermark.js

Script Loader

Page 59: The Old New ASP.NET

Будущее с ASP.NET 4.0

<script src="ajax.microsoft.com/ajax/0910/start.js"></script>

http://www.asp.net/ajaxlibrary/cdn

Content Delivery Network

Page 60: The Old New ASP.NET

Будущее с ASP.NET 4.0

o Client data controls

o Client templates

o Client data context

Client Data Access

Page 61: The Old New ASP.NET

Будущее с ASP.NET 4.0

<script src="Scripts/MicrosoftAjax/start.js" type="text/javascript"></script> <script type="text/javascript"> Sys.require([Sys.components.dataView, Sys.components.dataContext], function() { Sys.create.dataView("#moviesView", { dataProvider: "Services/MovieService.svc", fetchOperation: "GetMovies", autoFetch: true } ); }); </script>

Client Data Access : DataView

Page 62: The Old New ASP.NET

Будущее с ASP.NET 4.0

<h1>Movies</h1>

<ul id="moviesView">

<li>{{Title}} - {{Director}}</li>

</ul>

Client Data Access : DataView

Page 63: The Old New ASP.NET

Будущее с ASP.NET 4.0

o ASP.NET (.asmx) Web services.

o WCF Web services.

o ADO.NET Data Services.

o Anything that returns JSON-formatted data.

Client Data Access : DataView

Page 64: The Old New ASP.NET

Будущее с ASP.NET 4.0

Похожи на:

o LINQ to SQL DataContext

o Entity Framework ObjectContext

Поддерживают:

o Чтение и запись

o Поддерживает сложные связи и ассоциации

Client DataContext, AdoNetDataContext

Page 65: The Old New ASP.NET

Будущее с ASP.NET 4.0

<script src="Scripts/MicrosoftAjax/start.js" type="text/javascript"></script>

<script src="Scripts/ACT/ACTRegisterExtended.js" type="text/javascript"></script>

<script type="text/javascript">

Sys.require([Sys.components.watermark, Sys.scripts.jQuery], function() {

$(".required")

.watermark({

WatermarkText: "Add something here..."

})

.css({

backgroundColor: "red",

color: "white"

});

});

</script>

jQuery Integration

Page 66: The Old New ASP.NET

WebForms

ASP.NET Framework

Page 67: The Old New ASP.NET

Будущее с ASP.NET 4.0

<head id="Head1" runat="server">

<title>Untitled Page</title>

<meta name="keywords" content="These, are, my, keywords" />

<meta name="description" content="This is the description of my page" />

</head>

Page.MetaKeywords, Page.MetaDescription

<%@ Page Language="C#" Keywords="These, are, my, keywords"

Description="This is a description" %>

MetaTags

Page 68: The Old New ASP.NET

Будущее с ASP.NET 4.0

<asp:PlaceHolder ID="PlaceHolder1" runat="server" ViewStateMode="Disabled">

Disabled: <asp:Label ID="label1" runat="server" Text="[DeclaredValue]" /><br />

<asp:PlaceHolder ID="PlaceHolder2" runat="server" ViewStateMode="Enabled">

Enabled: <asp:Label ID="label2" runat="server" Text="[DeclaredValue]" />

</asp:PlaceHolder>

</asp:PlaceHolder>

Разница с EnableViewState

ViewStateMode

Page 69: The Old New ASP.NET

Будущее с ASP.NET 4.0

o Добавлены новые описания

o Переопределяемый провайдер

Browser Capabilities Providers

Page 70: The Old New ASP.NET

Будущее с ASP.NET 4.0

http://website/products.aspx?categoryid=12

http://website/products/software

o Базовый класс: PageRouteHandler

o Свойства: Page.RouteData

Routing

Page 71: The Old New ASP.NET

Будущее с ASP.NET 4.0

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"); }

Routing

Page 72: The Old New ASP.NET

Будущее с ASP.NET 4.0

protected void Page_Load(object sender, EventArgs e)

{

string searchterm = Page.RouteData.Values["searchterm"] as string;

label1.Text = searchterm;

}

Routing

Page 73: The Old New ASP.NET

Будущее с ASP.NET 4.0

Expression Builders: RouteUrl, RouteValue

<asp:HyperLink ID="HyperLink1" runat="server"

NavigateUrl="<%$RouteUrl:SearchTerm=scott%>">Search for Scott</asp:HyperLink>

<asp:Label ID="Label1" runat="server" Text="<%$RouteValue:SearchTerm%>" />

Routing

Page 74: The Old New ASP.NET

Будущее с ASP.NET 4.0

<asp:sqldatasource id="SqlDataSource1" runat="server"

connectionstring="<%$ ConnectionStrings:MyNorthwind %>"

selectcommand="SELECT CompanyName,ShipperID FROM Shippers where

CompanyName=@companyname"

<selectparameters>

<asp:routeparameter name="companyname" RouteKey="searchterm" />

</selectparameters>

</asp:sqldatasource>

Routing

Page 75: The Old New ASP.NET

Будущее с ASP.NET 4.0

У всех control’ов (и у Page) свойство ClientIDMode:

o AutoID – «старая» версия

o Static – «неизменяемый» ID

o Predictable – работает в паре с ClientIDRowSuffix

o Inherit – наследуется от родителя

ClientID

Page 76: The Old New ASP.NET

Будущее с ASP.NET 4.0

<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, а для чего name?

ClientID

Page 77: The Old New ASP.NET

Будущее с ASP.NET 4.0

<asp:GridView id="GridView2" runat="server" EnablePersistedSelection="true">

</asp:GridView>

Сохраняет выделение при пейджинге

Persisting Row Selection in Data Controls

Page 78: The Old New ASP.NET

Будущее с ASP.NET 4.0

ASP.NET Chart Control

Page 79: The Old New ASP.NET

Будущее с ASP.NET 4.0

<asp:LinqDataSource ID="dataSource" runat="server"> TableName="Products">

</asp:LinqDataSource>

<asp:QueryExtender TargetControlID="dataSource" runat="server">

<asp:SearchExpression DataFields="ProductName, Supplier.CompanyName"

SearchType="StartsWith">

<asp:ControlParameter ControlID="TextBoxSearch" />

</asp:SearchExpression>

</asp:QueryExtender>

LinqDataSource

EntityDataSource

QueryExtender Control : Search

Page 80: The Old New ASP.NET

Будущее с ASP.NET 4.0

<asp:LinqDataSource ID="dataSource" runat="server"> TableName="Products">

</asp:LinqDataSource>

<asp:QueryExtender TargetControlID="dataSource" runat="server">

<asp:RangeExpression DataField="UnitPrice" MinType="Inclusive"

MaxType="Inclusive">

<asp:ControlParameter ControlID="TextBoxFrom" />

<asp:ControlParameter ControlID="TexBoxTo" />

</asp:RangeExpression>

</asp:QueryExtender>

QueryExtender Control : Range

Page 81: The Old New ASP.NET

Будущее с ASP.NET 4.0

<asp:LinqDataSource ID="dataSource" runat="server" TableName="Products">

</asp:LinqDataSource>

<asp:QueryExtender TargetControlID="dataSource" runat="server">

<asp:PropertyExpression>

<asp:ControlParameter ControlID="CheckBoxDiscontinued" Name="Discontinued" />

</asp:PropertyExpression>

</asp:QueryExtender>

QueryExtender Control : PropertyExpression

Page 82: The Old New ASP.NET

Будущее с ASP.NET 4.0

<asp:LinqDataSource ID="dataSource" runat="server" TableName="Products">

</asp:LinqDataSource>

<asp:QueryExtender TargetControlID="dataSource" runat="server">

<asp:CustomExpression OnQuerying="FilterProducts" />

</asp:QueryExtender>

QueryExtender Control : CustomExpression

Page 83: The Old New ASP.NET

Будущее с ASP.NET 4.0

protected void FilterProducts(object sender, CustomExpressionEventArgs e)

{

e.Query = from p in e.Query.Cast<Product>()

where p.UnitPrice >= 10

select p;

}

QueryExtender Control : CustomExpression

Page 84: The Old New ASP.NET

Будущее с ASP.NET 4.0

<%: expression %>

<%= HttpUtility.HtmlEncode(expression) %>

<%: Request["UserInput"] %>

IHtmlString

<%: new HtmlString("<strong>HTML that is not encoded</strong>") %>

Html Encoded Code Expressions

Page 85: The Old New ASP.NET

Будущее с ASP.NET 4.0

o Empty Web Application Template

o Web Application & Web Site Project Templates

VS: Project Template Changes

Page 86: The Old New ASP.NET
Page 88: The Old New ASP.NET

Ресурсы

o ASP.NET on CodePlex http://aspnet.codeplex.com/

o ASP.NET 4 and Visual Studio 2010 Web Development Beta 2 Overview http://www.asp.net/LEARN/whitepapers/aspnet4/default.aspx