PageRenderTime 45ms CodeModel.GetById 3ms app.highlight 17ms RepoModel.GetById 1ms app.codeStats 2ms

/src/Amptools/Public/labels/Code.aspx

https://github.com/pvencill/amptools
ASP.NET | 836 lines | 624 code | 212 blank | 0 comment | 73 complexity | f3efa1c7ec556e7d1c7feb6c8fe30079 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1<%@ Page Title="amptools.net" Language="C#" MasterPageFile="~/App/Views/Layouts/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="System.Web.Mvc.ViewPage" %>
  2<asp:Content ID="Content2" ContentPlaceHolderID="Head" runat="server">   
  3       	<link href='/Content/default/css/syntax-highlighter.css' rel="stylesheet" type="text/css" />
  4	<link rel="alternate" type="application/rss+xml" title="amptools.net - RSS" href="http://feeds.feedburner.com/amptoolsnet" />
  5	<link rel="service.post" type="application/atom+xml" title="amptools.net - Atom" href="http://www.blogger.com/feeds/7043853799247804655/posts/default" />
  6	<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.blogger.com/rsd.g?blogID=7043853799247804655" />
  7	<style type="text/css">
  8		@import url("http://www.blogger.com/css/blog_controls.css");
  9		@import url("http://www.blogger.com/dyn-css/authorization.css?targetBlogID=7043853799247804655");
 10	</style>
 11
 12	<script type="text/javascript" src="http://www.blogger.com/js/backlink.js"></script>
 13	<script type="text/javascript" src="http://www.blogger.com/js/backlink_control.js"></script>
 14	<script type="text/javascript">var BL_backlinkURL = "http://www.blogger.com/dyn-js/backlink_count.js";var BL_blogId = "7043853799247804655";</script>
 15</asp:Content>
 16
 17<asp:Content ID="Content3" ContentPlaceHolderID="Javascript" runat="server">
 18		<script type="text/javascript" src="~/javascripts/prototype.js"></script>
 19		<script type="text/javascript" src="~/javascripts/syntax-highlighter/shCore.js"></script>
 20		<script type="text/javascript" src="~/javascripts/syntax-highlighter/shBrushCSharp.js"></script>
 21		<script type="text/javascript" src="~/javascripts/syntax-highlighter/shBrushRuby.js"></script>
 22		<script type="text/javascript" src="~/javascripts/syntax-highlighter/shBrushJScript.js"></script>
 23		<script type="text/javascript" src="~/javascripts/syntax-highlighter/shBrushCss.js"></script>
 24		<script type="text/javascript" src="~/javascripts/syntax-highlighter/shBrushSql.js"></script>
 25		<script type="text/javascript" src="~/javascripts/syntax-highlighter/shBrushXml.js"></script>
 26		<script type="text/javascript">
 27			//<[CDATA[
 28			dp.SyntaxHighlighter.HighlightAll('code'); 
 29			//]]>
 30		</script>
 31</asp:Content>
 32<asp:Content ID="Content1" ContentPlaceHolderID="main" runat="server">
 33      
 34	
 35		<div class="left">
 36 			<h2 class="silver">
 37				&quot;Working on the complexity that is always indirectly implied by simpilicity.&quot;
 38			</h2>
 39		
 40
 41                  
 42			<h2 class="blog-title"><a name="1099928894407582088"></a>
 43				
 44				 Simple Log in Amplify 
 45				
 46				<span class="blog-byline">
 47				by: michael herndon, at: 11/02/2008 11:54:00 PM
 48				</span>
 49				
 50			 </h2>
 51			 <div class="blog-content">
 52				<p>As many people know rails has a simple logger inside the framework which really only outputs to the console. This comes in handy to see SQL output of your models, benchmarks and other cool little things inside the rails framework.&#160; </p>  <p>Of course people in the .Net realm tend to want things that scale and yet simplified for them.&#160; So output only to the console won't fly in larger projects.&#160; There is log4net, but you don't want to have it tightly coupled to the system, this caused an issue to one project that I worked on while still working for <a href="http://www.vivussoftware.com">Vivus Software</a> before I came <a href="http://www.opensourceconnections.com">OSC</a>. Where the framework and project both expected a certain version of Log4Net and there was no wrapper to put something else in place if need be.&#160; </p>   <span id="more-0"></span>    <p>So the solution was to Build small static Log class, that takes a list of an interface ILog (different than log4net's) and then use that interface to build a wrapper around using the root Logger for log4net. This way people can still build their own loggers for amplify or build their own Appenders for Log4Net and amplify will still be able to leverage this. Of course there is also conditional symbol LOG4NET in amplify if you wish to build the amplify framework without any dependency on the log4net library.&#160;&#160; </p>  <p>To me this is more like the Console.WriteLine that is needed for a class library vs what log4net is typically used for in an application where it also spits out the type information of a class. To help with the testing using mock object is the <a href="http://code.google.com/p/moq/" rel="tag">Moq (Mock You)</a> which uses the Lambda expression and gets rid of all that crazy record/playback junk to which I loathe.&#160; </p>   <pre class="code csharp">		public void Test()
 53		{
 54			var id = 0;
 55			Log.Sql(&quot;SELECT * FROM test&quot;);
 56			Log.Debug(&quot;The id is  {0} &quot;, id);
 57		}		
 58
 59
 60		[It(Order = 2), Should(&quot;have a debug method that logs debug statements&quot;)]
 61		public void Debug()
 62		{
 63			var calls = new List&lt;string&gt;();
 64			var log = CreateMockLog();
 65
 66			log.Expect(o =&gt; o.Debug(Moq.It.IsAny&lt;string&gt;(), null))
 67				.Callback((string s, object[] args) =&gt; { calls.Add(s); });
 68
 69			calls.Count.ShouldBe(0);
 70
 71			// simple and easily called from anywhere... and lets you 
 72			// format messages like 
 73			// Log.Debug(&quot;item id: {0} could not be saved&quot;, id);
 74			Log.Debug(&quot;debug&quot;, null);
 75			calls.Count.ShouldBe(1);
 76			calls.Contains(&quot;debug&quot;).ShouldBeTrue();
 77
 78			Log.IsDebug = false;
 79
 80			// its turned off so it won't output anything
 81			Log.Debug(&quot;debug&quot;, null);
 82			calls.Count.ShouldBe(1);
 83
 84			Log.IsDebug = true;
 85		}
 86
 87		private static Mock&lt;ILog&gt; CreateMockLog()
 88		{
 89			var log = new Mock&lt;ILog&gt;();
 90			Log.Loggers.Clear();
 91			Log.Loggers.Add(log.Object);
 92			return log;
 93		}
 94</pre>
 95
 96<p>Though keep in mind, one of the more trickier things to mock is the use of a method with the &quot;params&quot; keyword. I had to used a callback that you pass in an object array (object[] args) and I passed in null, otherwise the callback would not fire, and Lambdas don't allow the &quot;params&quot; keyword. Once that was figured out, I was able to use moq successfully to test the Log class successfully. </p>  <p class="blogger-labels">Labels: <a rel='tag' href="http://www.amptools.net/labels/Amplify.aspx">Amplify</a>, <a rel='tag' href="http://www.amptools.net/labels/BHAG.aspx">BHAG</a>, <a rel='tag' href="http://www.amptools.net/labels/C#.aspx">C#</a>, <a rel='tag' href="http://www.amptools.net/labels/Code.aspx">Code</a>, <a rel='tag' href="http://www.amptools.net/labels/CSharp.aspx">CSharp</a>, <a rel='tag' href="http://www.amptools.net/labels/Mock Objects.aspx">Mock Objects</a>, <a rel='tag' href="http://www.amptools.net/labels/Moq.aspx">Moq</a>, <a rel='tag' href="http://www.amptools.net/labels/Unit Testing.aspx">Unit Testing</a></p>
 97			 </div>
 98			 <div class="blog-footer">
 99				<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=1099928894407582088"location.href=https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=1099928894407582088;><span style="text-transform:lowercase">0 Comments</span></a>
100				
101				<a class="comment-link" href="http://www.amptools.net/2008/11/simple-log-in-amplify.aspx#links"><span style="text-transform:lowercase">Links to this post</span></a>
102				  <span class="item-action"><a href="http://www.blogger.com/email-post.g?blogID=7043853799247804655&postID=1099928894407582088" title="Email Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_email.gif" height="13" width="18"/></a></span>
103				
104				<script type="text/javascript" src="http://w.sharethis.com/widget/?tabs=web%2Cemail&amp;charset=utf-8&amp;services=reddit%2Cdigg%2Cfacebook%2Cmyspace%2Cdelicious%2Cstumbleupon%2Ctechnorati%2Cpropeller%2Cblinklist%2Cmixx%2Cnewsvine%2Cgoogle_bmarks%2Cyahoo_myweb%2Cwindows_live%2Cfurl&amp;style=rotate&amp;publisher=baa2824f-9291-46c0-87b4-6d5a72508a05&amp;headerbg=%23dddddd&amp;inactivebg=%231bb601&amp;inactivefg=%2370eb00%09&amp;linkfg=%231bb601"></script>
105			</div>
106			
107
108                  
109			<h2 class="blog-title"><a name="3448672103322818552"></a>
110				
111				 Gallio and Mb-Unit release v3.0.4
112				
113				<span class="blog-byline">
114				by: michael herndon, at: 10/29/2008 02:11:00 AM
115				</span>
116				
117			 </h2>
118			 <div class="blog-content">
119				<p>You can find many of the new <a href="http://blog.bits-in-motion.com/2008/10/announcing-gallio-and-mbunit-v304.html ">features over at Jeff Brown's blog</a>.&#160; Some of the cooler features of note is the integration with the visual studio testing system, wrapping testing for exceptions into a delegate, and data store called Ambient, in which you can store state for your tests.&#160; I've integrated this into amplify which is again, now on <a href="http://github.com/michaelherndon/amplify/tree/master">GitHub</a>. I did run into a few lil issues when setting this up though....</p> <span id="more-1"></span>    <p>The biggest issue was finding out how to turn a project into a test project in order to get the visual studio integration working for Gallio. Basically you need to make modifications to the .csproj file and add an XML element of &lt;ProjectTypeGuids&gt; into the first &lt;PropertyGroup&gt; of the file.&#160; </p>  <pre class="code xml">&lt;ProjectTypeGuids&gt;{3AC096D0-A1C2-E12C-1390-A8335801FDAB};
120{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 
121&lt;/ProjectTypeGuids&gt;</pre>
122
123<p>After this, I could get the Gallio tests showing up in visual studio. </p>
124
125<p><a href="http://lh3.ggpht.com/amptools/SQf-bZnOv5I/AAAAAAAAABM/xPj4ncLlA3g/s1600-h/Gallio-Test-View%5B2%5D.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="212" alt="Gallio-Test-View" src="http://lh3.ggpht.com/amptools/SQf-b1n8cMI/AAAAAAAAABU/f0_tzJSs_Lg/Gallio-Test-View_thumb.png?imgmax=800" width="244" border="0" /></a> </p>
126
127<p>Now this coupled with <a href="http://testdriven.net/" rel="tag">Test Driven .Net</a> really helps with the testing process especially since with certain versions of Visual Studio, Test Driven .Net will let you run visual studio's code coverage with Gallio. </p>
128
129<p><a href="http://lh6.ggpht.com/amptools/SQf-cYepypI/AAAAAAAAABY/2DfBfKGZbZY/s1600-h/CodeCoverage%5B2%5D.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="207" alt="CodeCoverage" src="http://lh5.ggpht.com/amptools/SQf-cwXSDSI/AAAAAAAAABc/i2MQj8jhAQU/CodeCoverage_thumb.png?imgmax=800" width="244" border="0" /></a> </p>
130
131<p>Again, one of the cooler features was the improvements to Mb-Unit's Asserts (which did change the API, but its all good, cause I wrap the Asserts that I use in BDD style mixin Methods, so I just need to change them in one place). The one really change of note would be adding Assert.Throw and Assert.Throw&lt;T&gt;, to which you can wrap throwing an exception into a delegate.</p>
132
133<p><a href="http://lh6.ggpht.com/amptools/SQf-di2keqI/AAAAAAAAABg/KCLE5wy_nU4/s1600-h/WrappingExceptions%5B2%5D.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="178" alt="WrappingExceptions" src="http://lh3.ggpht.com/amptools/SQf-eB-bggI/AAAAAAAAABk/Tl816nR7vkw/WrappingExceptions_thumb.png?imgmax=800" width="244" border="0" /></a> </p>
134
135<p>All in all nice improvements to both Gallio and Mb-Unit, which are now incorporated into amplify. </p>  <p class="blogger-labels">Labels: <a rel='tag' href="http://www.amptools.net/labels/Amplify.aspx">Amplify</a>, <a rel='tag' href="http://www.amptools.net/labels/BDD.aspx">BDD</a>, <a rel='tag' href="http://www.amptools.net/labels/BHAG.aspx">BHAG</a>, <a rel='tag' href="http://www.amptools.net/labels/C#.aspx">C#</a>, <a rel='tag' href="http://www.amptools.net/labels/Code.aspx">Code</a>, <a rel='tag' href="http://www.amptools.net/labels/CSharp.aspx">CSharp</a>, <a rel='tag' href="http://www.amptools.net/labels/Gallio.aspx">Gallio</a>, <a rel='tag' href="http://www.amptools.net/labels/Mb-Unit.aspx">Mb-Unit</a>, <a rel='tag' href="http://www.amptools.net/labels/Mixins.aspx">Mixins</a>, <a rel='tag' href="http://www.amptools.net/labels/Unit Testing.aspx">Unit Testing</a></p>
136			 </div>
137			 <div class="blog-footer">
138				<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=3448672103322818552"location.href=https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=3448672103322818552;><span style="text-transform:lowercase">0 Comments</span></a>
139				
140				<a class="comment-link" href="http://www.amptools.net/2008/10/gallio-and-mb-unit-release-v304.aspx#links"><span style="text-transform:lowercase">Links to this post</span></a>
141				  <span class="item-action"><a href="http://www.blogger.com/email-post.g?blogID=7043853799247804655&postID=3448672103322818552" title="Email Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_email.gif" height="13" width="18"/></a></span>
142				
143				<script type="text/javascript" src="http://w.sharethis.com/widget/?tabs=web%2Cemail&amp;charset=utf-8&amp;services=reddit%2Cdigg%2Cfacebook%2Cmyspace%2Cdelicious%2Cstumbleupon%2Ctechnorati%2Cpropeller%2Cblinklist%2Cmixx%2Cnewsvine%2Cgoogle_bmarks%2Cyahoo_myweb%2Cwindows_live%2Cfurl&amp;style=rotate&amp;publisher=baa2824f-9291-46c0-87b4-6d5a72508a05&amp;headerbg=%23dddddd&amp;inactivebg=%231bb601&amp;inactivefg=%2370eb00%09&amp;linkfg=%231bb601"></script>
144			</div>
145			
146
147                  
148			<h2 class="blog-title"><a name="1045031666772907229"></a>
149				
150				 Getting the |DataDirectory| folder in C sharp
151				
152				<span class="blog-byline">
153				by: michael herndon, at: 8/14/2008 02:19:00 PM
154				</span>
155				
156			 </h2>
157			 <div class="blog-content">
158				<p>One of the cool things about sql server express's connection strings is the ability to relatively path database files for sql express databases. Often one might see something in the connection string that looks like " AttachDbFilename=|DataDirectory|\file.mdf ".  The pipes and DataDirectory is parsed to equate to a relative data directory file path that changes depending on the application type (i.e. an application deployed by click once, vs an application that is installed to a folder). </p>  
159
160<p>However sometimes you might want to know where that data directory is, like in my case, I want to take a look at a connection string and attempt to create a database based off the connection string in order to speed up development using database migrations. This could also come in handy deploying small applications. </p>  
161
162<p>So after some research via google, I found <a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=702378&amp;SiteID=1">this gem on msdn about where the DataDirectory is</a>, though not guaranteed to be accurate. It basically follows 3 simple hierarchal rules.  If the AppDomain.SetData method has been used, then the directory is set there. Otherwise if the application is a click once application the data directory is set or its in the application root folder.  </p>  <p>So below is what the code might possibly look like in order to get the applications data directory no matter what type of application it is and it gives you ability to set the DataDirectory as well.  </p>  <p></p> 
163
164<pre class="code csharp">namespace Amplify
165{
166 using System;
167 using System.Configuration;
168 using System.Collections.Generic;
169 using System.Collections.Specialized;
170 using System.Deployment;
171 using System.Deployment.Application;
172 using System.IO;
173 using System.Text;
174 using System.Reflection;
175 using System.Web;
176
177 public class ApplicationContext {
178
179  private static NameValueContext s_properties;
180
181
182  public static bool IsWebsite { get; internal set; }
183
184  static ApplicationContext()
185  {
186   IsWebsite = (System.Web.HttpContext.Current != null);
187   
188  }
189
190  public static string DataDirectory
191  {
192   get
193   {
194    string dataDirectory = GetProperty("DataDirectory") as string;
195
196    if (string.IsNullOrEmpty(dataDirectory))
197    {
198     dataDirectory = AppDomain
199      .CurrentDomain.GetData("DataDirectory") as string;
200
201     if (dataDirectory == null)
202     {
203      if (ApplicationDeployment.IsNetworkDeployed)
204       dataDirectory = ApplicationDeployment
205        .CurrentDeployment.DataDirectory;
206      else
207       dataDirectory = Path.GetDirectoryName(
208        Assembly.GetExecutingAssembly()
209         .GetName().CodeBase);
210     }
211     dataDirectory = dataDirectory.Replace(@"file:\", "");
212     SetProperty("DataDirectory", dataDirectory);
213    }
214    return dataDirectory;
215   }
216   set
217   {
218    string dataDirectory = GetProperty("DataDirectory") as string;
219    value = value.Replace(@"file:\", value);
220
221    if (!System.IO.Directory.Exists(dataDirectory))
222     System.IO.Directory.CreateDirectory(dataDirectory);
223
224    SetProperty("DataDirectory", value);
225    AppDomain.CurrentDomain.SetData("DataDirectory", value);
226   }
227  }
228
229
230  public static object GetProperty(string propertyName)
231  {
232   if (IsWebsite)
233    return HttpContext.Current.Application[propertyName];
234   else
235    return Context[propertyName];
236  }
237
238  
239  public static void SetProperty(string propertyName, object value)
240  {
241   if (IsWebsite)
242    HttpContext.Current.Application[propertyName] = value;
243   else
244    Context[propertyName] = value;
245  }
246
247  private static NameValueContext Context
248  {
249   get
250   {
251    if (s_properties == null)
252     s_properties = new NameValueContext();
253    return s_properties;
254   }
255  }
256 }
257}</pre><p class="blogger-labels">Labels: <a rel='tag' href="http://www.amptools.net/labels/Amplify.aspx">Amplify</a>, <a rel='tag' href="http://www.amptools.net/labels/C#.aspx">C#</a>, <a rel='tag' href="http://www.amptools.net/labels/Code.aspx">Code</a>, <a rel='tag' href="http://www.amptools.net/labels/CSharp.aspx">CSharp</a></p>
258			 </div>
259			 <div class="blog-footer">
260				<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=1045031666772907229"location.href=https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=1045031666772907229;><span style="text-transform:lowercase">0 Comments</span></a>
261				
262				<a class="comment-link" href="http://www.amptools.net/2008/08/getting-datadirectory-folder-in-c-sharp.aspx#links"><span style="text-transform:lowercase">Links to this post</span></a>
263				  <span class="item-action"><a href="http://www.blogger.com/email-post.g?blogID=7043853799247804655&postID=1045031666772907229" title="Email Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_email.gif" height="13" width="18"/></a></span>
264				
265				<script type="text/javascript" src="http://w.sharethis.com/widget/?tabs=web%2Cemail&amp;charset=utf-8&amp;services=reddit%2Cdigg%2Cfacebook%2Cmyspace%2Cdelicious%2Cstumbleupon%2Ctechnorati%2Cpropeller%2Cblinklist%2Cmixx%2Cnewsvine%2Cgoogle_bmarks%2Cyahoo_myweb%2Cwindows_live%2Cfurl&amp;style=rotate&amp;publisher=baa2824f-9291-46c0-87b4-6d5a72508a05&amp;headerbg=%23dddddd&amp;inactivebg=%231bb601&amp;inactivefg=%2370eb00%09&amp;linkfg=%231bb601"></script>
266			</div>
267			
268
269                  
270			<h2 class="blog-title"><a name="5634712196275175580"></a>
271				
272				 Amplify-Fusion, JavaScript libraries compatibility layer
273				
274				<span class="blog-byline">
275				by: michael herndon, at: 8/06/2008 03:35:00 PM
276				</span>
277				
278			 </h2>
279			 <div class="blog-content">
280				<p>As one might start guessing, I tend to jump around languages, projects, and clients (web/windows client not people).&#160; After writing custom code for <a href="http://www.prototypejs.org/" rel="tag">prototype</a>, <a href="http://dojotoolkit.org/" rel="tag">dojo</a>, <a href="http://developer.yahoo.com/yui/" rel="tag">yui</a>, <a href="http://jquery.com/" rel="tag">jquery</a>, <a href="http://www.asp.net/ajax/" rel="tag">atlas (microsoft ajax library)</a> , it becomes a pain to remember which library has what and to port work you've previously done into another library.&#160; Its one thing if it porting code from one language to another, but to have port code cause of the library/framework.... its a pain that isn't needed.&#160; </p>  <p>Granted the downside of writing a compatibility layer is extra code that could be duplicated else where or writing a smaller set of routines that are less in what other full blown libraries. However most people have broadband these days and the browsers have this cool thing called caching. Not to mention YUI has a great compressor and there are ways to include multiple files on the server rather than on the browser.&#160; </p>  <p>So I've begun to embark on a long journey of making JavaScript widgets build on a compatibility layer of different libraries. The layer it self will take some time, testing, and constant refinement while trying to keep the layer small.&#160; However I believe this is needed, esp as a consultant that works on various projects and everyone has their favorite library to use...&#160; </p>  <p>you can find the beginnings of the code at <a title="http://code.google.com/p/amplify-fusion/" href="http://code.google.com/p/amplify-fusion/">http://code.google.com/p/amplify-fusion/</a>.</p>  <p class="blogger-labels">Labels: <a rel='tag' href="http://www.amptools.net/labels/Amplify.aspx">Amplify</a>, <a rel='tag' href="http://www.amptools.net/labels/BHAG.aspx">BHAG</a>, <a rel='tag' href="http://www.amptools.net/labels/Code.aspx">Code</a>, <a rel='tag' href="http://www.amptools.net/labels/Javascript.aspx">Javascript</a></p>
281			 </div>
282			 <div class="blog-footer">
283				<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=5634712196275175580"location.href=https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=5634712196275175580;><span style="text-transform:lowercase">0 Comments</span></a>
284				
285				<a class="comment-link" href="http://www.amptools.net/2008/08/ampliy-fusion-javascript-libraries.aspx#links"><span style="text-transform:lowercase">Links to this post</span></a>
286				  <span class="item-action"><a href="http://www.blogger.com/email-post.g?blogID=7043853799247804655&postID=5634712196275175580" title="Email Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_email.gif" height="13" width="18"/></a></span>
287				
288				<script type="text/javascript" src="http://w.sharethis.com/widget/?tabs=web%2Cemail&amp;charset=utf-8&amp;services=reddit%2Cdigg%2Cfacebook%2Cmyspace%2Cdelicious%2Cstumbleupon%2Ctechnorati%2Cpropeller%2Cblinklist%2Cmixx%2Cnewsvine%2Cgoogle_bmarks%2Cyahoo_myweb%2Cwindows_live%2Cfurl&amp;style=rotate&amp;publisher=baa2824f-9291-46c0-87b4-6d5a72508a05&amp;headerbg=%23dddddd&amp;inactivebg=%231bb601&amp;inactivefg=%2370eb00%09&amp;linkfg=%231bb601"></script>
289			</div>
290			
291
292                  
293			<h2 class="blog-title"><a name="458120713693871790"></a>
294				
295				 Amplify&#39;s WCF Twitter API Client Library v0.2
296				
297				<span class="blog-byline">
298				by: michael herndon, at: 7/28/2008 12:33:00 AM
299				</span>
300				
301			 </h2>
302			 <div class="blog-content">
303				<p>After some playing around with WCF and Flickr, I decided to move everything internally for the twitter library to use WCF with it's <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.aspx">ServiceContract</a>.&#160; It was more of a pain that initially thought it would be. WCF is amazingly customizable but still has a couple of downfalls thanks to REST and people not writing their API for all technologies.&#160; </p>   <p>The biggest issue is that Twitter throws an Http 403 unknown exception when you call a page and something is incorrect in the url.&#160; Well with WCF, it throws a <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.security.messagesecurityexception.aspx">System.ServiceModel.Security.MessageSecurityException</a>, due to the url returning a status code other than 200, and it wraps the inner exceptions inside of that. </p>   <p>I'm sure there is a better way to get around this, but each proxy call is now wrapped by a try/catch in the client class methods in order to check for the <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.security.messagesecurityexception.aspx">MessageSecurityException</a>, then it checks the inner exception and determines if twitter sent back a response error message. If it does the library now throws a twitter exception with error information, otherwise you would only see the WCF exception that would mask the real issue.&#160; </p>   <p>Also I renamed the &quot;Service&quot; classes to &quot;Client&quot; seeing that is the proper term for them.&#160; The tests are now updated as well to reflect the changes.&#160; The tests are a good way of seeing of how to use the library. Last but not least, methods now return arrays instead of lists in order to be more REST friendly. </p>  <p></p>  <pre class="code csharp">using Amplify.Twitter;
304using System.Security;
305
306// ... stuff
307
308public void Test() 
309{
310	try {
311		string temp = &quot;password&quot;;
312	
313		Twitter.SetCredentials(&quot;Username&quot;, temp);
314
315		StatusClient client = Twitter.CreateStatusClient();
316 		// or StatusClient client = new StatusClient(&quot;Username&quot;, temp);
317
318        	Status[] tweets = service.GetUserTimeline();
319	} catch (TwitterException ex) {
320		Log.Write(ex.ToString()); // write the twitter rest error. 
321	}
322
323}</pre>  <p class="blogger-labels">Labels: <a rel='tag' href="http://www.amptools.net/labels/Amplify.aspx">Amplify</a>, <a rel='tag' href="http://www.amptools.net/labels/BHAG.aspx">BHAG</a>, <a rel='tag' href="http://www.amptools.net/labels/C#.aspx">C#</a>, <a rel='tag' href="http://www.amptools.net/labels/Code.aspx">Code</a>, <a rel='tag' href="http://www.amptools.net/labels/CSharp.aspx">CSharp</a>, <a rel='tag' href="http://www.amptools.net/labels/JSON.aspx">JSON</a>, <a rel='tag' href="http://www.amptools.net/labels/REST.aspx">REST</a>, <a rel='tag' href="http://www.amptools.net/labels/Twitter.aspx">Twitter</a>, <a rel='tag' href="http://www.amptools.net/labels/WCF.aspx">WCF</a></p>
324			 </div>
325			 <div class="blog-footer">
326				<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=458120713693871790"location.href=https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=458120713693871790;><span style="text-transform:lowercase">2 Comments</span></a>
327				
328				<a class="comment-link" href="http://www.amptools.net/2008/07/amplify-wcf-twitter-api-client-library.aspx#links"><span style="text-transform:lowercase">Links to this post</span></a>
329				  <span class="item-action"><a href="http://www.blogger.com/email-post.g?blogID=7043853799247804655&postID=458120713693871790" title="Email Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_email.gif" height="13" width="18"/></a></span>
330				
331				<script type="text/javascript" src="http://w.sharethis.com/widget/?tabs=web%2Cemail&amp;charset=utf-8&amp;services=reddit%2Cdigg%2Cfacebook%2Cmyspace%2Cdelicious%2Cstumbleupon%2Ctechnorati%2Cpropeller%2Cblinklist%2Cmixx%2Cnewsvine%2Cgoogle_bmarks%2Cyahoo_myweb%2Cwindows_live%2Cfurl&amp;style=rotate&amp;publisher=baa2824f-9291-46c0-87b4-6d5a72508a05&amp;headerbg=%23dddddd&amp;inactivebg=%231bb601&amp;inactivefg=%2370eb00%09&amp;linkfg=%231bb601"></script>
332			</div>
333			
334
335                  
336			<h2 class="blog-title"><a name="6391037880199004989"></a>
337				
338				 Use C# to determine where and what version of java is installed
339				
340				<span class="blog-byline">
341				by: michael herndon, at: 7/22/2008 08:56:00 AM
342				</span>
343				
344			 </h2>
345			 <div class="blog-content">
346				<p>While writing an MsBuild Task that is calling a jar file, there was a need to find out information on the java runtime on the local machine, otherwise when I do publish the task, the developer would be required to install a specific version of java in a specific location.&#160; That kind of thing just doesn't fly if you're writing on a 64 bit machine due to having dual &quot;Program Files&quot; folders, one for 64 bit programs, the other for x86.&#160; Not only that, it really increases complexity to the end user/developer who might want to use the MsBuild Task. </p>  <p>So after poking around in the registry, I found out there was information about the Java Runtime, including which version is currently the default, and where the file path is. I wrote a singleton class that looks at the registry and grabs that information.&#160; Though usually singleton generally only checks to see if the instance is null and then instantiates it, the code below checks the registry during the &quot;Get&quot; method. </p>  <pre class="code csharp">namespace Amplify.Tasks
347{
348	using System;
349	using System.Collections.Generic;
350	using System.Linq;
351	using System.Text;
352
353	using Microsoft.Win32;
354
355	public class JavaInfo
356	{
357		private static JavaInfo instance = null;
358
359		protected JavaInfo()
360		{
361			this.CurrentVersion = &quot;&quot;;
362			this.Installed = false;
363			this.Path = &quot;&quot;;
364		}
365
366		public string CurrentVersion { get; set; }
367		
368		public bool Installed { get; set; }
369		
370		public string Path { get; set; }
371
372
373		public static JavaInfo Get()
374		{
375			if (instance == null)
376			{
377				RegistryKey key = Registry.LocalMachine;
378				JavaInfo info = new JavaInfo();
379
380				string location = @&quot;Software\JavaSoft\Java Runtime Environment&quot;;
381				RegistryKey environment = key.OpenSubKey(location);
382				if (environment != null)
383				{
384
385					info.Installed = true;
386					object value = environment.GetValue(&quot;CurrentVersion&quot;);
387					if (value != null)
388					{
389						info.CurrentVersion = value.ToString();
390						RegistryKey currentVersion = environment.OpenSubKey(info.CurrentVersion);
391						if (currentVersion != null)
392						{
393							value = currentVersion.GetValue(&quot;JavaHome&quot;);
394
395							if (value != null)
396								info.Path = value.ToString();
397						}
398					}
399				}
400
401				instance = info;
402			}
403
404			return instance;
405		}
406	}
407}</pre>  <p class="blogger-labels">Labels: <a rel='tag' href="http://www.amptools.net/labels/C#.aspx">C#</a>, <a rel='tag' href="http://www.amptools.net/labels/Code.aspx">Code</a>, <a rel='tag' href="http://www.amptools.net/labels/CSharp.aspx">CSharp</a>, <a rel='tag' href="http://www.amptools.net/labels/Java.aspx">Java</a></p>
408			 </div>
409			 <div class="blog-footer">
410				<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=6391037880199004989"location.href=https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=6391037880199004989;><span style="text-transform:lowercase">0 Comments</span></a>
411				
412				<a class="comment-link" href="http://www.amptools.net/2008/07/use-c-to-determine-where-and-what.aspx#links"><span style="text-transform:lowercase">Links to this post</span></a>
413				  <span class="item-action"><a href="http://www.blogger.com/email-post.g?blogID=7043853799247804655&postID=6391037880199004989" title="Email Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_email.gif" height="13" width="18"/></a></span>
414				
415				<script type="text/javascript" src="http://w.sharethis.com/widget/?tabs=web%2Cemail&amp;charset=utf-8&amp;services=reddit%2Cdigg%2Cfacebook%2Cmyspace%2Cdelicious%2Cstumbleupon%2Ctechnorati%2Cpropeller%2Cblinklist%2Cmixx%2Cnewsvine%2Cgoogle_bmarks%2Cyahoo_myweb%2Cwindows_live%2Cfurl&amp;style=rotate&amp;publisher=baa2824f-9291-46c0-87b4-6d5a72508a05&amp;headerbg=%23dddddd&amp;inactivebg=%231bb601&amp;inactivefg=%2370eb00%09&amp;linkfg=%231bb601"></script>
416			</div>
417			
418
419                  
420			<h2 class="blog-title"><a name="8164722880411458481"></a>
421				
422				 Using WCF to access the Flickr JSON API
423				
424				<span class="blog-byline">
425				by: michael herndon, at: 7/17/2008 06:40:00 AM
426				</span>
427				
428			 </h2>
429			 <div class="blog-content">
430				<p>Even though there are quite a few opensource .Net libraries REST API out there, and a really impressive one for Flickr, they tend to never evolve or fork to use the newer framework technologies.&#160; I think its great that they support 1.0, 2.0, and mono, but why not fork and support WCF?&#160; I think part of the problem that .Net 3.5 use is not wide spread as it should be is not only information overload and bad naming for extension libraries, but also lack of opensource support to provide libraries and basis for current technology.&#160; </p>  <p>Flickr tends to be a little more tricky to use when calling it than some other REST APIs. WCF is a cool technology, but needs to be massaged when using it with Flickr due to a couple of gotchas and not so obvious things about WCF. In order to use Flickr, you need to register for an api_key and a shared secret code which is used to create an MD5 hash. You also need to create that MD5 each time you call a method, using the url parameters in a certain way. </p>  <p>There are also a few not so obvious factors about using the JSON part of Flickr. All of the .Net libraries I've seen so far, use XML. While C# is king of parsing&#160; XML, JSON tends to be more compact, which means less expense over the wire, though it might mean more time parsing once on the developers end point. So there are tradeoffs to using it. </p>  <p>When I created the classes needed to use WCF to call Flickr, I have the actual &quot;DataContract&quot; object (DTO, Data Transfer Object), A Hash (Dictionary&lt;string, object&gt;) for adding the parameters to create the MD5 signature, A base class for creating the WCF proxy, a custom &quot;WebContentTypeMapper&quot;, The &quot;ServiceContract&quot; interface, the actual &quot;Client class&quot;, and a mixins class for creating the MD5. </p>  <p>Here are some of the gotchas that I ran into while getting WCF to work with Flickr. </p>  <p></p>  <ol>   <li>Flickr makes you create a md5 hash to send with every call for ALL parameters in alphabetical order using your &quot;Shared Secret&quot; Code as part of the md5.&#160;&#160; </li>    <li>Flickr's Json response &quot;Content-Type&quot; header is sent not as &quot;application/json&quot; but as &quot;text/plain&quot; which equates to &quot;Raw&quot; in WCF lingo.&#160; </li>    <li>The response object is wrapped and not obvious when it comes to json how the DataContract object should be formed.&#160; </li>    <li>Flickr will wrap the json response in a javascript function unless you pass in the parameter &quot;nojsoncallback=1&quot; </li> </ol>  <p>To get around number one, I created an extension method that takes a Hash (Dictionary&lt;string, object&gt;) and adds method that converts the parameters into a MD5 string. </p>  <pre class="code csharp">namespace Amplify.Linq
431{
432	using System;
433	using System.Collections.Generic;
434	using System.Linq;
435	using System.Text;
436
437#if STANDALONE
438	public class Hash : Dictionary&lt;string, object&gt;
439	{
440
441		
442
443
444	}
445#endif 
446}
447// different file
448	
449namespace Amplify.Linq
450{
451	using System;
452	using System.Collections.Generic;
453	using System.Linq;
454	using System.Security.Cryptography;
455	using System.Text;
456
457	using Amplify.Linq;
458
459	public static class Mixins
460	{
461
462	
463
464		public static string ToMD5(this Hash obj, string secret)
465		{
466			var query = from item in obj
467						orderby item.Key ascending
468						select item.Key + item.Value.ToString(); 
469
470			StringBuilder builder = new StringBuilder(secret, 2048);
471
472			foreach (string item in query)
473				builder.Append(item);
474
475			MD5CryptoServiceProvider crypto = new MD5CryptoServiceProvider();
476			byte[] bytes = Encoding.UTF8.GetBytes(builder.ToString());
477			byte[] hashedBytes = crypto.ComputeHash(bytes, 0, bytes.Length);
478			return BitConverter.ToString(hashedBytes).Replace(&quot;-&quot;, &quot;&quot;).ToLower();
479		}
480
481	}
482}</pre>
483
484<p>Well Gotcha number two, took a bit of research to figure it out. The error I got was that it was looking for Json or XML but could not do anything with &quot;Raw&quot;. So the solution is to create a custom binding with a custom WebContentTypeManager. </p>
485
486<pre class="code csharp">namespace Amplify.Flickr
487{
488	using System.ServiceModel;
489	using System.ServiceModel.Channels;
490	using System.Runtime.Serialization;
491	using System.ServiceModel.Web;
492
493	public class JsonContentMapper : WebContentTypeMapper
494	{
495		public override WebContentFormat GetMessageFormatForContentType(string contentType)
496		{
497			return WebContentFormat.Json;
498		}
499	}
500}
501
502// different file
503
504namespace Amplify.Flickr
505{
506	using System;
507	using System.Collections.Generic;
508	using System.Linq;
509	using System.Text;
510	using System.ServiceModel;
511	using System.ServiceModel.Channels;
512	using System.ServiceModel.Description;
513	using System.ServiceModel.Web;
514
515	using Amplify.Linq;
516
517	public class FlickrClient&lt;T&gt; 
518	{
519		protected string Secret { get; set; }
520
521		protected string Key { get; set; }
522
523		protected string Token { get; set; }
524
525		protected string Url { get; set; }
526
527		protected T Proxy { get; set; }
528
529
530		public FlickrClient(string key, string secret)
531		{
532			this.Key = key;
533			this.Secret = secret;
534			this.Url = &quot;http://api.flickr.com/services/rest&quot;;
535			this.Proxy = this.InitializeProxy();
536		}
537
538		public FlickrClient(string key, string secret, string token)
539			:this(key, secret)
540		{
541			this.Token = token;
542		}
543
544		protected virtual T InitializeProxy()
545		{
546			// using custom wrapper
547			CustomBinding binding = new CustomBinding(new WebHttpBinding());
548			WebMessageEncodingBindingElement property =	binding.Elements.Find&lt;WebMessageEncodingBindingElement&gt;();
549			property.ContentTypeMapper = new JsonContentMapper();
550			
551
552			ChannelFactory&lt;T&gt; channel = new ChannelFactory&lt;T&gt;(
553				binding, this.Url);
554
555			channel.Endpoint.Behaviors.Add( new WebHttpBehavior());
556			return channel.CreateChannel();
557		}
558
559	}
560}</pre>
561
562<p>The 3rd issue, to know that all objects are wrapped in a &quot;Response&quot; object. To create a DataContract for the getFrob method on flickr, it took looking at the json to see what it was returning. The object below is the basic form of the Json object that is returned, it also includes the properties in case an error object is returned. </p>
563
564<pre class="code csharp">	using System;
565	using System.Collections.Generic;
566	using System.Linq;
567	using System.Text;
568	using System.Runtime.Serialization;
569
570	[DataContract]
571	public class FrobResponse 
572	{
573		[DataMember(Name = &quot;frob&quot;)]
574		public JsonObject Frob { get; set; }
575
576		[DataContract(Name = &quot;frob&quot;)]
577		public class JsonObject
578		{
579			[DataMember(Name = &quot;_content&quot;)]
580			public string Content { get; set; }
581
582		}
583
584		[DataMember(Name = &quot;stat&quot;)]
585		public string Status { get; set; }
586
587		[DataMember(Name = &quot;code&quot;)]
588		public int Code { get; set; }
589
590		[DataMember(Name = &quot;message&quot;)]
591		public string Message { get; set; }
592	}
593
594	// different file
595
596
597	using System;
598	using System.Collections.Generic;
599	using System.Linq;
600	using System.Text;
601	using System.ServiceModel;
602	using System.ServiceModel.Web;
603
604	[ServiceContract]
605	public interface IAuthClient
606	{
607		[OperationContract,
608			WebInvoke(
609				UriTemplate = &quot;/?method=flickr.auth.getFrob&amp;format=json&amp;nojsoncallback=1&amp;api_key={key}&amp;api_sig={signature}&quot;,
610				ResponseFormat = WebMessageFormat.Json,
611				BodyStyle = WebMessageBodyStyle.Bare)]
612		FrobResponse GetFrob(string signature, string key);
613
614		[OperationContract,
615			WebInvoke(
616				UriTemplate = &quot;/?method=flickr.auth.getToken&amp;format=json&amp;nojsoncallback=1&amp;api_key={key}&amp;frob={frob}&amp;api_sig={signature}&quot;,
617				ResponseFormat = WebMessageFormat.Json,
618				BodyStyle = WebMessageBodyStyle.WrappedResponse)]
619		Auth GetToken(string signature, string key, string frob);
620	}
621
622
623	// the actual client class.  
624
625	using System;
626	using System.Collections.Generic;
627	using System.Linq;
628	using System.Text;
629
630	using Amplify.Linq;
631
632
633	public class AuthClient : FlickrClient&lt;IAuthClient&gt;
634	{
635
636		public AuthClient(string key, string secret)
637			:base(key, secret)
638		{ }
639
640		public AuthClient(string key, string secret, string token)
641			:base(key, secret, token)
642		{ }
643
644		public string GetFrob()
645		{
646			string md5 = new Hash() {
647				{&quot;api_key&quot;, this.Key},
648				{&quot;format&quot;, &quot;json&quot;},
649				{&quot;method&quot;, &quot;flickr.auth.getFrob&quot;},
650				{&quot;nojsoncallback&quot;, 1}
651			}.ToMD5(this.Secret);
652
653			FrobResponse response = this.Proxy.GetFrob(md5, this.Key);
654			if (response.Code &gt; 0)
655				throw new Exception(response.Message);
656
657			return response.Frob.Content;
658		}
659	}</pre>  <p class="blogger-labels">Labels: <a rel='tag' href="http://www.amptools.net/labels/Amplify.aspx">Amplify</a>, <a rel='tag' href="http://www.amptools.net/labels/C#.aspx">C#</a>, <a rel='tag' href="http://www.amptools.net/labels/Code.aspx">Code</a>, <a rel='tag' href="http://www.amptools.net/labels/CSharp.aspx">CSharp</a>, <a rel='tag' href="http://www.amptools.net/labels/Flickr.aspx">Flickr</a>, <a rel='tag' href="http://www.amptools.net/labels/JSON.aspx">JSON</a>, <a rel='tag' href="http://www.amptools.net/labels/REST.aspx">REST</a>, <a rel='tag' href="http://www.amptools.net/labels/WCF.aspx">WCF</a></p>
660			 </div>
661			 <div class="blog-footer">
662				<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=8164722880411458481"location.href=https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=8164722880411458481;><span style="text-transform:lowercase">0 Comments</span></a>
663				
664				<a class="comment-link" href="http://www.amptools.net/2008/07/using-wcf-to-access-flickr-json-api.aspx#links"><span style="text-transform:lowercase">Links to this post</span></a>
665				  <span class="item-action"><a href="http://www.blogger.com/email-post.g?blogID=7043853799247804655&postID=8164722880411458481" title="Email Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_email.gif" height="13" width="18"/></a></span>
666				
667				<script type="text/javascript" src="http://w.sharethis.com/widget/?tabs=web%2Cemail&amp;charset=utf-8&amp;services=reddit%2Cdigg%2Cfacebook%2Cmyspace%2Cdelicious%2Cstumbleupon%2Ctechnorati%2Cpropeller%2Cblinklist%2Cmixx%2Cnewsvine%2Cgoogle_bmarks%2Cyahoo_myweb%2Cwindows_live%2Cfurl&amp;style=rotate&amp;publisher=baa2824f-9291-46c0-87b4-6d5a72508a05&amp;headerbg=%23dddddd&amp;inactivebg=%231bb601&amp;inactivefg=%2370eb00%09&amp;linkfg=%231bb601"></script>
668			</div>
669			
670
671                  
672			<h2 class="blog-title"><a name="1989566401714559482"></a>
673				
674				 Sample Mixins for HttpRequestBase to use with Asp.Net MVC
675				
676				<span class="blog-byline">
677				by: michael herndon, at: 7/16/2008 12:40:00 AM
678				</span>
679				
680			 </h2>
681			 <div class="blog-content">
682				<p>Being a semi avid user of rails for my day job, you tend to miss a couple of things that rails has that is not in Asp.Net's MVC framework. It is a great start and the control over the html (minus laziness of whoever ever developed their &quot;Html.DropDownList&quot; extension method, grrr INDENT YOUR NEW LINES!!), is much greater than what webforms gives you. One of the missing things that I miss is the request.xhr?, request.post?, etc methods that end to be helpful when deciding if this is an AJAX call or an actual action call to return the correct page. </p>  <p>So how do you determine if the request is an ajax request or just a regular page request. What about enforcing that a page is SSL?&#160; What about doing different things depending if the request is a GET or POST?&#160; </p>  <p>So after some googling about headers, rails, and such: here are the first go around of extension methods for HttpRequestBase that should come in handy. </p>  <pre class="code csharp">public static class ControllerMixins
683{
684
685		public static bool IsPost(this HttpRequestBase obj)
686		{
687			return obj.Headers[&quot;REQUEST_METHOD&quot;].ToLower() == &quot;post&quot;;
688		}
689
690		public static bool IsGet(this HttpRequestBase obj)
691		{
692			return obj.Headers[&quot;REQUEST_METHOD&quot;].ToLower() == &quot;get&quot;;
693		}
694
695		public static bool IsXhr(this HttpRequestBase obj)
696		{
697			string value = obj.Headers[&quot;HTTP_X_REQUESTED_WITH&quot;];
698			return (!string.IsNullOrEmpty(value) &amp;&amp; value.ToLower() == &quot;xmlhttprequest&quot;);
699		}
700
701		public static bool IsSSL(this HttpRequestBase obj)
702		{
703			return obj.Headers[&quot;HTTPS&quot;] == &quot;on&quot; ||
704				obj.Headers[&quot;'HTTP_X_FORWARDED_PROTO'&quot;] == &quot;https&quot;;
705		}
706}</pre>  <p class="blogger-labels">Labels: <a rel='tag' href="http://www.amptools.net/labels/Asp.Net.aspx">Asp.Net</a>, <a rel='tag' href="http://www.amptools.net/labels/Asp.Net Mvc.aspx">Asp.Net Mvc</a>, <a rel='tag' href="http://www.amptools.net/labels/C#.aspx">C#</a>, <a rel='tag' href="http://www.amptools.net/labels/Code.aspx">Code</a>, <a rel='tag' href="http://www.amptools.net/labels/CSharp.aspx">CSharp</a>, <a rel='tag' href="http://www.amptools.net/labels/Mixins.aspx">Mixins</a></p>
707			 </div>
708			 <div class="blog-footer">
709				<a class="comment-link" href="https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=1989566401714559482"location.href=https://www.blogger.com/comment.g?blogID=7043853799247804655&postID=1989566401714559482;><span style="text-transform:lowercase">0 Comments</span></a>
710				
711				<a class="comment-link" href="http://www.amptools.net/2008/07/sample-mixins-for-httprequestbase-to.aspx#links"><span style="text-transform:lowercase">Links to this post</span></a>
712				  <span class="item-action"><a href="http://www.blogger.com/email-post.g?blogID=7043853799247804655&postID=1989566401714559482" title="Email Post"><img class="icon-action" alt="" src="http://www.blogger.com:80/img/icon18_email.gif" height="13" width="18"/></a></span>
713				
714				<script type="text/javascript" src="http://w.sharethis.com/widget/?tabs=web%2Cemail&amp;charset=utf-8&amp;services=reddit%2Cdigg%2Cfacebook%2Cmyspace%2Cdelicious%2Cstumbleupon%2Ctechnorati%2Cpropeller%2Cblinklist%2Cmixx%2Cnewsvine%2Cgoogle_bmarks%2Cyahoo_myweb%2Cwindows_live%2Cfurl&amp;style=rotate&amp;publisher=baa2824f-9291-46c0-87b4-6d5a72508a05&amp;headerbg=%23dddddd&amp;inactivebg=%231bb601&amp;inactivefg=%2370eb00%09&amp;linkfg=%231bb601"></script>
715			</div>
716			
717		</div>
718		<div class="right">
719			<h3>
720				Connect
721			</h3>
722			<ul>
723				<li>
724					<a href="http://www.twitter.com/michaelherndon">
725						<img src="/content/images/twitter-badge.png" alt="Twitter badge" /> 
726					</a>
727				</li>
728				<li>
729					<a href="http://www.facebook.com/profile.php?id=824905532">
730						<img src="/content/images/facebook-badge.png" alt="Facebook badge" /> 
731					</a>
732				</li>
733				<li>
734					<a href="skype:michaelherndon?add">
735						<img src="http://download.skype.com/share/skypebuttons/buttons/add_green_transparent_118x23.png" alt="Add me to Skype" />
736					</a>
737				</li>
738			</ul>
739			
740			<h3>
741				<a href="http://feeds.feedburner.com/amptoolsnet" rel="alternate" type="application/rss+xml">
742					Subscribe in a reader <img src="http://www.feedburner.com/fb/images/pub/feed-icon32x32.png" style="vertical-align:middle" alt="" />
743				</a>
744			</h3>
745			<ul>
746				<li>
747				
748				</li>
749				<li>
750					<a href="http://feeds.feedburner.com/amptoolsnet">
751						<img src="http://feeds.feedburner.com/~fc/amptoolsnet?bg=990066&amp;fg=CCCCCC&amp;anim=0"  alt="" />
752					</a>
753				</li>
754				<li>
755					<a href="http://add.my.yahoo.com/rss?url=http://feeds.feedburner.com/amptoolsnet" title="amptools.net">
756						<img src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif" alt="" />
757					</a>
758				</li>
759				<li>
760					<a href="http://fusion.google.com/add?feedurl=http://feeds.feedburner.com/amptoolsnet">
761						<img src="http://buttons.googlesyndication.com/fusion/add.gif"   alt="Add to Google Reader or Homepage"/>
762					</a>
763				</li>
764				<li>
765					<a href="http://www.pageflakes.com/subscribe.aspx?url=http://feeds.feedburner.com/amptoolsnet" title="Add to Pageflakes">
766						<img src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif" alt="Add to Pageflakes"/>
767					</a>
768				</li>
769				<li>
770					<a href="http://www.bloglines.com/sub/http://feeds.feedburner.com/amptoolsnet" title="amptools.net" type="application/rss+xml">
771						<img src="http://www.bloglines.com/images/sub_modern11.gif" alt="Subscribe in Bloglines" />
772					</a>
773				</li>
774				<li>
775					<a href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http://feeds.feedburner.com/amptoolsnet" title="amptools.net">
776						<img src="http://www.newsgator.com/images/ngsub1.gif" alt="Subscribe in NewsGator Online" />
777					</a>
778				</li>
779			</ul>
780			<h3 class="sidebar-title">
781				Previous Posts
782			</h3>
783			<ul id="recently">
784				
785					<li><a href="http://www.amptools.net/2008/11/simple-log-in-amplify.aspx">Simple Log in Amplify </a></li>
786				
787					<li><a href="http://www.amptools.net/2008/10/gallio-and-mb-unit-release-v304.aspx">Gallio and Mb-Unit release v3.0.4</a></li>
788				
789					<li><a href="http://www.amptools.net/2008/10/moving-amplify-to-git-hub.aspx">Moving Amplify To Git Hub...</a></li>
790				
791					<li><a href="http://www.amptools.net/2008/08/getting-datadirectory-folder-in-c-sharp.aspx">Getting the |DataDirectory| folder in C sharp</a></li>
792				
793					<li><a href="http://www.amptools.net/2008/08/ampliy-fusion-javascript-libraries.aspx">Amplify-Fusion, JavaScript libraries compatibility...</a></li>
794				
795					<li><a href="http://www.amptools.net/2008/07/amplify-wcf-twitter-api-client-library.aspx">Amplify&#39;s WCF Twitter API Client Library v0.2</a></li>
796				
797					<li><a href="http://www.amptools.net/2008/07/use-c-to-determine-where-and-what.aspx">Use C# to determine where and what version of java...</a></li>
798				
799					<li><a href="http://www.amptools.net/2008/07/using-wcf-to-access-flickr-json-api.aspx">Using WCF to access the Flickr JSON API</a></li>
800				
801					<li><a href="http://www.amptools.net/2008/07/sample-mixins-for-httprequestbase-to.aspx">Sample Mixins for HttpRequestBase to use with Asp....</a></li>
802				
803					<li><a href="http://…

Large files files are truncated, but you can click here to view the full file