Sigurd Snørteland


viu² vant prisen for beste bidrag i Microsoft’s Azurekonkurranse

PS: Etter at Windows Azure ble en betalingstjeneste er desverre ikke denne løsningen lenger tilgjengelig online.


viu² hostet i Windows Azure

Jeg har lenge hatt planer om å konvertere silverlight mediaplayeren min, viu², over til Windows Azure, men mangel på ledig tid har stoppet meg inntill nå. Fra før har jeg hostet denne løsning hos GoDaddy.com, hvor jeg også har hatt tilgang til en MS Sql Server for lagring av data. Jeg har benyttet en webservice som  kommunikasjonspunkt mellom silverlight-klienten og databasen. Når jeg nå konverterte løsningen over til Windows Azure har jeg valgt å gå over til å benytte RIA Services som kommunikasjonspunkt og Azure Storage for lagring av data.

Det endelige resultatet kan du se her:  http://viu2.cloudapp.net

PS: Etter at Windows Azure ble en betalingstjeneste er desverre ikke denne løsningen lenger tilgjengelig online.

viu2azure_13

Arbeidet med å opprette selve Azure-solutionen i Visual Studio og å klargjøre denne for RIA Services har jeg beskrevet i en tidligere blogpost, og derfor kommer jeg ikke til å gå innpå dette nå. I stede skal jeg vise hvordan jeg har gått frem for å ta i bruk Azure Storage for lagring av data i viu²-løsningen.

  • Første steg, etter at man har en Azure-solution som er klargjort for RIA Services, er å legge til referanse til følgende to dll’er i RIA/ASP.NET Web Role-prosjektet:
    StorageClient.dll (denne filen kan lastes ned fra følgende link)
    System.Data.Services.Client
  • Neste steg blir å opprette en del klasse i RIA-prosjektet knyttet til de dataene man skal lagre i Azure Storage:

viu2azure_2

  • Den første klassen vi skal opprette er ‘TelevisionVO’ som definerer hvilke data vi ønsker å lagre i Azure Storage. Denne klassen skal benyttes for å lagre tv-streaming kanaler. Viktige momenter i denne klassen er at den arver fra ‘TableStorageEntity’, som innebærer at man må implementere parametrene ‘PartitionKey’ og ‘RowKey’. I tillegg krever RIA Services at ett eller flere parametre er merket med [Key].

viu2azure_5

  • TelevisionDB er den klassen hvor vi lagger til metoder for å hente ut legge til og hente ut data fra Azure tabellene våre. I dette tilfellet har jeg opprettet en metode for å hente en liste med objekt av typen TelevisionVO, samt en metode som tar imot et TelevisionVO-objekt og lagrer det i Azure tabellen.

viu2azure_4

  • AzureDataServiceContext-klassen knytter hele løsningen opp mot Azure Table Storage og forteller Azure at denne løsningen benytter 2 tabeller,  representert med 2 domene klasse typer (RadioVO & TelevisionVO). Denne klassen arver fra ‘TableStorageDataServiceContext’-klasse, noe som innebærer at klassen automatisk er knyttet opp mot Azure-kontoinformasjoen som vi senere sak sette i config-filene i Azure-prosjektet.

viu2azure_3

  • RiaDomainServices-klassen er en del av RIA Services og er Silverlight is kommunikasjonspunkt. Dette innebærer at vi må lage metoder her som Silverlight kan kommunisere med f.eks. når data skal hentes fra Azure Table Storage. På bildet nedenfor ser du hvordan denne klassen benytter metoder i ‘TelevisionDB’ for å fylle en liste med TelevisionVO-objekter for å returnere til Silverlight.

viu2azure_6

  • Neste steg er å logge seg opp mot Windows Azure portalen og opprette et nytt prosjekt av typen ‘Storage Account’.

viu2azure_8

  • Definer et navn og eventuelt en beskrivelse av løsningen.

viu2azure_9

  • Definer en unik url til prosjektet (SilverFeed er allerede tatt av meg). De andre parametrene kan stå uendret.

viu2azure_10

  • Nå er en ‘Azure Storage Account’ opprettet og man har fått en ‘Primary Access Key’ som skal kopiers og benyttes inne i Visual Studio Azure-prosjektet.

viu2azure_11

  • Gå tilbake til Visual Studio og Azure-prosjektet og ta opp filen ‘ServiceConfiguration.cscfg’

viu2azure_14

  • Endre taggen ‘<ConfigurationSettings>’ lik den du ser på bildet nedenfor og men bytt ut verdiene i ‘AccountName’ og ‘AccountSharedKey’ taggene til de verdiene du fikk når du opprette din ‘Azure Storage Account’ i Azure portalen.

viu2azure_12

  • Gå nå til den andre filen i Azure-prosjektet, ‘ServiceDefinition.csdef’, og endre ‘<ConfigurationSettings>’ taggen lik den du ser på bildet nedenfor:

viu2azure_7

Nå er prosjektet klargjort for hosting i Windows Azure og lagring i Azure Table Storage er opprettet. Siste steg er å velge ‘Publish’ på Azure-prosjektet i Visual Studio,   for deretter å opprette et ‘Hosted Services’ i Azure portalen og laste opp de Visual Studio genererte filene til Windows Azure (lest mer om dette i denne blogpost’en).

Her er en link til min viu² hostet i Windows Azure: http://viu2.cloudapp.net

PS: Etter at Windows Azure ble en betalingstjeneste er desverre ikke denne løsningen lenger tilgjengelig online.


SilverFeed + Ria Services hostet i Windows Azure

I blogposten om SilverFeed-applikasjonen min skrev jeg om at løsniner som benytter RIA Services må kjøre med ‘full trust’, noe som mange hostingprovidere ikke støtter. Windows Azure derimot gir støtte for dette og derfor har jeg valgt å konvertere/kopiere prosjektetet overt til en Windows Azure-solution.

Det endelige resultatet kan du se her:  http://silverfeed.cloudapp.net

PS: Etter at Windows Azure ble en betalingstjeneste er desverre ikke denne løsningen lenger tilgjengelig online.

  • Første steg er å opprette en ny solution av typen ‘Cloud Service’.

SilverFeedAzure1

  • Legg til en ‘ASP.NET Web Role’ og sett ett egnet navn. I dette tilfellet har jeg valgt navnet ‘RIA’.

SilverFeedAzure2

  • Kryss av for ‘Enable .NET RIA Services’

SilverFeedAzure3

  • Deretter legger du til et ‘Silverlight’-prosjekt (SilverFeed) i solution’en.
  • Kopier over/legg til alle filer fra den opprinnelige SilverFeed-solution i prosjektene RIA og SilverFeed. Den totale SilverFeedAzure-solutionen skal se ut som på bildet nedenfor:

SilverFeedAzure4

  • Neste steg er å legge til en ‘http handler’ etter den metoden som IIS7 krever. Dette gjøres i ‘ ‘system.webserver’-seksjonen i web.config’ RIA-prosjektet. Http handleren ser slik ut:

<add name=”DataService” verb=”GET,POST” path=”DataService.axd” type=”System.Web.Ria.DataServiceFactory, System.Web.Ria, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″ />

SilverFeedAzure5

  • Neste steg er å enable RIA Services i SilverFeedAzure-prosjektet. Dette gjøres i filen ‘ServiceDefinition.csdef’-filen ved å sette ‘EnableNativeCodeExecution’ til ‘true’.

SilverFeedAzure6

  • Nå er alle Azure-tilpasninger gjort og neste steg er å publisere filene for deploy til Windows Azure. Se hvordan på bilde nedenfor:

SilverFeedAzure15

  • Resultatet er at man får opprette de 2 filene du ser nedenfor:

SilverFeedAzure11

  • Neste steg er å logge seg på Windows Azure og opprette er prosjekt av typen ‘Hosted Services’.

SilverFeedAzure7

  • Definer et navn og eventuelt en beskrivelse av løsningen.

SilverFeedAzure8

  • Definer en unik url til prosjektet (SilverFeed er allerede tatt av meg). De andre parametrene kan stå uendret.

SilverFeedAzure9

  • En Windows Azure-maskin er nå klargjort for deg. Velg knappen ‘Deploy’ for å laste opp løsningen din.

SilverFeedAzure10

  • På bildet nedenfor laster man opp de 2 filene man fikk generert etter at vi valgt ‘publiser’ i SilverFeedAzure-prosjektet. I tillegg setter man en tekst som omtaler f.eks. hva denne deployen inneholdt eller når den skjedde.

SilverFeedAzure12

  • Når filene er lastet opp får sendes man tilbake til bildet nedenfor og velger knappen ‘RUN’. Etter noen minutter er løsningen oppe å kjører og statusen settes like ‘Started’ som på bildet nedenfor:

SilverFeedAzure13

Under headingen ‘Web Site URL’ finner du link til den deployede løsningen, i dette tilfellet http://silverfeed.cloudapp.net.

PS: Etter at Windows Azure ble en betalingstjeneste er desverre ikke denne løsningen lenger tilgjengelig online.

Bildet nedenfor viser SilverFeed live, hostet i Windows Azure:

SilverFeedAzure14

Dette eksemplet viser de nødvendige stegene som må gjøres for å ta en Silveright + RIA Services applikasjon over til Windows Azure. Den viser imidlertid ikke bruken av andre nyttige funksjoner i Windows Azure som f.eks. Azure Storage og SQL Azure. Jeg har i det siste også jobbet med å konvertere viu² over til Windows Azure og i den applikasjonen benytter jeg blandt annet Azure Table Storage, så jeg skal prøve å få skrevet en blogpost om den erfaringen snart.

Klikk på bildet nedenfor for å laste ned kildekoden til dette eksemplet:

download_SilverFeedAzure


SilverFeed: RSS-leser ved hjelp av RIA Services

Noen av utfordringen man møter på når man utvikler med Silverlight og Flash er de begrensninger som ligger i sikkerhetsmodellen. Den gjør blant annet at det ikke er mulig å koble seg opp mot eksterne datakilder med mindre disse tjenestene finnes på samme server som Silveright-løsningen, eller at det finnes en crossdomain.xml fil på serveren til datakilden (les mer her).

For å gjøre det enklere å benytte eksterne datakilder i Silverlight har Microsoft gitt oss produktet RIA Services. Dette er en løsning som gjør det enklere å bygge Silverlight-applikasjoner med en 3-lags arkitektur med Silverlight som presentasjonslag, RIA Services som applikasjonslaget (uten sikkerhetsbegrensningene til Silverlight) som kobler seg opp mot databaser og/eller webservicer.

SilverFeed9

Når man oppretter tradisjonelle Silverlight-applikasjoner får man alltid automatisk generert ett ASP.NET-prosjekt for hosting av Silverlight-løsninger, og det er i det ASP-prosjektet man implementerer RIA Services. Kort fortalt går RIA Services ut på å opprette en ’Domain Services Class’ i ASP-prosjektet, hvor man publiserer de metoder som Silverlight trenger. Eksempler på slike metoder kan for eksempel være en som henter rss-feed’er og pakker dem som objekter i en liste og returnerer listen til Silverlight. RIA Services-løsningen sørger for metodene og eventuelle klassedefinisjonen automatisk blir kopiert som ”proxyklasser” inn i Silverlight-prosjektet. RIA Services har mange funksjoner utover det jeg har nevnt og dersom du ønsker mer informasjon om RIA Services kan jeg anbefale å begynne med Brad Abrams artikkel ‘What is .NET RIA Services’.

I dette prosjektet har jeg opprettet et Silverlight + RIA Services prosjekt som henter nettopp RSS og RDF fra ulike nettsider og publiserer dem i en drag&drop-panel i Silverlight. Nedenfor vises et bilde av Silverlight-løsningen og lenger nede i denne blogposten finnes kildekoden til prosjektet. Nedenfor går jeg gjennom veil frem til denne løsningen.

SilverFeed1

  • Det første steget er å krysse av ‘Enable .NET RIA Services’ under opprettelsen av Silverlight-prosjektet. Som man ser nedenfor har jeg valgt å navngi ASP.NET hosting-prosjekt som ‘RIA’

SilverFeed2

  • Legg til en ‘Domain Services Class’ i RIA-prosjektet.

SilverFeed8

  • Dersom du skal returnerer en liste av objekter til Silverlight bør returtypen være ‘IEnumerable<…>’

SilverFeed3

  • I dette tilfellet ønsker jeg å returnere en liste av Feed-objekter til Silverlight og derfor har jeg definert Feed-klasse på bildet nedenfor. I klassen er det viktig at ett eller flere parametre er merket med [Key]

SilverFeed4

  • Nedenfor vises ett eksempelt på hvordan RIA Services metodene kan benyttes inne i Silverlight. RIA metoden returnerer som sagt en liste av feed-objektet og den velger jeg å binde til en ‘PageCollectionView’, dvs en pagercontrol til datatabellen, og denne ‘PageCollectionView’-control’en bindes til datacontext til usercontrol’en.

SilverFeed5

  • Nedenfor vises xaml’en til rss-control’en. Både pagercontrollen og datatabellen er bindet til datacontext til usercontrol’en og dermed til ‘PageCollectionView’-control’en som ble fyllt med data fra RIA-prosjektet på forige bilde.

SilverFeed6

  • Nedenfor ser du et eksempel på hvordan en rss-control vises i Silverlight. 6 slike control’ere vises til enhver tid i en drag&drop-control fra open source-prosjektet Blacklight.

SilverFeed7

PS: For å kjøre RIA Services i IIS må applikasjonen ha rettighetene ‘full trust’. Min hosting-leverandør ‘godaddy.com’ tilbyr ikke det og derfor får jeg desverre ikke lagt ut en kjørbar demo av dette prosjektet nå. I Windows Azure kjøres alle applikasjoner med ‘full trust’ og derfor planlegge jeg å skrive en blogpost om hvordan man kan konvertere dette prosjektet og hoste det i Windows Azure.

Klikk på bildet nedenfor for å laste ned kildekoden til dette eksemplet:

download_SilverFeed


Windows User ID i Silverlight

SilverlightInitParams-1

Når man utvikler forretningsapplikasjoner har man ofte behov for å få tilgang til windows user id’en til den påloggede brukeren, og i ASP.NET kan man gjør dette med følgende kommando: Page.User.Identity.Name. I Silverlight har man derimot ikke tilgang til denne informasjonen, noe som kan skyldes at Silverlight skal være crossplatform og at dette kan skape vansker i en slik sammenheng, og/eller det kan skyldes den restriktive sikkerhetspolicy som Microsoft har satt i Silverlight.

En måte å komme rundt denne begrensningen på er å kombinere asp.net og InitParameters-funksjonen i Silverlight. I tidligere versjoner av Silverlight hadde man en egen aps-tagg for silverlight (<asp:silverlight>) og dermed kunne man fra asp.net sette initParameteret i runtime. Nå er denne taggen fjernet fra asp.net og man må i stede benytte en vanlig <object>-tagg. Sammen med den endringen forsvant også muligheten for å kommunisere med Silverlight-applikasjonens initParametere direkte fra asp.net. Løsningen på dette er å benytte en <asp:Literal>-tagg inne i Silverlight-objektdefinisjonen, og skrive hele initParameteret-taggen i runtime. Se bildet nedenfor for detaljer:

SilverlightInitParams-2

I ‘Page_Load’ metoden til asp-siten henter jeg windowsID’en fra den påloggede brukeren og skriver denne verdien til <asp:Literal>-taggen som på bildet nedenfor:

SilverlightInitParams-3

I App-filen i Silverlight plukker jeg ut initParameteret og setter den inn MainPage gjennom at jeg har oppdaterte konstruktøren til MainPage til å ta imot dette parameteret (se bildet lenger nede). Nedenfor ser dere StartUp-metoden til App-filen:

SilverlightInitParams-4

Bildet under viser hvordan userid-parameteret ender opp i MainPage-kontrolleren og blir presentert som tekst for brukeren.

SilverlightInitParams-5

Selv om jeg i dette eksemplet tok utgangspunkt i å sende windows user id’en inn til silverlight under runtime, så kan metoden benyttes for å sende alle typer data inn til Silverlight. Man kan f.eks. benytte denne metoden for å lese konfigurasjons-instillinger fra web.config i asp.net-applikasjonen og sende dem inn til Silverlight som initparametre.

Klikk på bildet nedenfor for å laste ned kildekoden til dette eksemplet:

download_SilverlightInitParams