I got bored with querying Astoria in the browser and and wanted to see how to use it in an application, so I opened up the sample console app that comes with the bits and started poking around and was astonished at what I saw.
You can create an new WebDataContext based on the Astoria data service.
WebDataContext is like an ObjectContext. Here’s what it exposes:
namespace Microsoft.Astoria.Client
{
public class WebDataContext : IDisposable
{
public WebDataContext(string uri);
public string BaseUri { get; }
public ICredentials Credentials { get; set; }
public void Add(object obj, string entitySet);
public void Attach(object obj, string entityKey, ObjectState state);
public WebDataQuery<T> CreateQuery<T>(string queryString);
public WebDataQuery<T> CreateQuery<T>(string queryString, QueryOption queryOptions);
public void Delete(object obj);
public string[] GetEntitySets();
public void MarkModified(object obj);
public void SaveChanges();
}
}
So, you can create a WebDataContext
WebDataContext ctx = new WebDataContext(“http://localhost:50000/northwind.svc”);
then query it
Category beverages =ctx.CreateQuery<Category>(“/Categories[CategoryName eq ‘Beverages’]”)
.FirstOrDefault();
add a new object to the ObjectContext
Category newcategory = new Category();newcategory.CategoryName = “Sample”;
ctx.Add(newcategory, “Categories”);
And then (this is the part that is sick and I want to rip open the covers and see how they are pulling this off!), call SaveChanges on the context!
ctx.SaveChanges();
Of course, you can update and delete, too.So, I wanted to see what’s going on here. It’s REALLY important to understand that we’re looking at prototype bits. THe production code that they are working on now will be different, though the concepts and use will be relative to what we can play with today.
You can’t get any hints by adding ?WSDL to the end of the uri. Rembmer withi a default asotira service, there are no operations. It’s all based on interpreting the URI. So I opened up Reflector and pointed to the key assembly.
SaveChanges calls a method called SendHttpEntityUpdate which sends up the object and the key and based on the operation calls a request method. So if you are adding, it sends a POST. If you are deleting, it sends DELETE and if you are modifying it sends PUT. The dll used by the service checks which method you pushed up (there’s an enum for ReceiveEntityOperations) and processes the incoming data accordingly.
Neat!
So of course there will be the usual million concerns about this. There are definitely credentials built into these operations and all kinds of ways to limit what is available thorugh the web service. And there’s so much I don’t know yet, so don’t judge solely on what you are seeing here.
If you don’t have a .NET Astoria client, you can just construct the POST, PUT and DELETE URIs. I can’t say how to do that quite yet though. 😉 (Not that it’s a secret. I just don’t know how yet.)
But it’s still darned cool. Nice job folks (and don’t forget Alex who was key in getting Astoria going before he left Microsoft! )
Sign up for my newsletter so you don't miss my conference & Pluralsight course announcements!