Friday, October 19, 2007 9:18 PM
PhaniRajuYN
Astoria DataSource Extender
Download Source and Example :
Most of you must have heard about Astoria. Read More about it here , if you haven't already :
Microsoft Codename "Astoria".
The Astoria Team Blog :
It's a "Database in the cloud", your db is hosted on the Web and you access it via REST -style URIs.
I have written a ControlExtender that helps one retrieve data and post data to a db on Astoria using JavaScript.
The Extender encapsulates its own Server-Side handler so that you don't have to write a Server-Side proxy to
avoid Making Cross-Domain Requests from the Client browser.
The way it would work is :
Client Browser =====> Server-Side handler ===> Astoria Servers
When the Client Script tries to download the data from the Astoria Servers, the following process is followed
- Client Script requests a certain page ( dataDownloader.astoria) on the same server as the website with all the Astoria Query related parameters as headers.
- The *.astoria extension is mapped to a handler contained in the Extender Control.
- Once the handler receives the request , it makes the call to the actual Astoria Servers and passes on the error/Data back to the requesting Client .
- The Control notifies any registered event handlers that the Data is now ready for use by the Script
What does the Extender NOT do ?
The Extender does NOT Support the following Scenarios
- Data Manipulation such as POSTING and Editing Data.
- Bind the Returned Data to HTML controls , this would have to be done manually.
Events Supported by the Extender:
| Event Name | Raised When | Event Args | Usage |
| dataReady | When the Data is downloaded and available for use by the client application | EventArgs contains the item( the Control itself) and the Data that the Client application can use | See Example below |
| dataDownloadBegins | When the Data download starts from the Astoria Servers | EventArgs.Empty | See Example below |
| dataDownloadEnds | When the Data download Ends from the Astoria Servers . The Data may/may not be ready for use by the Client Application | EventArgs.Empty | See Example below |
| dataDownloadError | When the Data download from the Astoria Servers results in an error | AstoriaExtenders.DataDownloadErrorEventArgs Contains the Error information | See Example below |
Subscribing to the Events of the Astoria Data Source Extender :
The BehaviorID of the Extender added on the page is : "asBehavior"
//Subscribing to the dataReady event
$find("asBehavior").add_dataReady( dataReadyHandler );
//Subscribing to the dataDownloadBegins event
$find("asBehavior").add_dataDownloadBegins(<functionName>);
//Subscribing to the dataDownloadEnds event
$find("asBehavior").add_dataDownloadEnds(<functionName>);
//Subscribing to the dataDownloadError event
$find("asBehavior").add_dataDownloadError(dwError);
//The dataReady Event handler
function dataReadyHandler(sender,eventArgs) {
alert("The Data returned is :: "+eventArgs.get_data());
}
//The dataDownloadError Event handler
function dwError(sender,eventArgs) {
Sys.Debug.trace("error Code ::"+eventArgs.get_error().ErrorCode);
Sys.Debug.trace("error Message ::"+eventArgs.get_error().ErrorMessage);
}
Attributes Supported by the Extender
| Attribute Name |
Description |
Usage |
Default |
| PageSize |
The Number of Records to show in one page |
See Example below |
5 |
| StartPageIndex |
The Initial page of Data returned |
See Example below |
0 |
| Query |
The Actual Astoria Query to return Data to the Client |
See Example below |
None |
| ExpandRecord |
The Sub-record which has to also expanded along with the parent Rows. |
See Example below |
None |
| DatabaseURI |
The Astoria URI to reach the Database |
See Example below |
None |
| DataFormat |
The Format in which the Client Requires data : json/xml/rdf |
See Example below |
json |
Usage Examples
$find("asBehavior").get_currentPageIndex();
$find("asBehavior").set_currentPageIndex(2);
//Retrieve the Table 'Categories' from the 'NorthWind' Database
$find("asBehavior").set_dbURI("http://astoria.sandbox.live.com/northwind/northwind.rse");
$find("asBehavior").set_query("/Categories");$find("asBehavior").set_dataFormat("json");
$find("asBehavior").set_pageSize(10);
Methods Supported by the Extender
| Method Name |
Description |
Usage |
| DataBind |
Does what it says : it Downloads the data based on the parameters already specified |
See Example Below |
Usage Examples
Bind the data to the client :
$find("asBehavior").DataBind()
Move to a Specific page of data :
//Move to the 3rd page
$find("asBehavior").set_currentPageIndex( 2 );
$find("asBehavior").DataBind();
Move to the Next page
$find("asBehavior").set_currentPageIndex(
$find("asBehavior").get_currentPageIndex() + 1
);
$find("asBehavior").DataBind();
Move to the Previous page
$find("asBehavior").set_currentPageIndex(
$find("asBehavior").get_currentPageIndex() - 1
);
$find("asBehavior").DataBind();
Markup Way of doing the above
<Raj:AstoriaDSExtender runat="server" ID="asbehaviorPnl"
BehaviorID="asBehavior"
TargetControlID="btnAstoria"
DatabaseURI="http://astoria.sandbox.live.com/northwind/northwind.rse"
DataFormat="json" StartPageIndex="0" PageSize="1"
Query="/Categories" ExpandRecord="Products"
OnClientDataDownloadError="dwError"
OnClientDataReady="endDownload"
ErrorPanelId="divContainsErrorInfo" />
Setting up your project to use the Astoria Extender
Web.Config :
1. Register the Handler for the Extender
Add the Below line to the <httpHandlers> Section of your web.config.
<add path="*.astoria" verb="*" type="AstoriaExtenders.AstoriaHandler"/>
2. The Tag Prefix for the Extenders
Add this line to the <controls> Section of the <Pages> Section in web.config
<add tagPrefix="Raj" namespace="AstoriaExtenders" assembly="AstoriaExtenders"/>
3. Set up the proxy so that the Web Server can talk to the Astoria Servers.
<system.net>
<defaultProxy>
<proxy usesystemdefault="False" proxyaddress=http://proxyServerName bypassonlocal="True"/>
</defaultProxy>
</system.net>