<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ON Blog &#187; ASP.NET MVC</title>
	<atom:link href="http://onishimura.com/category/aspnet-mvc/feed/" rel="self" type="application/rss+xml" />
	<link>http://onishimura.com</link>
	<description></description>
	<lastBuildDate>Sat, 21 May 2011 17:23:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Facebook, C# and ASP.NET MVC &#8211; Updated code samples for places, wall and offline access</title>
		<link>http://onishimura.com/2010/11/15/facebook-c-and-asp-net-mvc-updated-code-samples-for-places-wall-offline-access/</link>
		<comments>http://onishimura.com/2010/11/15/facebook-c-and-asp-net-mvc-updated-code-samples-for-places-wall-offline-access/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 22:09:51 +0000</pubDate>
		<dc:creator>onishimura</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://onishimura.com/?p=230</guid>
		<description><![CDATA[The big news a couple of weeks ago was the opening up of the Facebook Places API and launching a Deals Service as well. The Places API is pretty straightforward [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fonishimura.com%2F2010%2F11%2F15%2Ffacebook-c-and-asp-net-mvc-updated-code-samples-for-places-wall-offline-access%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fonishimura.com%2F2010%2F11%2F15%2Ffacebook-c-and-asp-net-mvc-updated-code-samples-for-places-wall-offline-access%2F&amp;style=normal&amp;service=bit.ly&amp;service_api=R_354251666833c9af8376ce38ad1460f1&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>
The big news a couple of weeks ago was the <a href='http://techcrunch.com/2010/11/03/facebook-gives-developers-access-to-full-set-of-places-apis/'>opening up</a> of the <a href='http://blog.facebook.com/blog.php?post=418175202130'>Facebook Places</a> API and launching a <a href='http://www.facebook.com/blog.php?post=446183422130'>Deals</a> Service as well. The Places API is pretty straightforward to work with so I&#8217;ve updated the Sample MVC App to show an example of calling it, specifically getting a user&#8217;s checkins and search for places given a search term, latitude and longitude, and distance. I&#8217;ve also had a few requests to show a few other calls, so I&#8217;ve included a sample for displaying a user&#8217;s wall (feed) and how to use offline_access to retrieve a user&#8217;s wall even when they aren&#8217;t logged in. Additionally, I&#8217;ve refactored some of the code a bit to be a little cleaner, but I&#8217;ve only written samples using the official C# SDk (I assume thats what everyone&#8217;s using at this point).
</p>
<p><span id="more-230"></span></p>
<p><h3>Setting the proper extended permissions</h3>
<p>We&#8217;re going to be using two new <a href='http://developers.facebook.com/docs/authentication/permissions'>extended permissions</a> here, checkins and offline_access, so the first change we need to make is in Home/Index.aspx. </p>
<pre class="brush: xml; title: ; notranslate">
	&lt;fb:login-button autologoutlink='true' onlogin='window.location.reload()'
	perms='read_stream, publish_stream, read_friendlists, user_activities,
	user_checkins, offline_access'&gt;&lt;/fb:login-button&gt;
</pre>
<p>The first time you log in after making these changes you should get prompted with a confirmation dialog from facebook.<br />
<img src='http://onishimura.s3.amazonaws.com/fb-extended.png' alt='Extended permissions: Offline Access and Checkins' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px' />
</p>
<p><h3>Places and checkins</h3>
<p>The code to get a user&#8217;s checkins unsurprisingly makes a call to the <a href='http://developers.facebook.com/docs/reference/api/checkin'>Facebook Checkin service</a></p>
<pre class="brush: csharp; title: ; notranslate">
	public ActionResult GetCheckins()
	{
		JSONObject checkins = helper.Get(&quot;/me/checkins&quot;);
		if (checkins != null)
		{
			var data = checkins.Dictionary[&quot;data&quot;];
			List&lt;JSONObject&gt; checkinData = data.Array.ToList&lt;JSONObject&gt;();
			ViewData[&quot;Checkins&quot;] = checkinData;
		}

		ViewData[&quot;Name&quot;] = Session[Constants.FacebookNameKey];
		ViewData[&quot;isConnected&quot;] = helper.IsConnected;

		return View(&quot;Index&quot;);
	}
</pre>
<p>The structure of the returned data is as follows:</p>
<pre class="brush: plain; title: ; notranslate">
{
   &quot;data&quot;: [
      {
         &quot;id&quot;: &quot;CheckinID&quot;,
         &quot;from&quot;: {
            &quot;name&quot;: &quot;UserName&quot;,
            &quot;id&quot;: &quot;UserId&quot;
         },
         &quot;place&quot;: {
            &quot;id&quot;: &quot;PlaceId&quot;,
            &quot;name&quot;: &quot;Giants World Series Victory Parade Route&quot;,
            &quot;location&quot;: {
               &quot;latitude&quot;: 37.78627395,
               &quot;longitude&quot;: -122.40441083333
            }
         },
         &quot;application&quot;: null,
         &quot;created_time&quot;: &quot;2010-11-03T19:45:31+0000&quot;
      }
   ]
}
</pre>
<p><img src='http://onishimura.s3.amazonaws.com/fb-checkin.png' alt='Facebook Checkin sample' style='margin-top:20px;margin-bottom:20px' /></p>
<p>Note that the data set returned from a call to the checkins api will be paged. I&#8217;ve only ever checked in once, hence the single item in mu list.</p>
<p>The search call is somewhat different since you need to have 4 parameters set, the query term, the latitude and longitude of the center of the lcoation, and the distance from the center to use (the 5th parameter, &#8216;type&#8217; is just set to &#8216;place&#8217; in the code below). I&#8217;ve provided some sample data (which is just the sample data used in the Facebook example), which can be loaded by pressing the &#8216;Load Test Data&#8217; button. If you want to test a different address and need to find a valid lat/long setting, you can use <a href='http://geocoder.us/'>http://geocoder.us/</a> to convert an address.</p>
<pre class="brush: csharp; title: ; notranslate">
	public ActionResult SearchPlaces(FormCollection form)
	{
		Dictionary&lt;string,string&gt; parameters = new Dictionary&lt;string,string&gt;();
		parameters.Add(&quot;q&quot;, form[&quot;q&quot;]);
		parameters.Add(&quot;center&quot;, String.Format(&quot;{0},{1}&quot;,form[&quot;lat&quot;], form[&quot;long&quot;]));
		parameters.Add(&quot;type&quot;, &quot;place&quot;);
		parameters.Add(&quot;distance&quot;, form[&quot;distance&quot;]);

		JSONObject searchResults = helper.Get(&quot;/search&quot;, parameters);
		if (searchResults != null)
		{
			var data = searchResults.Dictionary[&quot;data&quot;];
			List&lt;JSONObject&gt; places = data.Array.ToList&lt;JSONObject&gt;();
			ViewData[&quot;Places&quot;] = places;
		}

		ViewData[&quot;Name&quot;] = Session[Constants.FacebookNameKey];
		ViewData[&quot;isConnected&quot;] = helper.IsConnected;

		return View(&quot;Index&quot;);
	}
</pre>
<p>Nothing fancy about the returned data either, it&#8217;s pretty similar to the data for the checkin. One thing to note though is that the location item may not have an address associated with it, so you need to account for that when working with the data (the sample just checks for the existence of the &#8216;street&#8217; key in the location array). </p>
<pre class="brush: plain; title: ; notranslate">
{
   &quot;data&quot;: [
      {
         &quot;name&quot;: &quot;Philz Coffee&quot;,
         &quot;category&quot;: &quot;Local business&quot;,
         &quot;location&quot;: {
            &quot;street&quot;: &quot;4023 18th St&quot;,
            &quot;city&quot;: &quot;San Francisco&quot;,
            &quot;state&quot;: &quot;CA&quot;,
            &quot;zip&quot;: &quot;94114-2501&quot;,
            &quot;latitude&quot;: 37.760863,
            &quot;longitude&quot;: -122.433326
         },
         &quot;id&quot;: &quot;151116474914629&quot;
      },
      {
         &quot;name&quot;: &quot;Ritual Coffee Roasters&quot;,
         &quot;category&quot;: &quot;Local business&quot;,
         &quot;location&quot;: {
            &quot;latitude&quot;: 37.75659,
            &quot;longitude&quot;: -122.4211
         },
         &quot;id&quot;: &quot;119185971453428&quot;
      },
	  ...
	 ]
}
</pre>
<p><img src='http://onishimura.s3.amazonaws.com/fb-places.png' alt='Facebook Places search sample' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px' /></p>
<p><h3>Retrieving a user&#8217;s wall</h3>
<p>The previous iteration of the sample including an example on how to post to a user&#8217;s wall, so getting a user&#8217;s wall is a natural corollary. Getting a user&#8217;s feed is accomplished by making a call to &#8216;me/feed&#8217;</p>
<pre class="brush: csharp; title: ; notranslate">
	public ActionResult GetWall()
	{
		JSONObject wallData = helper.Get(&quot;/me/feed&quot;);
		if (wallData != null)
		{
			var data = wallData.Dictionary[&quot;data&quot;];
			List&lt;JSONObject&gt; wallPosts = data.Array.ToList&lt;JSONObject&gt;();
			ViewData[&quot;Wall&quot;] = wallPosts;
		}

		ViewData[&quot;Name&quot;] = Session[Constants.FacebookNameKey];
		ViewData[&quot;isConnected&quot;] = helper.IsConnected;

		return View(&quot;Index&quot;);
	}
</pre>
<p>The returned data can differ depending on the type of the wall post, so when working with the data you just need to check for the presence of the appropriate dictionary keys before trying to use it. For example:</p>
<pre class="brush: xml; title: ; notranslate">
	&lt;%
		foreach (Facebook.JSONObject wallItem in wallPosts)
		{
			string wallItemType = wallItem.Dictionary[&quot;type&quot;].String;
			if (wallItemType == &quot;photo&quot; || wallItemType == &quot;video&quot;)
			{
	%&gt;
		&lt;li&gt;&lt;% if (wallItem.Dictionary.ContainsKey(&quot;name&quot;)) {  %&gt;&lt;%= wallItem.Dictionary[&quot;name&quot;].String%&gt; &lt;% } %&gt; (&lt;%= wallItemType %&gt;) 			&lt;br /&gt; &lt;a href='&lt;%= wallItem.Dictionary[&quot;link&quot;].String %&gt;'&gt;&lt;%= wallItem.Dictionary[&quot;link&quot;].String %&gt;&lt;/a&gt;&lt;/li&gt;
	 &lt;% }
		else if (wallItemType == &quot;status&quot;) {  %&gt;
			&lt;li&gt;&lt;%= wallItem.Dictionary[&quot;from&quot;].Dictionary[&quot;name&quot;].String%&gt; &lt;br /&gt; &lt;%= wallItem.Dictionary[&quot;message&quot;].String%&gt;&lt;/li&gt;
	 &lt;% } %&gt;
</pre>
<p>Note that a picture or video may or may not have a name so you&#8217;ll need to check for that as well.</p>
<p><img src='http://onishimura.s3.amazonaws.com/fb-wall-sample.png' alt='Facebook Wall sample' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px' /></p>
<p><h3>Offline Access</h3>
<p>The offline_access extended permission is pretty cool, it basically extends the life of the access_token you receive after logging in via OAuth. The example I wrote just stores this in a cookie (named FacebookAccessToken) the first time you log in with your account. Normally you&#8217;d want to store this in a database or some other more permanent store.</p>
<pre class="brush: csharp; title: ; notranslate">
	public ActionResult GetOfflineWall()
	{
		if (HttpContext.Request.Cookies[Constants.TokenCookieName] == null ||
			String.IsNullOrEmpty(HttpContext.Request.Cookies[Constants.TokenCookieName].Value))
		{
			return View(&quot;Index&quot;);
		}

		JSONObject wallData = helper.GetWhileOffline(&quot;/me/feed&quot;);
		if (wallData != null)
		{
			var data = wallData.Dictionary[&quot;data&quot;];
			List&lt;JSONObject&gt; wallPosts = data.Array.ToList&lt;JSONObject&gt;();
			ViewData[&quot;OfflineWall&quot;] = wallPosts;
		}

		return View(&quot;Index&quot;);
	}
</pre>
<p>The GetWhileOffline method beind used there just takes the access_token out of the FacebookAccessToken cookie and uses that when instantiating the FacebookAPI object&#8230;(in FacebookHelper.cs)</p>
<pre class="brush: csharp; title: ; notranslate">
	public JSONObject GetWhileOffline(string apiCall)
	{
		JSONObject jsonObject = null;

		if (HttpContext.Current.Request.Cookies[Constants.TokenCookieName] != null ||
			!String.IsNullOrEmpty(HttpContext.Current.Request.Cookies[Constants.TokenCookieName].Value))
		{ 

			string token = HttpContext.Current.Request.Cookies[Constants.TokenCookieName].Value;
			token = HttpUtility.UrlDecode(token);

			Facebook.FacebookAPI api = new Facebook.FacebookAPI(token);
			jsonObject = api.Get(apiCall);
		}

		return jsonObject;
	}
</pre>
<p><img src='http://onishimura.s3.amazonaws.com/fb-offline-wall.png' alt='Facebook Offline Wall Sample' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px' /></p>
<p>Thats really all there is to it, as long as you have the extended permission &#8216;offline_access&#8217; and an access_token that was created when a user logs in after granting this permission, you should be able to make offline calls.</p>
<p><a href='http://onishimura.s3.amazonaws.com/code/FacebookSampleMVC2Appv3.zip'>Download the latest version here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://onishimura.com/2010/11/15/facebook-c-and-asp-net-mvc-updated-code-samples-for-places-wall-offline-access/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Facebook, C# and ASP.NET MVC &#8211; Code samples for friends list, activities list and wall posts</title>
		<link>http://onishimura.com/2010/08/11/facebook-c-and-asp-net-mvc-code-samples-for-friends-list-activities-list-and-wall-posts/</link>
		<comments>http://onishimura.com/2010/08/11/facebook-c-and-asp-net-mvc-code-samples-for-friends-list-activities-list-and-wall-posts/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 09:50:17 +0000</pubDate>
		<dc:creator>onishimura</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[sf]]></category>

		<guid isPermaLink="false">http://onishimura.com/?p=202</guid>
		<description><![CDATA[A few weeks back I wrote about the official C# SDK from Facebook and provided some sample code demonstrating how to use it to get some basic information about the [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fonishimura.com%2F2010%2F08%2F11%2Ffacebook-c-and-asp-net-mvc-code-samples-for-friends-list-activities-list-and-wall-posts%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fonishimura.com%2F2010%2F08%2F11%2Ffacebook-c-and-asp-net-mvc-code-samples-for-friends-list-activities-list-and-wall-posts%2F&amp;style=normal&amp;service=bit.ly&amp;service_api=R_354251666833c9af8376ce38ad1460f1&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>A few weeks back I wrote about the <a href='http://onishimura.com/2010/07/17/official-facebook-c-sdk-released/'>official C# SDK from Facebook</a> and provided some sample code demonstrating how to use it to get some basic information about the logged in user. Admittedly the initial sample asp.net mvc code was fairly simple in order for it to be straight forward and easy to understand. I&#8217;ve decided to expand a bit on the sample in order to demonstrate how to use the Open graph API to perform a few more interesting calls, notably:</p>
<ul>
<li>Post to a user&#8217;s wall</li>
<li>Retrieve a list of the user&#8217;s friends</li>
<li>Retrieve a list of the user&#8217;s activities</li>
</ul>
<p>The <a href='http://onishimura.com/2010/07/17/official-facebook-c-sdk-released/'>original sample code</a> demonstrated how to authenticate a user and make calls using both the official C# sdk and a home grown solution. I&#8217;ve kept that approach but have organized and refactored the samples a bit better to make it hopefully more clear. The new version of the sample code allows you to login/out to facebook only on the home page. Once logged in you can go to the &#8216;Official&#8217; and &#8216;Custom&#8217; tabs to view your friends, activities or to post a message to your wall. While the functionality is the same between the two tabs, the code behind them is different. I assume most people would use the official SDK but I provided an alternative just as a point of interest. OK, I was bored really, and just wanted to see how it could be done differently.</p>
<p><span id="more-202"></span><br />
In any case, the first step before running the code is to make sure you clear any previous permissions granted to this app (or whatever app you will be using with the sample code). The login button on the home page now requests extended permissions so you&#8217;ll probably need to remove it from your list of allowed applications if you&#8217;re running the latest code with a facebook app that was using the original sample code. The actual list of permissions being request are perms=&#8217;read_stream,publish_stream,read_friendlists,user_activities&#8217;, and the full list of permissions available can be found here <a href='http://developers.facebook.com/docs/authentication/permissions'>http://developers.facebook.com/docs/authentication/permissions</a>.</p>
<h4>Official C# SDK </h4>
<p>The code to use the Facebook API can be found in the OfficialFacebookController. By default index view will simply show the name of the logged in user, which uses the same code present in the HomeController (and the original post<)</p>
<pre class="brush: csharp;">
string token = HttpUtility.UrlDecode(fbConnect.AccessToken);
FacebookAPI api = new FacebookAPI(token);
JSONObject me = api.Get(&#8220;/&#8221; + fbConnect.UserID);
ViewData["Name"] = me.Dictionary["name"].String;
</pre>
<p><img src='http://onishimura.s3.amazonaws.com/fb-official-index.png' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px' /></p>
<p>There are three other actions a logged in user can take here, view their friends list, view their activity list, and post a message to their wall. </p>
<ol style='list-style-type:decimal;margin-left:0;line-height:150%'>
<li>
Clicking the Get Friends button will call the GetFriends action in the controller. The call is simply api.Get("me/friends"), which returns a dictionary with a data key and an array of JSONObjects, representing all of the friends for the user. You could also call it with something like, api.Get("/" + fbConnect.UserID + "/friends"): "me" just uses the currently logged in user. </p>
<pre class="brush: csharp;">
Facebook.FacebookAPI api = new Facebook.FacebookAPI(token);
JSONObject me = api.Get("/" + fbConnect.UserID);
JSONObject friendsData = api.Get("/me/friends");
var data = friendsData.Dictionary["data"];
List&lt;JSONObject&gt; friendsList = data.Array.ToList<JSONObject>();

ViewData["Name"] = me.Dictionary["name"].String;
ViewData["Friends"] = friendsList;
</pre>
<p>The data itself is just the name and facebook id of the user's friends, so the view just loops through the friendsList collection and displays in this format Name - Id</p>
<pre class="brush: xml;">
&lt;%= friend.Dictionary["name"].String %&gt; - &lt;%= friend.Dictionary["id"].String %&gt;
</pre>
<p><img src='http://onishimura.s3.amazonaws.com/fb-official-friends.png' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px'  /></p>
</li>
<li>
Similarly, clicking the Get Activities button will call the GetActivities controller. The code is pretty much the same as the above friends code, but calls api.Get("/me/activities");. The data is also slightly different, since the activity data contains more information (such as category, and create_date). So, the view follows pretty much the same format but displays more fields:</p>
<pre class="brush: xml;wrap-lines:false">
&lt;%= activity.Dictionary["name"].String%&gt; - &lt;%= activity.Dictionary["id"].String%&gt;- &lt;%= activity.Dictionary["category"].String%&gt;- &lt;%= activity.Dictionary["created_time"].String%&gt;
</pre>
<p><img src='http://onishimura.s3.amazonaws.com/fb-official-activities.png' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px'  /></p>
</li>
<li>
Finally, the message section allows the user to enter a message and post it to a user's wall. Entering text and clicking the Post Message button will call the PostMessage action. Instead of calling the Get method of the FacebookAPI class, we call Post:</p>
<pre class="brush: csharp;">
Dictionary<string, string> postArgs = new Dictionary<string, string>();
postArgs["message"] = message;
JSONObject post = api.Post("/" + fbConnect.UserID + "/feed", postArgs);
</pre>
<p><img src='http://onishimura.s3.amazonaws.com/fb-official-messages.png' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px'  /></p>
<p>The post call also returns a JSONObject which contains the id of the new post. Just for verification, we show this in the view.</p>
<p><img src='http://onishimura.s3.amazonaws.com/fb-official-message-sent.png' width='500px' height='259px' style='margin-top:20px;margin-bottom:20px'  /></p>
</li>
</ol>
<h4>Custom C# classes</h4>
<p>The display of the custom code looks pretty much the same as the official sdk, so I won't post any images of the views. The primary classes involved are FacebookConnect.cs, FacebookObjects.cs and OpenGraph.cs. Note that compared to the <a href='http://onishimura.com/2010/07/17/official-facebook-c-sdk-released/'>original sample code</a> I've removed the "DEMO" prefix and added a few more methods to OpenGraph, renamed the DEMOFacebookUser to FacebookObjects, and added objects to FacebookObjects.cs. These serve as the definition for our extra calls</p>
<p>You might also notice in FacebookObjects that the DataContract and DataMember attributes have been removed from FacebookUser. One of the more significant changes is the way in which the Call method in the OpenGraph class works. Initially it was using the DataContractJsonSerializer class, which required you to mark your class and it's properties with DataContract and DataMember attributes. However, this serializer seems to <a href='http://stackoverflow.com/questions/596271/deserialization-problem-with-datacontractjsonserializer'>have</a> <a href='http://blog.dotsmart.net/2008/01/07/wcf-json-serialization-is-flawed/'>some</a> <a href='http://blog.dotsmart.net/2008/01/07/wcf-json-serialization-is-flawed/'>issues</a> parsing certain JSON strings. So instead I've changed the code to use the JavascriptSerializer which seems to work just fine. In fact it's more flexible and seems to take less configuration than DataContractJsonSerializer, which is why it was probably undeprecated (dedeprecated?). In addition to the use of JavascriptSerializer, the Call method also takes an additional parameter to specify the type of http request made. This allows us to use the same code to make a POST request, which is necessary when writing to a user's wall. The new Call method looks like this:</p>
<pre class="brush: csharp;">
private T Call&lt;T&gt;(string url, string methodType) where T : class
{
	T result;
	HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
	request.Method = methodType;

	using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
	using (StreamReader reader = new StreamReader(response.GetResponseStream()))
	{
		JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
		string jsonData = reader.ReadToEnd();
		result = (T)jsSerializer.Deserialize&lt;T&gt;(jsonData);
	}

	return result;
}
</pre>
<p>The various Get/Post methods in the OpenGraph class are pretty similar to the original GetCurrentUser method and rely on the objects defined in the FacebookObjects.cs file. For example, the GetCurrentUserFriends looks like the following:</p>
<pre class="brush: csharp;">
public List&lt;FacebookFriend&gt; GetCurrentUserFriends(string accessToken)
{
	string parameters = "me/friends?access_token=" + accessToken;
	string url = baseUrl + parameters;

	FacebookFriendData call = Call&lt;FacebookFriendData&gt;(url, GET);

	return call.Data;
}
</pre>
<p>The action just needs to call this method with a valid access_token. For example, the GetFriends action in CustomFacebookController, calls the following:</p>
<pre class="brush: csharp;">
List&lt;FacebookFriend&gt; friends =  openGraph.GetCurrentUserFriends(fbConnect.AccessToken);
</pre>
<p>Once this has been placed into the ViewData dictionary, we can just pull it out and iterate through it like so:</p>
<pre class="brush: xml; wrap-lines:false">
&lt;%
	List&lt;FacebookSampleMVC2App.FacebookFriend&gt; friendsList = ViewData["Friends"] as List&lt;FacebookSampleMVC2App.FacebookFriend&gt;;
	foreach(FacebookSampleMVC2App.FacebookFriend friend in friendsList) {
%&gt;
	&lt;%= friend.Name %&gt; - &lt;%= friend.Id %&gt;&lt;br /&gt;
&lt;%  } %&gt;
</pre>
<p>The logic/view for retrieving the user's activities and posting to the user's wall are fairly similar.</p>
<h4>Wrap up</h4>
<p>So there you have it, some sample code to do a bit more than just display the user's name and facebook id. The custom classes and the official sdk are pretty similar in the sense that they both just call REST methods like 'me/friends', 'me/activities' and 'me/feed' from https://graph.facebook.com/. The official SDK is more flexible however, since it doesn't need to have classes defined for each of the types, instead relying on JSONObject to wrap the dictionaries/arrays/scalars returned from the api calls. </p>
<p><a href='http://onishimura.s3.amazonaws.com/code/FacebookSampleMVC2Appv2.zip'>Download the code here</a></p>
<p><h3>Update - 11/15/2010</h3>
<p>I recently updated the sample project with more samples, which can be viewed here: <a href='http://onishimura.com/2010/11/15/facebook-c-and-asp-net-mvc-updated-code-samples-for-places-wall-offline-access/'>http://onishimura.com/2010/11/15/facebook-c-and-asp-net-mvc-updated-code-samples-for-places-wall-offline-access/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://onishimura.com/2010/08/11/facebook-c-and-asp-net-mvc-code-samples-for-friends-list-activities-list-and-wall-posts/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Official Facebook C# SDK Released</title>
		<link>http://onishimura.com/2010/07/17/official-facebook-c-sdk-released/</link>
		<comments>http://onishimura.com/2010/07/17/official-facebook-c-sdk-released/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 05:53:11 +0000</pubDate>
		<dc:creator>onishimura</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://onishimura.com/?p=109</guid>
		<description><![CDATA[Looks like a brand new SDK to play with for facebook. While they have other sdks for python, php, javascript, etc, this is their first official C# SDK. Previously the [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fonishimura.com%2F2010%2F07%2F17%2Fofficial-facebook-c-sdk-released%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fonishimura.com%2F2010%2F07%2F17%2Fofficial-facebook-c-sdk-released%2F&amp;style=normal&amp;service=bit.ly&amp;service_api=R_354251666833c9af8376ce38ad1460f1&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Looks like a <a href='http://developers.facebook.com/blog/post/395'>brand new SDK</a> to play with for facebook. While they have other sdks for python, php, javascript, etc, this is their first official C# SDK. Previously the primary SDK that was available was the <a href='http://facebooktoolkit.codeplex.com/'>Facebook Developers Toolkit</a>, which hasn&#8217;t been updated in some time (and hasn&#8217;t been updated to support the open graph api as far as I can tell).</p>
<p>You can grab the code from github at <a href='http://github.com/facebook/csharp-sdk'>http://github.com/facebook/csharp-sdk</a>. </p>
<p><span id="more-109"></span><br />
One interesting thing to note, the current alpha build doesn&#8217;t provide a method to get an access token for the current user. The access token allows you to perform authorized requests on behalf of a user, and can be obtained via a redirect from Facebook, after the user has authenticated themselves. Without that token you can only access public data for a given user. The code is fairly simple in that case (this is taken directly from the console sample application on github):</p>
<pre style="border: 1px solid #888; background-color: #ddf; width: 95%; overflow: scroll; height: 115px; padding: 5px;">
string token = null;
Facebook.FacebookAPI api = new Facebook.FacebookAPI(token);
JSONObject me = api.Get("/4");
Console.WriteLine(me.Dictionary["name"].String);
</pre>
<p>Essentially, when you pass in a null token you can only access a user&#8217;s public data by passing in the user&#8217;s Facebook ID. 4 is apparently Mark Zuckerberg&#8217;s FB ID, makes me wonder who the <a href='http://en.wikipedia.org/wiki/Eduardo_Saverin'>first</a> <a href='http://en.wikipedia.org/wiki/Dustin_Moskovitz'>three</a> <a href='http://en.wikipedia.org/wiki/Chris_Hughes_(Facebook)'>were</a>.</p>
<p>In any case, the lack of a way to obtain a user&#8217;s access_token makes sense since the SDK is meant to be used in multiple types of apps. This sounds like an opportunity to write some code, YAY! I&#8217;ve actually already detailed some of this <a href='http://onishimura.com/2010/06/07/converting-a-facebook-connect-site-to-open-graph-step-by-step/'>previously</a>. </p>
<p>Retrieving the access_token is pretty straightforward, since it&#8217;s available in a cookie that the user gets after authenticating. The name of this cookie is fbs_[AppID], where [AppID] is whatever <a href='http://www.facebook.com/developers/'>application id facebook assigned to you</a>. I&#8217;ve created a sample ASP.NET MVC 2 application that demonstrates this. It uses a simple wrapper class (FacebookConnect) to pull out the access_token for the currently logged in user, available as a property. Once you have the access_token you can then make authorized requests for the user:</p>
<pre style="border: 1px solid #888; background-color: #ddf; width: 95%; overflow: scroll; height: 115px; padding: 5px;">
FacebookConnect fbConnect = new FacebookConnect();
if (fbConnect.IsConnected)
{
    Facebook.FacebookAPI api = new Facebook.FacebookAPI(fbConnect.AccessToken);
    JSONObject me = api.Get("/" + fbConnect.UserID);
    name = me.Dictionary["name"].String;
}
</pre>
<p>I did run into an issue when setting the access_token on the FacebookAPI object. When the url is constructed it passes the Dictionary to an EncodeDictionary method (line 205 in FacebookAPI.cs), which encodes the key-value pairs using the HttpUtility.UrlEncode method. This caused problems when making calls to the graph, specifically an OAuthException : Invalid OAuth access token. Calls typically look like the following url (note that I&#8217;ve personally tweaked these urls so they wont actually work now, I&#8217;ve listed them just to demonstrate the issue):</p>
<p>https://graph.facebook.com/727440495?access_token=132568260112276|2.Z_FaL6rzoNMt2D3jfnEaWP__.3600.1279345500-727440495|77SIciuK333BmipPho0EIdJ8bwl.</p>
<p>or, after encoding</p>
<p>https://graph.facebook.com/727440495?access_token=132568260112276%7C2.Z_FaL6rzoNMt2D3jfnEaWP__.3600.1279345500-727440495%7C77SIciuK333BmipPho0EIdJ8bwl.</p>
<p>After the call to the EncodeDictionary method the url looks like this:</p>
<p>https://graph.facebook.com/727440495?access_token=132568260112276%257C2.Z_FaL6rzoNMt2D3jfnEaWP__.3600.1279345500-727440495%257C77SIciuK333BmipPho0EIdJ8bwl.</p>
<p>The pipe character in the original url is being double encoded to %257C. So when you try calling this url you get this returned:</p>
<pre style="border: 1px solid #888; background-color: #ddf; width: 95%; overflow: scroll; height: 115px; padding: 5px;">
{
   "error": {
      "type": "OAuthException",
      "message": "Invalid OAuth access token."
   }
}
</pre>
<p>The web exception thrown in the project is slightly more vague &#8220;The remote server returned an error: (400) Bad Request.&#8221;</p>
<p>For the time being I&#8217;ve just modified the FacebookAPI.cs class in the project to check for &#8220;access_token&#8221;, and skip encoding if an access token is passed in, though I guess another solution could be to just make sure you UrlDecode any access token you pass into the constructor:</p>
<pre style="border: 1px solid #888; background-color: #ddf; width: 95%; overflow: scroll; height: 115px; padding: 5px;">
if (kvp.Key.ToLower() == "access_token")
{
	sb.Append(kvp.Value);
}
else
{
	sb.Append(HttpUtility.UrlEncode(kvp.Value));
}
</pre>
<p>A couple of other things to note:<br />
1. This is a MVC 2 web app, in Visual Studio 2010<br />
2. You need to set your app id in the web.config file<br />
3. I&#8217;ve also included two classes that I&#8217;ve used on previous projects to make calls to the open graph api, DEMOOpenGraph and DEMOFacebookUser. These use a DataContract and the DataContractJsonSerializer class to populate a strongly typed object. Below is some sample code showing it&#8217;s use:</p>
<pre style="border: 1px solid #888; background-color: #ddf; width: 95%; overflow: scroll; height: 115px; padding: 5px;">
OpenGraph graph = new OpenGraph();
facebookUser = graph.GetCurrentUser(FacebookConnect.AccessToken);
string firstName = facebookUser.First_Name;
</pre>
<p>This is obviously less flexible than the dictionary that the official API uses<br />
4. You should also set the AppID value in web.config to your own value, I&#8217;ve left my own sample appid in there.</p>
<p><a href='http://onishimura.s3.amazonaws.com/code/FacebookSampleMVC2App.zip'>Download the code here</a></p>
<p><b>UPDATE</b><br />
I&#8217;ve reworked the sample and provided a description for some of the new functionality here </p>
<p><a href='http://onishimura.com/2010/08/11/facebook-c-and-asp-net-mvc-code-samples-for-friends-list-activities-list-and-wall-posts/'>http://onishimura.com/2010/08/11/facebook-c-and-asp-net-mvc-code-samples-for-friends-list-activities-list-and-wall-posts/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://onishimura.com/2010/07/17/official-facebook-c-sdk-released/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

