by Israr Khan
14. juli 2011 11:45
Rastafari man!

Har tidigere sett en del på å lage REST-baserte tjenester med WCF, blant annet med webHttpBinding og også med Rest Template-en
1.
I mellomtiden har det skjedd en del, blant annet har WCF Web API
2 blitt gitt ut i Preview 4, samt at jeg har sett litt mer på OpenRasta
3.
WCF Web API virker som et veldig spennende initativ fra Microsoft for å gjøre utvikling av REST-baserte tjenester enklere, men er per nå kun i preview 4.
OpenRasta på sin side har vært i utviklingen side 2008, og for meg så virker det som et mer modent og stabilt rammeverk.
by Israr Khan
19. april 2011 16:03
Ok - etter litt jobbytte, nye impulser fra MIX og ansvar for en ny løsning går jeg i gang med enda et nytt prosjekt!
De neste innleggene mine kommer nok til å handle mye om følgende tema:
Rest, Json, API, ACS, Azure, Odata og t.o.m Sharepoint!
Men bare det å starte med testinga, lese seg opp på gode tutorial o.s.v kan ta tid, så rett før jeg var på vei til å gi meg fant jeg en som kan være verdt å dele:
http://msdn.microsoft.com/en-us/magazine/gg490345.aspx
by Israr Khan
9. mars 2011 13:29
Aldri har en datatype gitt meg mer hodebry enn "Decimal" i C#... Formatering, tusentall-skille, desimalskille, kulturforskjeller o.s.v....Alt fra enkle operasjoner til mer komplekse operasjoner møter _alltid_ et eller annet hinder.
For å gjøre ting litt lettere for andre : Skal du bestemme antall desimaler som skal returneres er den enkleste måten følgende:
var value = 15m;
var numerOfDecimals = 6;
var valueInString = value .ToString("N"+ numerOfDecimals );
Noe som vil gi deg 15.000000 :)
Enjoy!
by Israr Khan
17. februar 2011 22:06
Da er Trafikken 0.9.2 ute på utviklertesting!
Trafikken 0.9.2
- Hvis tid fra rutetabellen vises(altså ikke sanntid), vises tid med "ca." foran.
- Applikasjonen viser nå riktig nummer/navn på linje(i visse tilfeller ble det vist feil)
- Fjernet application-bar fra hovedvinduet(sist brukte - i nærheten - steder - søk) da den bare var i veien. Når jeg gir denne ut på MP så må den desverre komme tilbake for å få godkjent appen.
Trafikken 0.9 Changelog:
- Nytt skjermbilde som viser de ti sist brukte stedene dine
- Tatt bort negative verdier på forsinkelser
- Progressbar som viser info om nedlasting på sanntidsskjermbilde
- Tatt tilbake scrolling på bakgrunnsbildet i panoramaview.
- Diverse bugfiks .
Sjekk ut http://www.kodeverk.net/page/Trafikken.aspx
by Israr Khan
16. februar 2011 23:50
Har tidligere skrevet litt om konsumering av REST-baserte tjenester i C#, men biblioteket RestSharp har virkelig forneklet ting!
RestSharp is a simple, open source REST client for .NET designed primarily for consuming third-party HTTP APIs.
Har blant annet brukt dette biblioteket i Trafikken - og anbefaler alle som skal utføre kall mot REST-tjenester å se på biblioteket.
http://restsharp.org/
by Israr Khan
30. desember 2010 11:24
Av og til skal det være ganske vanskelige å finne noe fornuftig på nettet - selv med Google ;)
Skal du konsumere rest-baserte tjenester i .Net - kan du enten utføre HTTP-Request direkte mot tjenestene med accept json(e.l.) - eller gjøre det det på følgende måte(noe som jeg synes blir mye bedre):
WebChannelFactory<IBookmarkService> cf = new WebChannelFactory<IBookmarkService>(
new Uri("http://localhost:55555/BookmarkService.svc"));
IBookmarkService channel = cf.CreateChannel();
Bookmarks bms = channel.GetPublicBookmarks("WCF");
foreach (Bookmark bm in bms)
Console.WriteLine("{0}\r\n{1}", bm.Title, bm.Url);
For å kunne konsumere REST-tjenester på denne måten blir du nødt til å opprette et interface selv på klientsiden, noe som i mange tilfeller kan være verdt innsatsen.
Hele oppskriften finner du på "A Guide to Designing and Building RESTful Web Services with WCF 3.5" under "Consuming RESTful Services with WCF"
http://msdn.microsoft.com/en-us/library/dd203052.aspx , A Guide to Designing and Building RESTful Web Services with WCF 3.5.
Les mer på:
http://blogs.msdn.com/b/pedram/archive/2008/04/21/how-to-consume-rest-services-with-wcf.aspx
http://blogs.msdn.com/b/kaevans/archive/2008/07/26/creating-a-rest-twitter-client-with-wcf.aspx
by Israr Khan
22. desember 2010 11:20
Testet ut EF4, Poco og WCF? Fått en feilmelding av følgende type:
Receivera:InternalServiceFaultCannot serialize parameter of type 'System.Data.Entity.DynamicProxies.FOO' (for operation 'GetFoo', contract 'FooService') because it is not the exact type 'Model.Foo' in the method signature and is not in the known types collection. In order to serialize the parameter, add the type to the known types collection for the operation using ServiceKnownTypeAttribute
Lagt merke til at objektene som er virtuelle blir definert som Proxy-Typer? Dette betyr at selv om basen består av ditt POCO-objekt, vil det under runtime bli generert et dynamicProxy-object, som ikke gjenspeiler ditt objekt direkte(men det gjør det indirekte som følge av at basen består av ditt poco-object). Dette skaper problemer når du skal serialisere disse objektene ut i pipen, hente ut attributter, kjøre reflection og siden proxy-typene heller ikke er known types, må disse behandles korrekt, enten ved å opprette en egen DataContractResolver, eller ved å skru av ProxyCreation.
Så perfekt - burde vært enkelt? Tja: Sjekk ut release notes for CTP5:
DbContext.ObjectContext has moved:
Rather than being a protected member we have made the underlying ObjectContext available via an explicitly implemented interface, this allows external components to make use of the underlying context. Getting the context now looks like: ((IObjectContextAdapter)myContext).ObjectContext
Så DbContext har ingen direkte property hetende ObjectContext. Så bruk ((IObjectContextAdapter)myContext).ObjectContext for å få tilgang til ObjectContext-en for å skru av ProxyCreation.
Sjekk ut:
http://msdn.microsoft.com/en-us/library/ee705457.aspx, Walkthrough: Serialize POCO Proxies with WCF
http://msdn.microsoft.com/en-us/library/dd456853.aspx , Working with POCO Entities.
http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-released.aspx , Release notes for CTP5
by Israr Khan
22. desember 2010 10:28
Feilsøking av WCF-tjenester kan være både en fryd - og pest og plage! Jeg skal ikke gå inn på hvordan du går frem for å få med exceptions details med "vanlig" WCF (hint: Se lenker) - men når du ikke har de nødvendige elementene (I dette tilfellet "Services" i config-filen) - kan en lure på hvordan dette gjøres.
Hvis tjenesten din kaster en exception eller tryner i WCF rammeverket - vil du kun få ut :
Request Error
The server encountered an error processing the request. Please see the service help page for constructing valid requests to the service.
For WCF Rest Template vil en typisk config-fil se slik ut:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<!--
Configure the WCF REST service base address via the global.asax.cs file and the default endpoint
via the attributes on the <standardEndpoint> element below
-->
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
That's it! Så hvor pokker skal du legge inn service behavior for å inkludere exceptions? (En service behavior er tilknyttet en tjeneste - og som du ser her finnes det ingen services)
Det første vi må få lagt inn er faultExceptionEnabled="falseTrue" inn i standardEndpoint for å påse at vi får FaultExceptions ut til klienten.Mer...
by Israr Khan
14. desember 2010 08:56
(Caset nedenfor og klassen er simplifisert for å kun inneholde det mest nødvendige for å forstå hvordan dette løses).
Ofte kommer du opp i situasjoner hvor du har en mange-til-mange relasjon via en hjelpetabell, og ønsker å definere dette manuelt ved hjelp av EF4, CTP5 og POCO.
Gitt du har en hjelpetabell som følger:
ProduktBestillinger
ProduktId - int
BestillingId - int
Type - string
- Må POCO-et ditt se ut som følger:
public class ProduktBestillinger
{
[Key]
[Column(Order=0)]
public int ProduktId { get; set; }
[Key]
[Column(Order = 1)]
public int BestillingId { get; set; }
public string Type { get; set; }
public virtual Produkt Produkt { get; set; } //Frivillig felt for å kunne navigere til produktet.
public virtual Bestilling Bestilling { get; set; } //Frivillig felt for å kunne navigere til bestillingen..
}
Legg merke til at for å få brukt kompositte nøkler med POCO må du markere propertyen for primærnøklene i klassen din med [KEY] samt at du må gi presends til nøklene dine med [Column(Order=X)] (Begge finnes under System.ComponentModel.DataAnnotations. Husk at du må legge til en referanse til System.ComponentModel.DataAnnotations i tillegg til EntityFramework.dll).
Hvis du ikke inkluderer presendens på nøklene dine - vil følgende feilmelding kastes:
Unable to determine composite primary key ordering for type 'Snowball.Model.Campaign.CampaignApp'. Use the ColumnAttribute or the HasKey method to specify an order for composite primary keys.
by Israr Khan
14. desember 2010 08:36
En liten oppfølging til dere som nettopp har tatt i bruk POCO og kjører helt uten designer:
Noen av data annotations-attributtene ligger i selve EntityFramework.dll-en som tilhører CTP5, de resterende data annontation attributtene ligger fortsatt i System. System.ComponentModel.DataAnnotations.dll!
Dette betyr at du må ha en referanse til både og gitt du f.eks. skal manuelt definere [KEY] og en god del andre attributter :)