<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Ted Graham on .NET</title><subtitle type="html">Interesting issues and tidbits about software development, generally using .NET</subtitle><id>http://weblogs.asp.net/tgraham/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/tgraham/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2006-11-15T16:12:00Z</updated><entry><title>Loading the assembly for a custom log4net appender</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/05/02/loading-the-assembly-for-a-custom-log4net-appender.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/05/02/loading-the-assembly-for-a-custom-log4net-appender.aspx</id><published>2007-05-02T19:45:00Z</published><updated>2007-05-02T19:45:00Z</updated><content type="html">As I described recently, I have built a custom appender that inherits from SmtpAppender but supports SSL sending using .NET 2.0. However, when I configure my web application to use it, I get an error that: log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [EmailAppender] of type [log4netExtensions.SmtpClientAsyncSmtpAppender]. Reported error follows. System.TypeLoadException: Could not load type [log4netExtensions.SmtpClientAsyncSmtpAppender]. Tried assembly [log4net, Version=1.2...(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/05/02/loading-the-assembly-for-a-custom-log4net-appender.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2481740" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="log4net" scheme="http://weblogs.asp.net/tgraham/archive/tags/log4net/default.aspx" /></entry><entry><title>A log4net appender that uses SmtpClient</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/04/20/a-log4net-appender-that-uses-smtpclient.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/04/20/a-log4net-appender-that-uses-smtpclient.aspx</id><published>2007-04-20T21:36:00Z</published><updated>2007-04-20T21:36:00Z</updated><content type="html">Google Apps provides free email hosting for small businesses. However, their SMTP server requires SSL authentication for sending outbound emails, so you can&amp;#39;t use use log4net to send emails based on the content of logged messages. Ron Grabowski suggested writing a log4net appender that uses SmtpClient (only available in 2.0) to send SSL secured messages. The below class works for me against smtp.google.com using port 587: using System; using System.Collections.Generic; using System.Text; using...(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/04/20/a-log4net-appender-that-uses-smtpclient.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2304984" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="log4net" scheme="http://weblogs.asp.net/tgraham/archive/tags/log4net/default.aspx" /></entry><entry><title>A realistic log4net config</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx</id><published>2007-03-15T16:34:00Z</published><updated>2007-03-15T16:34:00Z</updated><content type="html">Most log4net config file examples show the simplest case. Here is a more realistic example of a production log4net config that uses multiple appenders. This comes from an ASP.NET application, but the same technique will work in a server or client application. This config sets up two appenders: The first one writes all messages at DEBUG or higher to a log file. Depending on your needs, a RollingFileAppender that creates a new file every day or week might be more appropriate. The second appender sends...(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2034161" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET best practices" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+best+practices/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="ASP.NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/ASP.NET/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/tgraham/archive/tags/C_2300_/default.aspx" /><category term=".NET FAQ" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+FAQ/default.aspx" /><category term="log4net" scheme="http://weblogs.asp.net/tgraham/archive/tags/log4net/default.aspx" /></entry><entry><title>Software Startup Series</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/03/09/software-startup-series.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/03/09/software-startup-series.aspx</id><published>2007-03-09T16:30:00Z</published><updated>2007-03-09T16:30:00Z</updated><content type="html">My series highlighting helpful information for software startups is now in the 8th week. I started this as a way to communicate helpful information with my partners, but it is starting to get some traffic and take on a life of its own. The micro-ISV movement is gaining momentum, Channel 9 has even started a show about it....(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/03/09/software-startup-series.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1978101" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Installing VS 2003 AFTER VS 2005</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/01/14/installing-vs-2003-after-vs-2005.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/01/14/installing-vs-2003-after-vs-2005.aspx</id><published>2007-01-14T17:33:00Z</published><updated>2007-01-14T17:33:00Z</updated><content type="html">Like most developers, I&amp;#39;ve already upgraded to VS 2005. However, a product which I am releasing soon uses .NET 1.1 for the client side to ease installation. So I had to install VS 2003 after having VS 2005 installed. Luckily, and thanks to MS, it worked great. Porting the client code back to 1.1 wasn&amp;#39;t too bad. Recreating the project files was a pain, and realizing that the DataGrid is 2.0 only was a bummer. However, SourceGrid looks like it is going to work nicely....(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/01/14/installing-vs-2003-after-vs-2005.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1406099" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="Visual Studio" scheme="http://weblogs.asp.net/tgraham/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Razr survives the washing machine</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/01/11/razr-survives-the-washing-machine.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/01/11/razr-survives-the-washing-machine.aspx</id><published>2007-01-12T03:31:00Z</published><updated>2007-01-12T03:31:00Z</updated><content type="html">Following a long night of poker on Saturday, I started a load of laundry. After transferring it to the dryer, I heard a suspicious thumping and found my Razr had gone through the full cycle. I figured it was dead, but I took out the battery and the sim card and let it dry for 2 days. After reassembly and 12 hours of charging, it turned on and displayed a lovely background of clouds. After an hour, the background reverted back to normal, and I could place calls. The speaker and mic were dead, but...(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/01/11/razr-survives-the-washing-machine.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1393433" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="Community News" scheme="http://weblogs.asp.net/tgraham/archive/tags/Community+News/default.aspx" /></entry><entry><title>Subversion Hosting</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2007/01/02/subversion-hosting.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2007/01/02/subversion-hosting.aspx</id><published>2007-01-02T23:19:00Z</published><updated>2007-01-02T23:19:00Z</updated><content type="html">I&amp;#39;m always shocked when I encounter people and projects that aren&amp;#39;t using version control. After years of knowing that I can rollback to a previous version, working on files that aren&amp;#39;t versioned scares me. I keep everything possible checked in, including tax files, my diaries, etc. I switched to Subversion 18 months ago and have been very happy with both my free and my paid hosting....(&lt;a href="http://weblogs.asp.net/tgraham/archive/2007/01/02/subversion-hosting.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1352326" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Copyright for Software Companies</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2006/12/27/copyright-for-software-companies.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2006/12/27/copyright-for-software-companies.aspx</id><published>2006-12-27T15:09:00Z</published><updated>2006-12-27T15:09:00Z</updated><content type="html">&lt;p&gt;Most programmers only think about copyright when management decrees that every file needs a copyright notice at the top or bottom.&amp;nbsp; Next month, I&amp;rsquo;m sure a junior developer somewhere will be assigned to update the copyright date on a source tree to show 2007, while the features that would make that product a success languish unimplemented.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Read more about &lt;a href="http://www.moneyandsoftware.com/2006/12/18/copyright-for-software-companies/"&gt;copyright for software companies&lt;/a&gt; on my business blog, &lt;a href="http://weblogs.asp.net/controlpanel/blogs/www.MoneyAndSoftware.com"&gt;Money and Software&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1321985" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Google Search API fails sporadically with "502 Bad Gateway"</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2006/11/22/google-search-api-fails-sporadically-with-502-bad-gateway.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2006/11/22/google-search-api-fails-sporadically-with-502-bad-gateway.aspx</id><published>2006-11-22T19:37:00Z</published><updated>2006-11-22T19:37:00Z</updated><content type="html">&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;I heard about Google&amp;#39;s &lt;/font&gt;&lt;a href="http://code.google.com/apis/soapsearch/"&gt;&lt;font face="Courier New"&gt;web service interface&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt; to the search database back when it was released, but today was my first attempt to use it.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I&amp;#39;m trying to learn python, but the SOAP toolkits for python seem to be in a state of flux so I switched back to C# rather than figure out which python libraries to download.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;I experienced two problems, one minor and one major.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The &lt;/font&gt;&lt;a href="http://code.google.com/apis/soapsearch/reference.html#searchrequest"&gt;&lt;font face="Courier New"&gt;doSearch method &lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;takes a bunch of strings, and if you pass null in, you get back weird errors talking about no signature match and java.lang.String.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Passing String.Empty fixes that.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;The second problem is that, requests to search sporadically fail with &amp;quot;502: Bad Gateway&amp;quot;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;From my googling (ah, the irony) for a solution, this has been a problem since January 2006, and is still unsolved.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;The solution on the forums seems to be catch the exception and try again; I didn&amp;#39;t expect that to work, but it did.&lt;span&gt;&amp;nbsp; &lt;/span&gt;I wrote a console app that sent the same string to the gateway 30 times, and it seemed to randomly error out.&lt;span&gt;&amp;nbsp; &lt;/span&gt;A snippet of the output is below:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:14.593 - The request failed with HTTP status 502: Bad Gateway.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:19.046 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:32.625 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:35.000 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:35.984 - The request failed with HTTP status 502: Bad Gateway.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:39.843 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;12:27:42.593 - Success, found 782000 items.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoPlainText" style="margin: 0in 0in 0pt"&gt;&lt;font face="Courier New"&gt;This makes this obviously unsuitable for anything more than playful experimentation, but since the API doesn&amp;#39;t return ads, I guess Google doesn&amp;#39;t care. &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=999752" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET best practices" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+best+practices/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/tgraham/archive/tags/C_2300_/default.aspx" /><category term="Web Services" scheme="http://weblogs.asp.net/tgraham/archive/tags/Web+Services/default.aspx" /></entry><entry><title>Web Service performance numbers--plenty fast for UI work</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/tgraham/archive/2006/11/15/Web-Service-performance-numbers_2D002D00_plenty-fast-for-UI-work.aspx" /><id>http://weblogs.asp.net/tgraham/archive/2006/11/15/Web-Service-performance-numbers_2D002D00_plenty-fast-for-UI-work.aspx</id><published>2006-11-15T23:12:00Z</published><updated>2006-11-15T23:12:00Z</updated><content type="html">&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;While designing Web Services, the question of &amp;quot;interface granularity&amp;quot; often comes up.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Conventional wisdom is that Web Service calls are slow, so the interface must be quite coarse to prevent performance problems.&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;Four years ago, a partner and I built a 2-tier system, a rich client app that talked directly to a database.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Towards the end of the development cycle, the users said, &amp;quot;We know we said this was for internal use, but we want to use this application over the Internet.&amp;quot; &lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;Bam! That is the kind of major requirements change that can kill projects.&lt;span&gt;&amp;nbsp; &lt;/span&gt;After some research, we factored the database calls into an IDataAccess interface that had two implementors: the original database layer and a web service layer that then called the original database layer.&lt;span&gt;&amp;nbsp; &lt;/span&gt;On startup, the app figures out which interface to use.&lt;span&gt;&amp;nbsp; &lt;/span&gt;As our research and prototyping showed, web services are plenty fast for this scenario.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;My current project is also a rich client backed by web services, and we are discussing how quickly the UI needs to respond to the user.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Microsoft&amp;#39;s &lt;a href="http://msdn2.microsoft.com/en-us/library/ms740089.aspx"&gt;performance guidelines&lt;/a&gt;&amp;nbsp;&lt;/font&gt;&lt;font face="Courier New"&gt;suggest one threshold, &amp;quot;A good guideline for interactive response is 500 milliseconds.&amp;quot;&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;Jim Webber&amp;nbsp;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;a href="http://webservices.org/weblog/jim_webber/even_if_you_think_you_can_beat_waldo_you_can_t_beat_einstein"&gt;estimates&lt;/a&gt; that SOAP adds 14 milliseconds round trip.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Network latency is usually less than 50 milliseconds round trip in the US, increasing roughly linearly to a rough maximum of 300 milliseconds worldwide.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;In my experience, a hit to an optimized database costs roughly 20 ms, plus latency to the database machine of another 5-10 ms.&lt;span&gt;&amp;nbsp; &lt;/span&gt;So we are looking at 14 + 50 + 20 + 10 = 94ms.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Add in another 50 ms for authentication, authorization and business logic on the server, which leaves the UI well under the 500 ms limit.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Anyone have numbers for how much SSL increases latency? &lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;I just did some performance testing that supports these numbers as reasonable.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Using a unit test that connects to the web service and uses it to insert a row in a database (everything on the same machine), I was seeing average call times of 15 ms.&lt;span&gt;&amp;nbsp; &lt;/span&gt;That leaves room for a lot of latency before the application slows down.&lt;/font&gt;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoPlainText"&gt;&lt;font face="Courier New"&gt;On my project four years ago, we were forced into a finer grained (more talkative) interface by previous decisions.&lt;span&gt;&amp;nbsp; &lt;/span&gt;These days, I&amp;#39;m choosing this architecture with my eyes open, and I like the view.&lt;/font&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=934884" width="1" height="1"&gt;</content><author><name>Ted_Graham</name><uri>http://weblogs.asp.net/members/Ted_5F00_Graham.aspx</uri></author><category term=".NET best practices" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET+best+practices/default.aspx" /><category term="Software Process" scheme="http://weblogs.asp.net/tgraham/archive/tags/Software+Process/default.aspx" /><category term="Advanced .NET Techniques" scheme="http://weblogs.asp.net/tgraham/archive/tags/Advanced+.NET+Techniques/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/.NET/default.aspx" /><category term="ASP.NET" scheme="http://weblogs.asp.net/tgraham/archive/tags/ASP.NET/default.aspx" /><category term="Windows Forms" scheme="http://weblogs.asp.net/tgraham/archive/tags/Windows+Forms/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/tgraham/archive/tags/General+Software+Development/default.aspx" /></entry></feed>