Intressanta nyheter i .net 4.0

Det närmar sig lansering av .net 4.0. Jag vill i detta inlägg skriva övergripande om några av nyheterna. Vill du veta mer kan du läsa microsofts whitepaper om .net 4.0.

Cacheprovider

Cachen i .net har byggts om till providermodellen, på samma sätt som exempelvis roleprovider, sessionprovider och membershipprovider har hjälpt oss skapa flexibla lösningar. Det blir nu enkelt att koppla på vilken cachelösning som helst eller bygga en egen. Exempel på distribuerade minnescachelösningar är NCache, scaleout stateserver, memcached och microsofts egna velocity. Velocity CTP 4 är planerat att lanseras i mitten av september.

Det går utmärkt att använda olika cacheproviders på olika sidor, exempelvis.

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

Komprimering av sessionsdata

Det är mycket vanligt att komprimera html, javascript, css och annan textbaserad data när den skickas mellan klient och server. Sessionsdata är också ofta text som går att komprimera väldigt mycket. Om man har stora mängder av sessionsdata och man inte använder InProc-session så kan det vara en god idé att testa att aktivera komprimering av sessionsdata. Det kommer att kräva mer processorkraft från webbservrarna, men tar å andra sidan mindre nätverkstrafik och det går fortare att skicka/hämta data.

Exempel:

<sessionState
    mode="SqlServer"
    sqlConnectionString="..."
    allowCustomSqlDatabase="true"
    compressionEnabled="true"
/>

Läs gärna mitt inlägg komprimera sessionsdata med asp.net 4.0 för en djupare analys av hur komprimeringen fungerar.

Sökmotoroptimeringsförbättringar

När man börjar med SEO så är bland det första man lär sig att man vill göra en 301-redirect (permanent) om man vill få med sig hela länkvärdet från befintliga länkar till den nya sidan.
Den vanliga Response.Redirect är en 302-redirect (temporär).

Tidigare har man fått lösa det genom exempelvis

Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://www.exempel.foo");

En nyhet i .net 4.0 gör det hela mycket enklare.

Response.RedirectPermanent("ny-url.aspx");

Utöver RedirectPermanent så finns två nya page-attrubut.
Page.Keywords och Page.Description som direkt kan användas programmatiskt för att sätta meta description och meta keywords. Det går också att sätta dessa via page-direktivet.

ViewStateMode

Viewstate i .net 3.5 och tidigare har bristen att man endast kan aktivera det för hela sidan och sedan stänga av det kontroll för kontroll. Detta gör givetvis att det är svårt att få en minimerad viewstate, som bara innehåller det som absolut krävs. I .net 4.0 så får man äntligen möjlighet att stänga av viewstate för hela sidan men aktivera det enbart för någon enstaka kontroll.
Exempel

<%@ Page Language="C#" ... EnableViewState="true" ViewStateMode="Disabled" %>
...
<asp:Label ID="Label1" runat="server" Text="gammal text" />
<asp:Label ID="Label2" runat="server" Text="gammal text" ViewStateMode="Enabled" />
<asp:Button ID="Button1" Text="reload" runat="server" />
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Label1.Text = Label2.Text = "ny text...";
    }
}

I ovanstående exempel har vi stängt av ViewState för hela sidan (ViewStateMode är satt till disabled). På Label2 har vi dock valt att aktivera viewstate.
Notera att EnableViewState (den gamla propertyn) måste vara satt till true, annars är viewstate avstängd.

När man trycker på knappen så kommer Label1 att få texten ”gammal text…” eftersom den saknar viewstate.

Routing

Omskrivning av url:er på samma sätt som i mvc blir möjligt.

Följande skrivs in i global.asax

public class Global : System.Web.HttpApplication
{
    protected  void Application_Start(object sender, EventArgs e)
    {
         RouteTable.Routes.Add("UserRoute",  
             new Route("users/{username}", 
             new WebFormRouteHandler("~/users.aspx")));
    }
}

Ovanstående skickar exempelvis en request till exempel.foo/users/patrik till den fysiska sidan exempel.foo/users.aspx.

På den fysiska sidan använder man sig av Page.RouteData för att ta emot värdet.

Exempelvis

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

ClientIdMode

.net sköter namngivningen av alla serverkontroller helt automatiskt. Dock får detta till följd att många kontroller får onödigt långa namn, exempelvis ctl00$Masthead1$LocaleManagement$ctl00, för en enkel div. Med ClientIdMode går det att styra hur .net skall skall agera vid namngivning.

Legacy
Namnger kontroller på exakt samma sätt som i de tidigare .net-versionerna. Räkna dock med att värdet inte kommer att heta Legacy i den slutgiltiga versionen av .net.

Static
Om man använder static så får man bestämma helt själv. .net kommer inte att ändra din kod. Risken finns att man får element med samma id vilket kan ge andra problem.

Predictable
En blandning mellan static och legacy. Här namnger man kontrollen själv, men om det finns risk för dubbletter, exempelvis i en repeater, så lägger .net till en mindre mängd text för att göra id:t unikt.

Inherit
Ärver ClientIdMode-inställning från föregående kontroll.

Templates

När man arbetar med javascript och ajax är det vanligt att man lägger en del av presentationen i javascript. Det vill man normalt undvika men det har varit svårt tidigare. Med asp.net ajax 4.0 så kommer AjaxTemplates, ett javascriptbiliotek som gör det möjligt att bryta ut presentationen i mallar.

Exempel på hur man använder mallar med deklarativ bindning.

<style type="text/css">.sys-template { display:none; }</style>
<script type="text/javascript" src="scripts/MicrosoftAjax.js"></script>
<script type="text/javascript" src="scripts/MicrosoftAjaxTemplates.js"></script>

<script type="text/javascript">
    var persons = [
        { Firstname: "Bill", Lastname: "Gates" },
        { Firstname: "John", Lastname: "Doe" }
    ]
</script>
<body xmlns:sys="javascript:Sys" xmlns:dataview="javascript:Sys.UI.DataView" sys:activate="personList">   
    <ol id="personList" class="sys-template" sys:attach="dataview" dataview:data="{{ persons }}">
        <li><strong>{{ Firstname }}</strong> {{ Lastname }}</li>
    </ol>
</body>

Notera hur persons-objektet fylls och att ol-listan sedan refererar till det samma som sin datakälla.
Ovanstående kod resulterar i följande.

AjaxTemplates - exempel

web.release.config

Det blir möjligt att skapa olika web.config beroende på vilket byggläge (debug,release) man har valt i visual studio. Detta gör man genom att konfigurera i en web.release.config vilka ändringar från den befintliga web.config man vill göra.

Nedanstående kodexempel visar hur det kan se ut.

<connectionStrings xdt:Transform="Replace">
  <add name="myDB" connectionString="ny connection..." />
</connectionStrings>
<compilation xdt:Transform="RemoveAttributes(debug)"> 
</compilation> 

Grafkontroll

Till .net 3.5 finns ett plugin för att skapa grafer, detta blir nu en integrerad kontroll i .net 4.0.

About these ads

2 kommentarer

  1. Anders sade

    Grymt! Jag tycker att alla de där grejerna verkligen är saker man vill ha. Cacheproviders, viewstate och smartare hantering av sessionsdata kommer att göra mycket för skalbarheten på stora siter.

  2. stuckish sade

    Bra artikel! Tack för den lilla genomgången. För det mesta behöver man bara en sån här. Viktigaste är att veta att en feature finns. Inte exakt hur den fiungerar för det kan man ta reda på när man behöver den.

RSS feed for comments on this post

Kommentarer inaktiverade.

Följ

Få meddelanden om nya inlägg via e-post.

Gör sällskap med 99 andra följare

%d bloggers like this: