<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1219133776810833350</id><updated>2011-10-20T10:25:51.622-05:00</updated><category term='NUnit'/><category term='NDepend'/><category term='ASP'/><category term='CQL'/><category term='SOA'/><category term='Unit Testing'/><category term='The Architecture Journal'/><category term='reCAPTCHA'/><category term='Quality'/><title type='text'>de•com•posed</title><subtitle type='html'>ramblings about much of nothin'</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jniblack.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jniblack.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jeff Niblack</name><uri>http://www.blogger.com/profile/13124773302587594162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_BmT9LQKdBFY/Skwo8VEQoRI/AAAAAAAAAdU/97ZdS8zw-m0/S220/100_1392x.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1219133776810833350.post-3750939789568713292</id><published>2011-10-20T10:24:00.000-05:00</published><updated>2011-10-20T10:25:51.650-05:00</updated><title type='text'>EmpireAvenue</title><content type='html'>{EAV_BLOG_VER:64cd2d883e87737c}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1219133776810833350-3750939789568713292?l=jniblack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jniblack.blogspot.com/feeds/3750939789568713292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jniblack.blogspot.com/2011/10/empireavenue.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/3750939789568713292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/3750939789568713292'/><link rel='alternate' type='text/html' href='http://jniblack.blogspot.com/2011/10/empireavenue.html' title='EmpireAvenue'/><author><name>Jeff Niblack</name><uri>http://www.blogger.com/profile/13124773302587594162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_BmT9LQKdBFY/Skwo8VEQoRI/AAAAAAAAAdU/97ZdS8zw-m0/S220/100_1392x.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1219133776810833350.post-2661384177211477033</id><published>2009-08-12T07:02:00.000-05:00</published><updated>2009-09-28T10:05:56.917-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='The Architecture Journal'/><title type='text'>SOA Metric: Entrprise Adoption Rate</title><content type='html'>Here's another useful metric when reporting on how your SOA initiative is progressing.&lt;br /&gt;&lt;br /&gt;Tracking how services are leveraged across each organizational unit and rolling that information up to the enterprise level provides the enterprise adoption rate. This metric indicates how pervasive the use of services is across an enterprise. However, this metric is not necessarily easy to quantify. For example, given an enterprise that comprises five organizational units, if only two of the units are leveraging services, is the adoption rate of our enterprise at 40 percent? What if 80 percent of the total IT spend is within these two organizational units? Is the adoption rate of our enterprise now at 80 percent?&lt;br /&gt;&lt;br /&gt;A more accurate and measurable approach for reporting the enterprise adoption rate begins with a catalog of IT resources that span the enterprise. After determining how many of the applications within the catalog are actually leveraging services, determine the total number of applications that are candidates for an SOA implementation or integration. The product of this review (applications using services/total candidate applications for leveraging services) is a realistic enterprise adoption rate. &lt;br /&gt;&lt;br /&gt;If the data is available, integrating this metric with actual IT spend provides the weighted enterprise adoption rate, which is an even more compelling value-based metric.&lt;br /&gt;&lt;br /&gt;I also bring this out in the September 2009 edition of Microsoft's The Enterprise Journal (&lt;a href="http://msdn.microsoft.com/en-us/architecture/aa699435.aspx"&gt;http://msdn.microsoft.com/en-us/architecture/aa699435.aspx&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1219133776810833350-2661384177211477033?l=jniblack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jniblack.blogspot.com/feeds/2661384177211477033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jniblack.blogspot.com/2009/08/soa-metric-entrprise-adoption-rate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/2661384177211477033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/2661384177211477033'/><link rel='alternate' type='text/html' href='http://jniblack.blogspot.com/2009/08/soa-metric-entrprise-adoption-rate.html' title='SOA Metric: Entrprise Adoption Rate'/><author><name>Jeff Niblack</name><uri>http://www.blogger.com/profile/13124773302587594162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_BmT9LQKdBFY/Skwo8VEQoRI/AAAAAAAAAdU/97ZdS8zw-m0/S220/100_1392x.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1219133776810833350.post-390839315848905389</id><published>2009-08-11T09:44:00.003-05:00</published><updated>2009-09-28T10:02:37.211-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='The Architecture Journal'/><title type='text'>SOA Metric: Consumer-to-Service Ratio</title><content type='html'>The next time you're asked to provide insight into how your SOA initiative is moving along, try using the Consumer-to-Service ratio.&lt;br /&gt;&lt;br /&gt;This is a useful metric to track primarily because each reuse averts the costs of developing, operating, and maintaining a new single-purpose service. The idea is that as the number of consumers increases for a service, the return on the costs—both initial and ongoing—that is attributed to that service increases.&lt;br /&gt;&lt;br /&gt;However, use caution when you report this metric. As the number of consumers increases for a service, the reliance on that service increases, which exposes the enterprise to an increased consequence of failure. Because scalability is the result of design, implementation, and infrastructure choices and investments, as more consumers begin to employ and rely on a service, the workload of that service increases and could potentially move beyond the limits that the service was expecting—thus, increasing the likelihood of failure. Finally, with consumers converging into a single point, the ability of a service to mature over time becomes increasingly more challenging and costly, as any change to the service requires an increased investment in impact analysis, regression testing, and coordination across the enterprise.&lt;br /&gt;&lt;br /&gt;I also bring this out in the September 2009 edition of Microsoft's The Enterprise Journal (&lt;a href="http://msdn.microsoft.com/en-us/architecture/aa699435.aspx"&gt;http://msdn.microsoft.com/en-us/architecture/aa699435.aspx&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1219133776810833350-390839315848905389?l=jniblack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jniblack.blogspot.com/feeds/390839315848905389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jniblack.blogspot.com/2009/08/next-time-youre-asked-to-provide.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/390839315848905389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/390839315848905389'/><link rel='alternate' type='text/html' href='http://jniblack.blogspot.com/2009/08/next-time-youre-asked-to-provide.html' title='SOA Metric: Consumer-to-Service Ratio'/><author><name>Jeff Niblack</name><uri>http://www.blogger.com/profile/13124773302587594162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_BmT9LQKdBFY/Skwo8VEQoRI/AAAAAAAAAdU/97ZdS8zw-m0/S220/100_1392x.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1219133776810833350.post-744014207536200961</id><published>2009-07-11T09:57:00.001-05:00</published><updated>2009-08-11T10:10:28.819-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NDepend'/><category scheme='http://www.blogger.com/atom/ns#' term='Quality'/><category scheme='http://www.blogger.com/atom/ns#' term='CQL'/><title type='text'>Get NDepend metrics for a particular method or type</title><content type='html'>Looking for NDepend info on a particular method or type? Here's a simple CQL query that will return a few of the common metrics. Just enter a portion of what you're looking for in the NameLike criteria and off you go. The sample here will pull back Methods. If you're looking for Type information, replace METHODS with TYPES.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:black;"&gt;&lt;span style="color:green;"&gt;// &lt;name&gt;Get metrics for a particular Method or Type&lt;/name&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;SELECT METHODS WHERE&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NbLinesOfCode &gt; &lt;span style="background-color:yellow;"&gt;1&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;AND&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CyclomaticComplexity &gt; &lt;span style="background-color:yellow;"&gt;1&lt;/span&gt; &lt;span style="color:blue;"&gt;OR&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ILCyclomaticComplexity &gt; &lt;span style="background-color:yellow;"&gt;1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;span style="color:blue;"&gt;&lt;/br&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AND&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ILNestingDepth &gt; &lt;span style="background-color:yellow;"&gt;1&lt;/span&gt;&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:blue;"&gt;AND&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PercentageComment &lt; &lt;span style="background-color:yellow;"&gt;100&lt;/span&gt;&lt;/br&gt; &lt;br /&gt;&lt;span style="color:blue;"&gt;AND&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NameLike &lt;span style="color:#a31515;"&gt;"Foo"&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1219133776810833350-744014207536200961?l=jniblack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jniblack.blogspot.com/feeds/744014207536200961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jniblack.blogspot.com/2009/07/get-ndepend-metrics-for-particular.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/744014207536200961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/744014207536200961'/><link rel='alternate' type='text/html' href='http://jniblack.blogspot.com/2009/07/get-ndepend-metrics-for-particular.html' title='Get NDepend metrics for a particular method or type'/><author><name>Jeff Niblack</name><uri>http://www.blogger.com/profile/13124773302587594162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_BmT9LQKdBFY/Skwo8VEQoRI/AAAAAAAAAdU/97ZdS8zw-m0/S220/100_1392x.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1219133776810833350.post-3043005161514731772</id><published>2009-07-05T09:06:00.003-05:00</published><updated>2009-08-11T10:09:45.797-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NDepend'/><category scheme='http://www.blogger.com/atom/ns#' term='Quality'/><category scheme='http://www.blogger.com/atom/ns#' term='CQL'/><title type='text'>Worst Offenders using NDepend</title><content type='html'>Here's the basic CQL query I use when beginning to look for areas of code that need some work. The metrics in this query tend to let the worst offenders bubble up to the top. However, I tend to favor ILNestingDepth and CyclomaticComplexity as the two main drivers. As always...this is just the 'smell'...with what's returned from query, the work begins.&lt;br /&gt;&lt;br /&gt;Have fun!&lt;br /&gt;&lt;br /&gt;&lt;span style="color:black;"&gt;&lt;span style="color:green;"&gt;// &lt;name&gt;High-Impact candidates for Refactoring&lt;/name&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;SELECT METHODS WHERE&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NbLinesOfCode &gt; &lt;span style="background-color:yellow;"&gt;10&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;AND&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CyclomaticComplexity &gt; &lt;span style="background-color:yellow;"&gt;15&lt;/span&gt; &lt;span style="color:blue;"&gt;OR&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ILCyclomaticComplexity &gt; &lt;span style="background-color:yellow;"&gt;30&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;span style="color:blue;"&gt;&lt;/br&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AND&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ILNestingDepth &gt; &lt;span style="background-color:yellow;"&gt;5&lt;/span&gt;&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:blue;"&gt;AND&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PercentageComment &lt; &lt;span style="background-color:yellow;"&gt;30&lt;/span&gt;&lt;/br&gt; &lt;br /&gt;&lt;span style="color:blue;"&gt;AND&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!(NameLike &lt;span style="color:#a31515;"&gt;"^.ctor"&lt;/span&gt;)&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:blue;"&gt;ORDER BY&lt;/span&gt; CyclomaticComplexity &lt;span style="color:blue;"&gt;DESC&lt;/span&gt;, NbLinesOfCode &lt;span style="color:blue;"&gt;DESC&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1219133776810833350-3043005161514731772?l=jniblack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jniblack.blogspot.com/feeds/3043005161514731772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jniblack.blogspot.com/2009/07/worst-offenders-using-ndepend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/3043005161514731772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/3043005161514731772'/><link rel='alternate' type='text/html' href='http://jniblack.blogspot.com/2009/07/worst-offenders-using-ndepend.html' title='Worst Offenders using NDepend'/><author><name>Jeff Niblack</name><uri>http://www.blogger.com/profile/13124773302587594162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_BmT9LQKdBFY/Skwo8VEQoRI/AAAAAAAAAdU/97ZdS8zw-m0/S220/100_1392x.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1219133776810833350.post-4220515600391793130</id><published>2009-05-21T04:50:00.005-05:00</published><updated>2009-08-18T10:46:21.401-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><title type='text'>Testing private members with NUnit</title><content type='html'>For those using MSTest, private accessors are created for you so that testing private members is trivial. If you’re using NUnit, however, there’s a bit more work involved.&lt;br /&gt;&lt;br /&gt;First, repeat after me… Reflection is good. Reflection is good. Reflection is good. &lt;br /&gt;&lt;br /&gt;We can use &lt;a href="http://msdn.microsoft.com/en-us/library/system.type.getmethod(VS.71).aspx"&gt;System.Type.GetMethod&lt;/a&gt; to get access to a methods metadata and then use &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.invoke.aspx"&gt;System.Reflection.MethodBase.Invoke&lt;/a&gt; to execute the method.&lt;br /&gt;&lt;br /&gt;So, given a class FooMaster with a private, static method Foo&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FooMaster&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; Foo(&lt;span style="color: blue;"&gt;string&lt;/span&gt; myString, &lt;span style="color: blue;"&gt;int&lt;/span&gt; myInt)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//init the result&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; result = &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//does the length of string match the int passed in?&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (myString != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = myString.Length == myInt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (myInt == 0)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; result;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;a unit test would look something like this&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Foo1()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Reflection.&lt;span style="color: #2b91af;"&gt;MethodInfo&lt;/span&gt; fooMethod =&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;FooMaster&lt;/span&gt;).GetMethod(&lt;span style="color: #a31515;"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (System.Reflection.&lt;span style="color: #2b91af;"&gt;BindingFlags&lt;/span&gt;.NonPublic | System.Reflection.&lt;span style="color: #2b91af;"&gt;BindingFlags&lt;/span&gt;.Static));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;object&lt;/span&gt;[] parameterValues = { &lt;span style="color: #a31515;"&gt;&amp;quot;my test string&amp;quot;&lt;/span&gt;, 14 };&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; result = (&lt;span style="color: blue;"&gt;bool&lt;/span&gt;)fooMethod.Invoke(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, parameterValues);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(result, &lt;span style="color: #a31515;"&gt;&amp;quot;Foo did not return the expected result!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;In this case, because FooMaster.Foo is a private, static method, we need to include the &lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;System.Reflection.&lt;span style="color: #2b91af;"&gt;BindingFlags&lt;/span&gt;.NonPublic&lt;/pre&gt;&lt;/div&gt; and &lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;System.Reflection.&lt;span style="color: #2b91af;"&gt;BindingFlags&lt;/span&gt;.Static&lt;/pre&gt;&lt;/div&gt; BindingFlags. Otherwise, the GetMethod call will throw a System.NullReferenceException exception.&lt;br /&gt;&lt;br /&gt;The array of System.Object &lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;object&lt;/span&gt;[] parameterValues = { &lt;span style="color: #a31515;"&gt;&amp;quot;my test string&amp;quot;&lt;/span&gt;, 14 };&lt;/pre&gt;&lt;/div&gt; contains the list of parameter values that we'll pass to the method when we execute it.&lt;br /&gt;&lt;br /&gt;When executing with the Invoke method &lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt; result = (&lt;span style="color: blue;"&gt;bool&lt;/span&gt;)fooMethod.Invoke(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, parameterValues);&lt;/pre&gt;&lt;/div&gt; we need to cast the result accordingly and then apply the appropriate Assert.&lt;br /&gt;&lt;br /&gt;¡Hay Chimba! Life is good...until an overload is introduced. Now we need to do a little bit more work.&lt;br /&gt;&lt;br /&gt;Introducing an overload of Foo that looks like this&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; Foo(&lt;span style="color: blue;"&gt;string&lt;/span&gt; myString, &lt;span style="color: blue;"&gt;byte&lt;/span&gt; myByte)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; Foo(myString, &lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(myByte));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;will cause our unit test to throw a System.Reflection.AmbiguousMatchException exception since FooMaster now has two methods named Foo. &lt;br /&gt;&lt;br /&gt;So, we need to update our unit test a bit to include an array of Type objects that represent the number, order, and type of parameters for the method that we're trying to get a reference to. &lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Foo1()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Reflection.&lt;span style="color: #2b91af;"&gt;MethodInfo&lt;/span&gt; fooMethod =&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;FooMaster&lt;/span&gt;).GetMethod(&lt;span style="color: #a31515;"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (System.Reflection.&lt;span style="color: #2b91af;"&gt;BindingFlags&lt;/span&gt;.NonPublic | System.Reflection.&lt;span style="color: #2b91af;"&gt;BindingFlags&lt;/span&gt;.Static),&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt;[] { &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;), &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;) }, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;object&lt;/span&gt;[] parameterValues = { &lt;span style="color: #a31515;"&gt;&amp;quot;my test string&amp;quot;&lt;/span&gt;, 14 };&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; result = (&lt;span style="color: blue;"&gt;bool&lt;/span&gt;)fooMethod.Invoke(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, parameterValues);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(result, &lt;span style="color: #a31515;"&gt;&amp;quot;Foo did not return the expected result!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Foo2()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Reflection.&lt;span style="color: #2b91af;"&gt;MethodInfo&lt;/span&gt; fooMethod =&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;FooMaster&lt;/span&gt;).GetMethod(&lt;span style="color: #a31515;"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (System.Reflection.&lt;span style="color: #2b91af;"&gt;BindingFlags&lt;/span&gt;.NonPublic | System.Reflection.&lt;span style="color: #2b91af;"&gt;BindingFlags&lt;/span&gt;.Static),&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt;[] { &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;), &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;byte&lt;/span&gt;) }, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;object&lt;/span&gt;[] parameterValues = { &lt;span style="color: #a31515;"&gt;&amp;quot;my test string&amp;quot;&lt;/span&gt;, (&lt;span style="color: blue;"&gt;byte&lt;/span&gt;)14 };&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; result = (&lt;span style="color: blue;"&gt;bool&lt;/span&gt;)fooMethod.Invoke(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, parameterValues);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(result, &lt;span style="color: #a31515;"&gt;&amp;quot;Foo did not return the expected result!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;You can see here that our unit tests include an array of Type &lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt;[] { &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;), &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;) }&lt;/pre&gt;&lt;/div&gt; and&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 7pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt;[] { &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;), &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;byte&lt;/span&gt;) }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;to futher specify which Foo method to get a reference to.&lt;br /&gt;&lt;br /&gt;Very cool. Remember...Reflection is good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1219133776810833350-4220515600391793130?l=jniblack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jniblack.blogspot.com/feeds/4220515600391793130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jniblack.blogspot.com/2009/05/testing-private-members-with-nunit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/4220515600391793130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/4220515600391793130'/><link rel='alternate' type='text/html' href='http://jniblack.blogspot.com/2009/05/testing-private-members-with-nunit.html' title='Testing private members with NUnit'/><author><name>Jeff Niblack</name><uri>http://www.blogger.com/profile/13124773302587594162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_BmT9LQKdBFY/Skwo8VEQoRI/AAAAAAAAAdU/97ZdS8zw-m0/S220/100_1392x.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1219133776810833350.post-5247924977857309667</id><published>2008-04-19T19:17:00.003-05:00</published><updated>2009-08-11T10:10:02.230-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='reCAPTCHA'/><title type='text'>Classic ASP &amp; Anti-Bot support</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span class="apple-style-span"&gt;&lt;span style="Georgia&amp;quot;,&amp;quot;serif&amp;quot;; font-family:&amp;quot;;color:black;"&gt;So, try as you might, the 'net is sated with bots crawling about trying to inspect and infect nearly anything and everything. Feedback pages can be a torturous for companies. It’s not that odd to see the signal-to-noise ratio waaaay too noisy for any value. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="apple-style-span"&gt;&lt;span style="Georgia&amp;quot;,&amp;quot;serif&amp;quot;; font-family:&amp;quot;;color:black;"&gt;Enter CAPTCHA…yep, it’s an acronym (Completely Automated Public Turing test to tell Computers and Humans Apart.) Here’s some good background &lt;/span&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/CAPTCHA"&gt;http://en.wikipedia.org/wiki/CAPTCHA&lt;/a&gt; if you’re really interested.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;reCAPTCHA (&lt;a href="http://recaptcha.net/"&gt;http://recaptcha.net/&lt;/a&gt;) is a “free” system &amp;amp; service developed by Carnegie Mellon University to help them digitize textbooks while providing you with a challenge/response mechanism that most bots have trouble with. It works like this; reCAPTCHA gives a challenge to you that includes a known, control word along with the CAPTCHA (a questionable word that the OCR is having trouble with). The idea is that if a human response matches up the control word, then the CAPTCHA must be correct too. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;The net effect is…you get a decent human vs. bot confirmation process and reCAPTCHA gets some of their OCR’ed text cleaned up. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;There are a variety of ways (they call them plugins) to use the reCAPTCHA system listed on their site but using it with Classic ASP is a bit of a chore. Here’s a quick and easy fix that uses the reCAPTCHA API directly.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Include these two VBScript functions in your ASP code:&lt;/p&gt;&lt;div    style="   background: white;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;01&lt;/span&gt; &lt;span style="background: #ffee62;"&gt;&amp;lt;%&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;02&lt;/span&gt; &lt;span style="color:green;"&gt;'builds &amp;amp; returns reCAPTCHA challenge web part (JavaScript)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;03&lt;/span&gt; &lt;span style="color:green;"&gt;'needs the reCAPTCHA Public Key&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;04&lt;/span&gt; &lt;span style="color:green;"&gt;'uses the reCAPTCHA Client API Challenge web service&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;05&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; RecaptchaChallengeWriter(recaptchaPublicKey) &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;06&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;07&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'build challenge &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;08&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; webPart&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;09&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;webPart = &lt;span style="color:#a31515;"&gt;"&amp;lt;script type=""text/javascript""&amp;gt;"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;10&lt;/span&gt;                         &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"var RecaptchaOptions = {"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;11&lt;/span&gt;                         &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"   theme : 'white',"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;12&lt;/span&gt;                         &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"   lang : 'en',"&lt;/span&gt; &amp;amp; _&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;13&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"   tabindex : 0"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;14&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"};"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;15&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;lt;/script&amp;gt;"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;16&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;lt;script type=""text/javascript"" src=""http://api.recaptcha.net/challenge?k="&lt;/span&gt; &amp;amp; recaptchaPublicKey &amp;amp; &lt;span style="color:#a31515;"&gt;"""&amp;gt;&amp;lt;/script&amp;gt;"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;17&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;lt;noscript&amp;gt;"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;18&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;lt;iframe src=""http://api.recaptcha.net/noscript?k="&lt;/span&gt; &amp;amp; recaptchaPublicKey &amp;amp; &lt;span style="color:#a31515;"&gt;""" frameborder=""1""&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;br&amp;gt;"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;19&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;lt;textarea name=""recaptchaChallenge"" rows=""3"" cols=""40""&amp;gt;&amp;lt;/textarea&amp;gt;"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;20&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;lt;input type=""hidden"" name=""recaptchaResponse"" value=""manual_challenge""&amp;gt;"&lt;/span&gt; &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;21&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;lt;/noscript&amp;gt;"&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;22&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;23&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'return the challenge&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;24&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;RecaptchaChallengeWriter = webPart&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;25&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;26&lt;/span&gt; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;27&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;28&lt;/span&gt; &lt;span style="color:green;"&gt;'validate the reCAPTCHA info entered by the user&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;29&lt;/span&gt; &lt;span style="color:green;"&gt;'needs the ReCAPTCHA Private key along with the challenge and response form fields&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;30&lt;/span&gt; &lt;span style="color:green;"&gt;'uses the reCAPTCHA Client API Verify web service&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;31&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; RecaptchaValidate(privateKey, challenge, response) &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;32&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;33&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'our function result holder&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;34&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; validateMessage&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;35&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;36&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'build the request string&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;37&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; httpRequestString &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;38&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;httpRequestString = &lt;span style="color:#a31515;"&gt;"privatekey="&lt;/span&gt; &amp;amp; privateKey &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;39&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;amp;remoteip="&lt;/span&gt; &amp;amp; Request.ServerVariables(&lt;span style="color:#a31515;"&gt;"REMOTE_ADDR"&lt;/span&gt;) &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;40&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;amp;challenge="&lt;/span&gt; &amp;amp; challenge &amp;amp; _ &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;41&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"&amp;amp;response="&lt;/span&gt; &amp;amp; response&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;42&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;43&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'using ServerXMLHTTP to post the request                         &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;44&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; xmlHttp &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;45&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Set&lt;/span&gt; xmlHttp = Server.CreateObject(&lt;span style="color:#a31515;"&gt;"MSXML2.ServerXMLHTTP"&lt;/span&gt;) &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;46&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;47&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'for the request&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;48&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;xmlHttp.open &lt;span style="color:#a31515;"&gt;"POST"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"http://api-verify.recaptcha.net/verify"&lt;/span&gt;, &lt;span style="color:blue;"&gt;False&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;49&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;xmlHttp.setRequestHeader &lt;span style="color:#a31515;"&gt;"Content-Type"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"application/x-www-form-urlencoded"&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;50&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;xmlHttp.send httpRequestString&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;51&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;52&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'save the response    &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;53&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; verifyResponse &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;54&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;verifyResponse = split(xmlHttp.responseText, vblf) &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;55&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;56&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'release th ServerXMLHTTP object&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;57&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Set&lt;/span&gt; xmlHttp = &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;58&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;59&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'user response validated?  &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;60&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; verifyResponse(0) = &lt;span style="color:#a31515;"&gt;"true"&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;61&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;62&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:green;"&gt;'good response...we'll pass back goodness&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;63&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;validateMessage = &lt;span style="color:#a31515;"&gt;""&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;64&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;65&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;Else&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;66&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;67&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:green;"&gt;'something's not correct...send back the message&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;68&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;validateMessage = verifyResponse(1) &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;69&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;70&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;71&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;72&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;'set return code&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;73&lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;RecaptchaValidate = validateMessage&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;74&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;75&lt;/span&gt; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:#2b91af;"&gt;76&lt;/span&gt; &lt;span style="background: #ffee62;"&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class="MsoNormal"&gt;And whereever you'd like to see the CAPTCHA box on your form, use this:&lt;/p&gt;&lt;div    style="   background: white;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;1&lt;/span&gt; &lt;span style="background: #ffee62;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;RecaptchaChallengeWriter(&lt;span style="color:#a31515;"&gt;"your reCAPTCHA public key goes here"&lt;/span&gt;)&lt;span style="background: #ffee62;"&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class="MsoNormal"&gt;Then when you're ready to see if a post is validated, use this:&lt;/p&gt;&lt;div    style="   background: white;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;1&lt;/span&gt; &lt;span style="color:green;"&gt;'let's make sure it ain't no robot&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;2&lt;/span&gt; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; isRecaptchaValid&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;3&lt;/span&gt; isRecaptchaValid = RecaptchaValidate(&lt;span style="color:#a31515;"&gt;"your reCAPTCHA private key goes here"&lt;/span&gt;, Form.Item(&lt;span style="color:#a31515;"&gt;"recaptchaChallenge"&lt;/span&gt;), Form.Item(&lt;span style="color:#a31515;"&gt;"recaptchaResponse"&lt;/span&gt;))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;4&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;5&lt;/span&gt; &lt;span style="color:green;"&gt;'anything other than a blank coming back is badness&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span class="Apple-style-span"  style="color:#2B91AF;"&gt;6&lt;/span&gt; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (isRecaptchaValid = &lt;span style="color:#a31515;"&gt;""&lt;/span&gt;) &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class="MsoNormal"&gt;Simple as that. I've used it a few times now on different sites both with Classic ASP and beyond...never a problem.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1219133776810833350-5247924977857309667?l=jniblack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jniblack.blogspot.com/feeds/5247924977857309667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jniblack.blogspot.com/2008/04/classic-asp-anti-bot-support.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/5247924977857309667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1219133776810833350/posts/default/5247924977857309667'/><link rel='alternate' type='text/html' href='http://jniblack.blogspot.com/2008/04/classic-asp-anti-bot-support.html' title='Classic ASP &amp; Anti-Bot support'/><author><name>Jeff Niblack</name><uri>http://www.blogger.com/profile/13124773302587594162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_BmT9LQKdBFY/Skwo8VEQoRI/AAAAAAAAAdU/97ZdS8zw-m0/S220/100_1392x.jpg'/></author><thr:total>0</thr:total></entry></feed>
