Windows Mobile Support

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg
Showing posts with label REST. Show all posts
Showing posts with label REST. Show all posts

Wednesday, 18 April 2012

Windows Azure Media Service - Overview

Posted on 08:38 by Unknown
A fost lansat un nou serviciu pentru Windows Azure. Acesta se numeste Windows Azure Media Services si este un serviciu care ne permite sa oferim solutii media folosind Windows Azure. Acest lucru se putea face si pana acuma, dar era nevoie ca noi sa ne implementam tot procesul, de la upload de stream, encoding and so on.
Din acest moment acest lucru ne este oferit gratuit de catre Microsoft. Gratuit, oarecum spus. Tot servicul pentru media nu este oferit contra cost. Cea ce noi platim este spatiul ocupat pe cloud, procesarea stream-ului si traficul. De fapt acest serviciu ne ofera un API care ne ajuta sa manipulam elemente media (atat audio cat si video).
In acest moment, Windows Azure Media Services este doar la versiunea Developer Preview, dar nu o sa treaca foarte multa vreme pana cand acest serviciu o sa fie in versiune finala.
Acest serviciu este suportat de nenumarate platforme de la sisteme cu Windows (inclusiv W8), la Mac, Xbox, Windows Phone, Androit, WCE.
Hai sa vedem ce putem face cu acest serviciu. In primult rand putem sa facem encoding la un stream media in cateva formate suportate. In momentul de fata sunt suportate formate precum
AAC-LC, H.264, VC-1, MP4, Apple Live Stream, PIFF. Partea buna este ca acest servciu este bine gandit, fiind destul de usor de extins. De exemplu in orice moment ne putem implementa propiul mecanism de encoding. Tot pe partea de encoding, ne este promis suport pentru thirt-party encoders, precum Ateme sau Digital Rapids. Aceste servicii de la 3th-party o sa fie disponibile prin intermediul la Windows Azure Marketplace.
Pe langa partea de encoding, acest serviciu ne permite sa oferim media streaming atat LIVE cat si offline. Ce mi s-a parut destul de interesant este integrarea cu DVR-ul si modul in care se poate scala cand esti LIVE si trebuie sa faci stream-ing la foarte multi consumatori. Prin intermediul CDN-urilor de la Windows Azure, cotentul unui stream poate sa fie foarte usor trimis la toti consumatorii. O noutate este integrarea si cu alte CDN-uri, nu doar cele de la Microsoft.
Pe partea de protectie, Windows Azure suporta encriptatea stream-ului utilizand Microsfot PlayReady si MPEG Common Encryption. Dar ca si la encodare, putem sa folosim solutii 3th-party .
Existe mai multe tipuri de entitati cu care Media Services lucreaza in format REST. Mai jos puteti sa gasiti lista cu cele mai importante entitati:
  • File - este un fisier media (audio, video) care este stocat sub forma unui obiect de tip blob
  • Assert - meta-datele a unui sau mai multe fisiere media. Acesta poate sa contina orice fel de date, incepand de la numele piesei la date despre casa de discuri
  • Task - este o operatie care se poate executa pe un File sau pe un Assert (enconding, streaming...)
  • Job - Operatii de creeare, stergere a nui File sau Assert. Acesta poatecontine unul sau mai multe task-uri.
  • Locator - Este un URI generat automat pe baza caruia se poate oferii acces la o anumita resursa pe o perioada limitata de timp.
  • Access Policy - Cine/Ce/Unde/Cand poate sa acceseze o resursa media
Toate aceste operatii se pot face folosind un API rest. Workflow-ul pentru acest serviciu defineste 4 tipuri de operatii:
  • Ingest - este primul pas cand vrem sa adaugam un continut media. Acest pas cuprinde partea de upload si encriptate a continutului
  • Process - acest pas cuprinde task-uri precum encoding, conversie, transformare a continutului media
  • Manage - operatii pe assert-urile care deja exista (edit, delete, setup)
  • Deliver - operatii de streaming a continutului pe care il avem deja (atat live cat si offline) - atat direct la utilizator cat si la CDN-uri
API fiind in format REST este destul de usor de folosit. Mai jos gasiti un exemplu pentru o aplicatie pentru Windows 8 Metro Style. M-am jucat putin cu acest serviciu, dar in acest momet evit sa dau exemple de cod, pana cand nu avem o versiune finala.
Ca si incheiere, acest serviciu suna destul de bine si o sa ne usureze mult viata, mai ales ca este gratis. Asteptam versiunea finala a sa.
Enjoy!.
Read More
Posted in Azure, REST, windows 8 | No comments

Monday, 4 July 2011

REST Client - RESTSharp

Posted on 06:55 by Unknown
In urma cu cîteva luni aveam nevoie de un un mecanism prin intermediul căruia sa consum servicii REST din .NET.
La prima strigare acest lucru este destul de simplu de făcut (de implementat), avem nevoie un obiect de tip HttpRequest. Dar am vrut mai mult de atît, doream un API simplu prin care sa pot sa fac apeluri REST.
O soluție la îndemîna era sa încep implementarea unui astfel de API de la 0, cea ce am și făcut în prima faza, deoarece nu este foarte complicat (mi-a luat in jur de 12 ore pana sa ajuns la un API destul de bogat).
Intre timp am început sa caut pe web ce soluții free exista și am descoperit RestSharp. Este un client pentru servicii în format REST open-source destul de robust și bine gîndit.
Ce mi-a plăcut la el cel mai mult și m-a făcut sa îl folosesc este numele la clase (foarte sugestive) și ușurința cu care se poate folosii plus ca primele linii de cod pe care le-am scris pentru acest IP au funcționat din prima. Mai jos puteți sa găsit un exemplu:
RestClient restClient = new RestClient("www.car.com");
RestRequest restRequest = new RestRequest();
restRequest.Method = Method.GET;
restRequest.Resource = "Cars/Get";
restRequest.AddParameter(
new Parameter()
{
Name = "id",
Value = "123",
Type = ParameterType.GetOrPost
});
Car car = restClient.Execute<Car>(restRequest);
Prin intermediul la restRequest putem sa facem unu sau mai multe apeluri. Detalii pentru fiecare apel de serviciu în parte sunt specificate prin intermediul unei instante de tip RestRequest. Resource se refera la adresa relativa a serviciului fata de adresa de baza.
Putem sa adaugăm oricîți parametrii, iar pentru fiecare parametru în parte se poate specifica tipul acestuia. Tipurile de parametri suportați sunt:
  • Cookie
  • GetOrPost
  • UrlSegment
  • HttpHeader
  • RequestBody
Ce mi-a plăcut este ca pot sa controlez destul de ușor unde se va adaugă fiecare parametru în parte, iar în cazul în care lucrați și cu cookie, lucrurile se simplifica destul de mult.
Parametrii de tip UrlSegment sunt destul de interesanți. Îți permit sa specifici în Resource o adresa dinamica, care în funcție de parametrii sa se poată modifica. De exemplu daca lucram cu doua versiuni de servicii, ne-ar fi util sa putem specifica locația la fiecare versiune de serviciu în parte. Pentru a putea face acest lucru putem sa scriem următorul apel:
RestRequest restRequest = new RestRequest();
restRequest.Method = Method.GET;
restRequest.Resource = "{version}/Cars/Get";
request.AddParameter("version", _version, ParameterType.UrlSegment);
In request putem sa adaugăm fișiere prin metoda AddFile, totodată putem sa specificam formatul datelor JSON sau XML. In cazul în care avem un de-serializator custom putem sa îl specificam în momentul în care setam obiectul de tip RestClient.
restClient.AddHandler("*", new JsonDeserializer());
Obiectul care este returnat nu trebuie sa fie neapărat un obiect serializabil, putem sa apelam doar metoda Execute, aceasta ne va returna un obiect de tip RestResponse, care va conține toate informațiile de care avem nevoie. Proprietatea Content ne va returna conținutul returnat de către serviciu.
Apeluri se pot face și async fără nici o problema, iar fiecare clasa din API are unit teste pentru o mare parte din funcționalități.
Un lucru destul de draguț este ca suporta cîteva tipuri de autentificare in mod default. In cazul în care aveți nevoie de un mecanism mai complicat, se poate extinde foarte ușor acest lucru prin implementarea unei interfețe.
In general cam toate cazurile de care o sa avem nevoie pentru a consuma un serviciu în format REST sunt acoperite, dar putem fără probleme sa extindem acest API. Chiar am avut nevoie sa fac acest lucru, pentru un serviciu de la Yahoo destul de ciudat. Mi-a luat cam 20 de minute sa fac acest lucru cu tot cu testare. Pana acuma personal nu am descoperit nici un bug la RESTSharp.
Din punct de vedere a documentației, exista un wiki destul de okay. Ultimul release a fost făcut în mai 2011.
Ca un overall, sunt mulțumit de acest client de REST. Daca nu o sa îl folosiți, măcar merita sa va uitați peste codul sursa înainte sa începeți sa faceți ceva asemănător. Cea mai frumoasa idee mi s-a părut ideea de a putea seta tipul la fiecare parametru în parte. A.i. aceasta lista se poate refolosii și la alte requesturi fără nici o problema.
Read More
Posted in .NET, REST, REST Client, RESTSharp | No comments

Wednesday, 29 June 2011

Care este cel mai rapid mod prin care putem consuma un serviciu REST

Posted on 08:05 by Unknown
In ultima perioada din ce în ce mai multe servicii publice în format REST au apărut pe piaţa.
O problema destul de neaşteptata apare pe partea de client:
Cum sa consumam un serviciu REST?
Din start, .NET ne oferă doua variante destul de simple pentru a putea utiliza un serviciu REST:
  • WCF Client - Service Contract;
  • WebRequest;
Pentru a putea consuma un serviciu folosindu ne de WCF avem nevoie sa ne declaram un contract (ServiceContract) în care sa specificam operaţiile care ne sunt puse la dispoziţie.
[ServiceContract()]
[XmlSerializerFormat()]
public interface ICarClient
{
[OperationContract]
[WebGet(
ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "Car/{id}?userkey={userKey}")]
Car GetCar(string id,string userKey);
}

La acest nivel am definit prin atributul WebGet locaţia acestei resurse (UriTemplate) relativa la adresa setata în fişierul de configurare. Urmatorul pas este sa ne configuram un endpoint in fisierul de configurare de forma:
<system.servicemodel>
<client>
<endpoint address="http://www.carCollection.com/" binding="webHttpBinding" behaviorconfiguration="CarRestBehavior" contract="CarEx.ICarClient" name="CarRestEndpoint">
</endpoint>
<behaviors>
<endpointbehaviors>
<behavior name="CarRestBehavior">
<webhttp>
</webhttp>
</behavior>
</endpointbehaviors>
</behaviors>

Este foarte important la acest pas sa configuram comportamentul la endpoint şi sa îl setam pe "webHttp".
Odată ce am făcut acest lucru putem sa ne cream un proxy prin intermediul la ChannelFactory, iar mai departe sa apelam serviciul dat.
ChannelFactory factoryCar = new ChannelFactory("CarRestEndpoint");
ICarClient carClientProxy = factoryCar.CreateChannel();
Car car = carClientProxy.GetCar("1","userKey");
Nu vreau sa intru în mai multe detalii pe partea de configurare. In cazul in care avem noroc ca serviciul pe care vrem sa îl consumam are definit un WSDL (Web Service Definition Language), atunci ajunge doar sa adaugăm în proiect o referința la serviciu ("Add Service Referince").
Pentru a putea consuma un serviciu REST putem sa folosim și WebRequest (care este mult mai ușor de folosit).
WebRequest request = WebRequest.Create("http://www.carCollection.com/Car/1?userKey=userKey");
WebResponse webResponse = request.GetResponse();
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car));
Car car = (Car)xmlSerializer.DeserializewebResponse.GetResponseStream());
Este destul de simplu, este nevoie sa specificam adresa și sa facem un request. Răspunsul o sa îl primim ca un stream pe care trebuie apoi sa îl deserializam. Partea de procesare stream și deserializare trebuie sa o facem manual.
Si acuma apare o noua întrebare, care m-a făcut sa scriu acest post:
Care din cele doua mecanisme credeți ca este mai rapid?
La prima strigare am spus ca WCF Client. In spate avem o colecție de librarii dezvoltate în timp. Acestea ar trebuii sa fie optimizate și sa meargă excelent, dar iată ce rezultate am obținut în urma testelor:
  • WCF Client: 35s
  • Web Request: 11s
La prima vedere nu am înțeles foarte bine cauza dar apoi am găsit mai multe cauze pentru acest lucru.
Un apel de tip web request este extrem de simplu, iar WCF este mult prea complicat pentru ce avem nevoie noi. Deșii oferă o multitudine de opțiuni, de foarte multe ori pentru un web request noi folosim doar 1% din cea ce ne oferă, caz în care încărcam multe librarii fără nici un rost.
Prin WCF suntem nevoiți sa trecem printr-un flow extrem de complex care implica mecanisme costisitoare din punct de vedere a timpului precum reflection.
Asta nu inseamna ca o sa ne fie ușor sa folosim Web Reques, pot sa apară cazuri când este mult mai ușor sa lucram cu ChannelFactory (WCF) si nu cu web request dar din punct de vedere a timpului, un web request o sa fie mereu mai rapid.
Read More
Posted in ChannelFactory, REST, WCF, WebRequest | No comments
Older Posts Home
Subscribe to: Posts (Atom)

Popular Posts

  • E-Learning Vendors Attempt to Morph Mobile
    The sign should read: " Don't touch! Wet Paint !" I had a good chuckle today after receiving my latest emailed copy of the eLe...
  • Content Types - Level 6: Rich Media
    Level 6: Rich Media NOTE: This is part 7 of 7 and the conclusion of this continuing series; please see earlier posts for more background inf...
  • CDN is not the only solution to improve the page speed - Reverse Caching Proxy
    I heard more and more often think like this: “If your website is to slow, you should use a CDN.” Great, CDN is THE solution for any kind of ...
  • Publishing our CellCast Widget for iPad
    The rush has been on this week as our development team worked to design a new version of our CellCast Widget specifically for Apple's up...
  • NetCamp 2012 - Windows 8 development experience
    During this week I participate to NetCamp 2012.  This was the 6th NetCamp event and is organizing by Evensys. NetCamp is a dedicated event f...
  • SQL - UNION and UNION ALL
    I think that all of us used until now UNION in a SQLstatement. Using this operator we can combine the result of 2 queries. For example we wa...
  • Password/Token/PIN definition
    Password, Token, PIN, Passcode… every day we use this items when we need to authenticate in different systems. I observed that there are tim...
  • Shared Access Signature and URL encoding on Windows Azure
    Playing a little with Shared Access Signature was quite nice. In this moment this new functionality has a great potential. Playing a little ...
  • Content Types - Level 4: Reference
    Level 4: Reference Materials & Static Content NOTE: This is part 5 of 7 in a continuing series; please see earlier posts for more backgr...
  • Content Types - Level 5: Courseware
    Level 5: Content and Courseware NOTE: This is part 6 of 7 in a continuing series; please see earlier posts for more background information. ...

Categories

  • .NET
  • .NET nice to have
  • #if DEBUG
  • 15 iunie 2011
  • 15 octombrie 2011
  • 2011
  • abstracta
  • action
  • adaugare
  • ajax
  • Amsterdam
  • Android
  • aplicatii
  • App Fabric
  • Apple iSlate
  • array
  • as
  • ASP.NET
  • AsReadOnly
  • Assembly comun
  • async
  • Asynchronous programming
  • asyncron
  • Autofac
  • AutoMapper
  • az
  • Azure
  • Azure AppFabric Cache
  • Azure backup solution
  • Azure Storage Explorer
  • azure. cloud
  • backup
  • BCP utility
  • bing maps v7
  • BitArray
  • BlackBerry
  • blob
  • BlobContainerPublicAccessType
  • breakpoint
  • bucuresti
  • C#
  • cache
  • CallerMemberName
  • CellCast
  • Certificate
  • CES
  • change
  • ChannelFactory
  • clasa
  • classinitialize
  • clean code
  • click event
  • close
  • Cloud
  • Cluj
  • cluj-napoca
  • Code contracts
  • code retrat
  • codecamp
  • CollectionAssert
  • Compact Edition
  • compara
  • Comparer T .Default
  • CompareTo
  • comparison
  • comunitate
  • concurs
  • Conditional attribute
  • configurare
  • connection string
  • container
  • content type
  • control
  • Convert
  • convertAll
  • convertor
  • cross platform
  • CRUD
  • css
  • custom properties
  • custom request
  • DACPAC
  • Daniel Andres
  • data sync service
  • database
  • date time
  • datetime
  • debug
  • default
  • delegate
  • dependency injection
  • deploy
  • DeploymentItem
  • design patterns
  • Dev de Amsterdam
  • development stoage
  • dictionary
  • diferente
  • digging
  • director
  • Directory.Exist
  • disable
  • dispatcher
  • dispose
  • dropdown
  • dynamic
  • EF
  • email
  • encoding
  • entity framework
  • enum
  • enumerable
  • Environment.NewLine
  • error
  • error 404
  • error handling
  • eveniment
  • event
  • ews
  • excel
  • exception
  • exchange
  • exita
  • explicit
  • export
  • extension
  • field
  • File.Exist
  • finalize
  • fire and forget
  • Fluent interface pattern
  • format
  • func
  • GC.SuppressFinalize
  • generic
  • getdirectoryname
  • globalization
  • gmail
  • hackathon
  • Hadoop
  • handle
  • HTML
  • html 5
  • Html.ActionLink
  • http://www.blogger.com/img/blank.gif
  • HttpModule
  • IComparable
  • IE
  • ienumerable
  • IIS
  • image
  • implicit
  • import
  • int
  • internationalization
  • Internet Explorer
  • interop
  • Ioc
  • IP Filter
  • iPhone
  • iQuest
  • IStructuralEquatable
  • ITCamp
  • itspark
  • java script
  • javascript
  • July 2012
  • KeyedByTypeCollection
  • KeyNotFoundException
  • Kinect SDK
  • lambda expression
  • LightSwitch Microsoft Silverlight
  • linq
  • list
  • lista
  • lista servicii
  • liste
  • Live Connect
  • Live ID
  • load
  • localization
  • lock
  • m-learning
  • MAC
  • Mango
  • map
  • mapare
  • mapare propietati
  • messagequeue
  • meta properties
  • method
  • MethodImpl
  • Metro App
  • Microsoft
  • Microsoft Sync Framework
  • mlearning
  • mlearning devices
  • Mobile Apps
  • mobile in the cloud
  • mobile learning
  • mobile services
  • Mobile Web
  • mongoDb
  • monitorizare
  • msmq
  • multitasking
  • MVC
  • MVC 3
  • MVVM
  • namespace
  • nextpartitionkey
  • nextrowkey
  • Ninject
  • nivel acces
  • no result
  • normalize
  • nosql
  • null expcetion
  • null object pattern
  • NullReferenceException
  • OAuth API
  • office
  • offline
  • Open ID
  • openhackeu2011
  • operations
  • operator
  • optimization
  • option
  • outputcache
  • OutputCacheProvider
  • override
  • paginare
  • pagination
  • path
  • persistare
  • Portable Library tool
  • Post event – CodeCamp Cluj-Napoca
  • predicate
  • predictions
  • prezentare
  • process
  • proiect
  • property
  • propietati
  • query
  • ReadOnlyCollection
  • ReadOnlyDictionary
  • referinta
  • reflection
  • remote
  • reply command
  • request
  • request response
  • resouce
  • REST
  • REST Client
  • RESTSharp
  • ronua
  • rss
  • rulare
  • salvare in fisier
  • sc
  • schimbare timp
  • select
  • select nodes
  • send
  • serializare
  • serialization
  • Server.Transfer. Resposen.Redirect
  • service bus
  • ServiceBase
  • servicecontroller
  • sesiune
  • session
  • Session_End
  • Session_Start
  • setup
  • Sibiu
  • signalR
  • Silverlight
  • sincronizare
  • Single Responsibility Principle
  • SkyDrive
  • skype
  • smartphones
  • smtp
  • Snapguide
  • sniffer
  • socket
  • solid
  • spec#
  • sql
  • Sql Azure
  • SQL CE
  • sql server 2008 RC
  • SRP
  • startuptype
  • stateful
  • stateless
  • static
  • stergere
  • store
  • store procedure
  • stream
  • string
  • string.join
  • struct
  • StructuralEqualityComparer
  • submit
  • switch
  • Symbian
  • Synchronized
  • system
  • tabele
  • table
  • techEd 2012
  • tempdata
  • test
  • testcleanup
  • testinitialize
  • testmethod
  • thread
  • timer
  • ToLower
  • tool
  • tostring
  • Total Cost Calculator
  • trace ASP.NET
  • transcoding
  • tuplu
  • tutorial
  • TWmLearning
  • type
  • unit test
  • unittest
  • UrlParameter.Optional
  • Validate
  • validation
  • verificare
  • video
  • view
  • ViewBag
  • virtual
  • visual studio
  • VM role
  • Vunvulea Radu
  • wallpaper
  • WCF
  • WebBrower
  • WebRequest
  • where clause
  • Windows
  • windows 8
  • Windows Azure
  • Windows Azure Service Management CmdLets
  • windows live messenger
  • Windows Mobile
  • Windows Phone
  • windows service
  • windows store application
  • Windows Task
  • WinRT
  • word
  • workaround
  • XBox
  • xml
  • xmlns
  • XNA
  • xpath
  • YMesseger
  • Yonder
  • Zip

Blog Archive

  • ▼  2013 (139)
    • ▼  November (17)
      • Service Bus - Optimize consumers using prefetch an...
      • Extract relative Uri using MakeRelativeUri method
      • Sync Group - Let's talk about Performance
      • [PostEvent] Slides from MSSummit 2013, Bucharest
      • How to get the instance index of a web role or wor...
      • Sync Group - A good solution to synchronize SQL Da...
      • Throttling and Availability over Windows Azure Ser...
      • How to monitor clients that access your blob storage?
      • Digging through SignalR - Dependency Resolver
      • [Event] Global Day of Coderetreat in Cluj-Napoca! ...
      • Windows Azure Service Bus - What ports are used
      • Debugging in production
      • Simple load balancer for SQL Server Database
      • [PostEvent] MSSummit 2013, Bucharest
      • How to read response time when you run a performan...
      • VM and load balancer, direct server return, availa...
      • Bugs that cover each other
    • ►  October (12)
    • ►  September (10)
    • ►  August (7)
    • ►  July (8)
    • ►  June (15)
    • ►  May (12)
    • ►  April (17)
    • ►  March (16)
    • ►  February (9)
    • ►  January (16)
  • ►  2012 (251)
    • ►  December (9)
    • ►  November (19)
    • ►  October (26)
    • ►  September (13)
    • ►  August (35)
    • ►  July (28)
    • ►  June (27)
    • ►  May (24)
    • ►  April (18)
    • ►  March (17)
    • ►  February (20)
    • ►  January (15)
  • ►  2011 (127)
    • ►  December (11)
    • ►  November (20)
    • ►  October (8)
    • ►  September (8)
    • ►  August (8)
    • ►  July (10)
    • ►  June (5)
    • ►  May (8)
    • ►  April (9)
    • ►  March (14)
    • ►  February (20)
    • ►  January (6)
  • ►  2010 (26)
    • ►  December (1)
    • ►  November (1)
    • ►  October (1)
    • ►  June (2)
    • ►  May (1)
    • ►  April (4)
    • ►  March (1)
    • ►  February (1)
    • ►  January (14)
Powered by Blogger.

About Me

Unknown
View my complete profile