<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.alexthissen.nl/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Alex Thissen Weblog Build 1.15.10.1971 : .NET FX 3.0</title><link>http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx</link><description>Tags: .NET FX 3.0</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Workaround for missing "Edit WCF Configuration" menu option in Visual Studio</title><link>http://www.alexthissen.nl/blogs/main/archive/2008/08/28/workaround-for-missing-quot-edit-wcf-configuration-quot-menu-option.aspx</link><pubDate>Thu, 28 Aug 2008 09:48:00 GMT</pubDate><guid isPermaLink="false">badf6229-ffeb-484a-8c5a-fc9c9987c8f2:2933</guid><dc:creator>Alex Thissen</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.alexthissen.nl/blogs/main/rsscomments.aspx?PostID=2933</wfw:commentRss><comments>http://www.alexthissen.nl/blogs/main/archive/2008/08/28/workaround-for-missing-quot-edit-wcf-configuration-quot-menu-option.aspx#comments</comments><description>&lt;p&gt;Sometimes when you have a clean install of Visual Studio 2005 or 2008 the context menu item &amp;quot;Edit WCF Configuration&amp;quot; for a app.config or web.config will not show.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.alexthissen.nl/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/main/EditWcfConfiguration_5F00_2.png"&gt;&lt;img border="0" width="264" src="http://www.alexthissen.nl/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/main/EditWcfConfiguration_5F00_thumb.png" alt="EditWcfConfiguration" height="300" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The picture above &lt;span style="text-decoration:underline;"&gt;does&lt;/span&gt; show the menu item I&amp;#39;m talking about, but you may find that it is not there.&lt;/p&gt;
&lt;p&gt;Help is at hand: there is an easy workaround. Simply open up the Tools menu in Visual Studio and choose &amp;quot;Wcf Service Configuration Editor&amp;quot;. This will start the exact same tool, but doesn&amp;#39;t open your web/app.config. Close the tool straight away and right-click you config file. The &amp;quot;Edit WCF Configuration&amp;quot; context menu should be there now.&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t know exactly when the context menu goes missing, but I found that it occurs regularly for Virtual PC images. It might be totally unrelated to that though. The workaround works in all cases I encountered so far.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.alexthissen.nl/aggbug.aspx?PostID=2933" width="1" height="1"&gt;</description><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx">.NET FX 3.0</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.5/default.aspx">.NET FX 3.5</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category></item><item><title>Workflow Foundation performance</title><link>http://www.alexthissen.nl/blogs/main/archive/2007/08/05/workflow-foundation-performance.aspx</link><pubDate>Sat, 04 Aug 2007 21:48:20 GMT</pubDate><guid isPermaLink="false">badf6229-ffeb-484a-8c5a-fc9c9987c8f2:2819</guid><dc:creator>Alex Thissen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.alexthissen.nl/blogs/main/rsscomments.aspx?PostID=2819</wfw:commentRss><comments>http://www.alexthissen.nl/blogs/main/archive/2007/08/05/workflow-foundation-performance.aspx#comments</comments><description>&lt;p&gt;From my week in Redmond I still had notes on the performance session of WF. Instead of throwing them away, I thought I would share them. The session&amp;nbsp;follows the technical artical '&lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa973808.aspx" target="_blank"&gt;Performance Characteristics of Windows Workflow Foundation&lt;/a&gt;' for the larger parts. This means that the points on performance below are complementary to&amp;nbsp;the article. For more background and nice graphs, read the &lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa973808.aspx" target="_blank"&gt;article&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1. Persistence service&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Consider when to persist.&lt;/p&gt; &lt;p&gt;Persistence happens when:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;the WorkflowRuntime instance is stopped,  &lt;li&gt;a custom activity marked with PersistOnClose=true closes or  &lt;li&gt;when UnloadOnIdle=true for the persistence provider. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;An instance is handed to the persistence provider, which uses the binary formatter to serialize it, that then&amp;nbsp;gets passed to a GZipStream to compress the binary stream.&amp;nbsp;For unloading an instance first gets persisted, then unloaded from memory. Also, persistence occurs at the end of a TransactionScope (also marked as PersistOnClose).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2. Activity Execution Context cloning&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Write custom activities instead of cloning where high performance is required. &lt;/p&gt; &lt;p&gt;Issue: Workflow runtime uses AEC to maintain activity instance state and to run compensation logic.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;3. Transactions in WF Activities&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Use IPendingWork for simple workflow database transactions. Check out the WorkflowCommitWorkBatch in the SDK samples for more information. The workflow instance initial state is copied before the transaction in case of rollback. The use of System.Transaction means MSDTC occurs only if necessary.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;4. Nesting compensation&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Avoid nesting of compensating activities where performance is desired.&lt;/p&gt; &lt;p&gt;Issue: Because compensation retains a copy of the workflow instance state, nested compensation causes the state to multiply.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;5. Workflow tracking service&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Review your tracking profile for the required number of tracking events. Track only the events you really need.&lt;/p&gt; &lt;p&gt;Issue: Database operations caused by tracking affect performance.&lt;/p&gt; &lt;p&gt;The number of track points can be modified at runtime by editing the tracking profile. When batching is used the load is about 5% CPU usage for the SQL Server. Turning it off will make SQL Server CPU usage go up to 75%. The tracking service database can be partitioned into multiple tables. See &lt;a href="http://blogs.msdn.com/moustafa/" target="_blank"&gt;Moustafa&lt;/a&gt;'s blog. There are stored procedures you can run yourself and you can turn on automatic partitioning.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;6. Workflow activity complexity&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Optimize factors affecting state&lt;/p&gt; &lt;p&gt;Issue: State size affects persistence time.&lt;/p&gt; &lt;p&gt;Factors: Numbers of fields on the class. Properties and dependency properties being accessed. Serives being consumed. Workflow queues being used. Activity execution overhead.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;7. Workflow activation cost&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Consider startup time.&lt;/p&gt; &lt;p&gt;Issue: First time tree creation and validation.&lt;/p&gt; &lt;p&gt;Activation occurs when the workflow host calls WorkflowRuntime.CreateWorkflow. This startup time increases with the number of activities.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;8. ExternalDataExchange and parameters&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Consider serialized event data size&lt;/p&gt; &lt;p&gt;Issue: ExternalDataExchange and parameters are serialized through WF internal queues. Giant chunks of data will take more time to get serialized.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;9. Workflow declarative rules and policy&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Consider performance of rules&lt;/p&gt; &lt;p&gt;Issue: Declarative rules take longer than code conditions&lt;/p&gt; &lt;p&gt;Using the RuleEngine class can improve performance over the Policy activity. Rule priorities and chaining have a big effect on performance. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;10. Workflow instance dynamic update&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Consider performance&lt;/p&gt; &lt;p&gt;Issue: This mechanism is slow. &lt;/p&gt; &lt;p&gt;What it does is: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;instance is suspended  &lt;li&gt;clone the instance  &lt;li&gt;edit the clone  &lt;li&gt;validate changes (all validators are called on the new tree)  &lt;li&gt;apply changes&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;This has impact on tracking, tracing and persistence.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;11. Workflow dependency properties&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: Avoid when regular properties can be used.&lt;/p&gt; &lt;p&gt;Issue: Dependency properties are slower than regular .NET properties. There's just a few more .NET instructions in play.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;12. Workflow state machine root activity&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: avoid deeply nested states.&lt;/p&gt; &lt;p&gt;Issue: state transitions in and out of deeply nested states are expensive due to tree navigation and AEC cloning.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;13. Workflow runtime startup cost&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Recommendation: only use one WorkflowRuntime per AppDomain&lt;/p&gt; &lt;p&gt;Issue: Instantiating WorkflowRuntime and calling StartRuntime is expensive.&lt;/p&gt; &lt;p&gt;Why? Retrieves runtime config parameters. Starts default and custom services. These are significant performance configuration settings:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Runtime: EnablePerformanceCounters (default true) and ValidateOnCreate (defaults to true)  &lt;li&gt;TransactionService: EnableRetries  &lt;li&gt;SchedulerService: MaxSimultaneousWorkflows  &lt;li&gt;PersistenceService: EnableRetries, LoadIntervalSeconds, OwnershipTimeoutSeconds  &lt;li&gt;TrackingService: EnableRetries, IsTransactional (has nothing to do with real transactions, but will batch up tracking database writes), UseDefaultProfile (default profile will track all workflow level events and activity level events), PartitionOnCompletion  &lt;li&gt;DisableWorkflowDebugging&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.alexthissen.nl/aggbug.aspx?PostID=2819" width="1" height="1"&gt;</description><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx">.NET FX 3.0</category></item><item><title>Workflow Foundation Rules in Orcas</title><link>http://www.alexthissen.nl/blogs/main/archive/2007/04/11/workflow-foundation-rules-in-orcas.aspx</link><pubDate>Tue, 10 Apr 2007 21:21:04 GMT</pubDate><guid isPermaLink="false">badf6229-ffeb-484a-8c5a-fc9c9987c8f2:2784</guid><dc:creator>Alex Thissen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.alexthissen.nl/blogs/main/rsscomments.aspx?PostID=2784</wfw:commentRss><comments>http://www.alexthissen.nl/blogs/main/archive/2007/04/11/workflow-foundation-rules-in-orcas.aspx#comments</comments><description>&lt;p&gt;Again, some background on where we are with rules in WF version 1 (in .NET FX 3.0):&lt;/p&gt; &lt;p&gt;The Rules framework in WF allow you to define discrete and atomic rules using simple semantics. This makes it very approachable. WF Rules distinguish conditions (boolean evaluations) and rules (if-then-else semantics, where the if-part uses a condition). There are several out-of-the-box activities that use conditions (IfElse, While, Replicator, Conditioned Activity Group (CAG)), and one Policy activity that works with a RuleSet, consisting of multiple rules. Obviously, custom activities allow you to use both conditions and rules.&lt;/p&gt; &lt;p&gt;The conditions and rules are defined in XAML format, as a XML representation of a CodeDOM object model for the IL that will eventually be executed. By default, the XAML is defined in a .rules file, embedded in the assembly as a manifest resource file. The default editor allows you to build the rules in a C# or VB-like language (side note: the "VB-like" language is a running gag at Class-A, where &lt;a href="http://bloggingabout.net/blogs/mglaser" target="_blank"&gt;Mike Glaser&lt;/a&gt; coined this term during a Analysis Services training). These two flavors are as close to C#/VB as possible, but still an invention of the WF team. There is a document here that describes the differences (link and document will be up as soon as I get it from &lt;a href="http://blogs.msdn.com/moustafa/" target="_blank"&gt;Moustafa Khalil Ahmed&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;You can use tracking and tracing when working with rules. The RuleActionTrackingEvent tracks a rule name and the result of the condition evaluation. Rules condition evaluation is implicitly tracked by activity execution. All you need to do is build a tracking profile and listen for the user tracking events related to rules. This tracking is only available for rules executed from within a workflow. Tracing is provided by the Diagnostics API and involves nothing more than adding the tracing source for WF rules to your config file. This also means that (in contrast to tracking) rules tracing is available everywhere.&lt;/p&gt; &lt;p&gt;This is where we are at in v1.&lt;/p&gt; &lt;p&gt;Orcas rule changes involve an enhanced language support. In particular, there is support for &lt;/p&gt; &lt;ul&gt; &lt;li&gt;operator overloading  &lt;li&gt;new operator  &lt;li&gt;calling of extension methods.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Furthermore, WF includes bugfixes on bugs that have been reported so far.&lt;/p&gt; &lt;p&gt;As an example, take a look at this ELSE action of an imaginary rule that validates the order information:&lt;/p&gt; &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:consolas;"&gt; &lt;p style="margin:0px;"&gt;System.&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;"\tExecuting Rule: InvalidOrder"&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.invalidOrder = &lt;span style="color:blue;"&gt;new&lt;/span&gt; Microsoft.Rules.Samples.OrderError(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ItemNum)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.errors = &lt;span style="color:blue;"&gt;new&lt;/span&gt; Microsoft.Rules.Samples.OrderErrorCollection()&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.errors.Add(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.invalidOrder)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.errors.ReportErrors()&lt;/p&gt;&lt;/div&gt; &lt;p&gt;Notice how the new operator is used. Then imagine that the ReportErrors method is actually an extension method. Calling it will work as expected.&lt;/p&gt; &lt;p&gt;So, my take on this is that there aren't many enhancements available in the Workflow rules. Just good things like the bugfixes and the extra bits of language support.&lt;/p&gt; &lt;p&gt;The WF team is planning for the post-Orcas release, but there are no concrete plans yet, at least not any that Moustafa would tell about (as they might change).&lt;/p&gt;&lt;img src="http://www.alexthissen.nl/aggbug.aspx?PostID=2784" width="1" height="1"&gt;</description><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx">.NET FX 3.0</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.5/default.aspx">.NET FX 3.5</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category></item><item><title>What's new in .NET Framework 3.5.20209 (March 2007 CTP) Part 1</title><link>http://www.alexthissen.nl/blogs/main/archive/2007/02/28/what-s-new-in-net-framework-3-5-20209-march-2007-ctp-part-1.aspx</link><pubDate>Wed, 28 Feb 2007 09:44:00 GMT</pubDate><guid isPermaLink="false">badf6229-ffeb-484a-8c5a-fc9c9987c8f2:2761</guid><dc:creator>Alex Thissen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.alexthissen.nl/blogs/main/rsscomments.aspx?PostID=2761</wfw:commentRss><comments>http://www.alexthissen.nl/blogs/main/archive/2007/02/28/what-s-new-in-net-framework-3-5-20209-march-2007-ctp-part-1.aspx#comments</comments><description>&lt;P&gt;The .NET Framework 3.5 build 3.5.20209&amp;nbsp;was released earlier this morning as part of the Visual Studio Orcas March 2007 CTP. Find the downloads here:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=cf76fcba-07af-47ac-8822-4ad346210670&amp;amp;displaylang=en&amp;amp;tm" target=_blank&gt;Visual Studio Code Name "Orcas" March 2007 CTP (Self-extracting Install)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=c17c9fb8-2a4a-426d-b08b-6ae614d16a0d&amp;amp;displaylang=en&amp;amp;tm" target=_blank&gt;Visual Studio Code Name "Orcas" March 2007 CTP Team Foundation Server (Self-extracting Install)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=b533619a-0008-4dd6-9ed1-47d482683c78&amp;amp;displaylang=en&amp;amp;tm" target=_blank&gt;Visual Studio Code Name "Orcas" March 2007 CTP (Virtual PC image)&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;If you download the Virtual PC image, you get an image with both Team Foundation Server and VS Orcas installed. &lt;STRONG&gt;Update:&lt;/STRONG&gt;&amp;nbsp;&lt;STRIKE&gt;Recommended&lt;/STRIKE&gt;. See &lt;A class="" href="http://www.alexthissen.nl/blogs/main/archive/2007/03/05/errors-in-virtual-pc-image-orcas-march-2007-ctp.aspx" target=_blank&gt;this post&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The .NET FX 3.5.20209 contains a load of new assemblies and features. It's amazing how big the leap forward is. Instead of repeating the list of all the new features (that you can find at any of the download locations above), I will give my first hour impressions on the new FX. Here we go. I have some BIG things to show you.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Workflow gets WCF support&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The System.WorkflowServices assembly will make you drool. There are some new Activities for you to use in your workflow. These are called SendActivity and ReceiveActivity. These activities can be used inside a workflow to communicate to and from the workflow as a WCF service.&lt;/P&gt;
&lt;P&gt;Also, a new WorkflowServiceHost (plus corresponding WorkflowServiceHostFactory) complements the existing ServiceHost class for hosting services. It has a read-only property for the WorkflowRuntime and adds a WorkflowRuntimeBehavior to the end points automatically. It is this behavior that hosts the workflow's runtime.&lt;/P&gt;
&lt;P&gt;The NetTcpContentBinding&amp;nbsp;and WSHttpContextBinding are two new WCF bindings that derive from NetTcpBinding and WSHttpBinding respectively. They add the concept of contexts to the existing bindings. You will get two properties that you can set: ContextExchangeMechanism and ContextProtectionLevel. Both implementations use the ContextBindingElement class to bring &lt;/P&gt;
&lt;P&gt;ChannelManagerService is a new runtime service that registers handlers for the lifetime events of a workflow in the hosted runtime. It will manage the cache of WCF channels that are opened and used for a particular workflow instance.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;AJAX&amp;nbsp;ASP.NET Extensions integrated&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The ASP.NET 2.0 AJAX Extensions 1.0 are now integrated into the framework. They still exist in the System.Web.Extensions assembly and have been merged with the other stuff already there.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Client services&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;There are a whole bunch of new classes in the namespaces System.Web.ClientServices and System.Web.ClientServices.Providers. These classes seem to be intended in conjunction with Smart Client applications, that can have an off-line (network connection) state. The providers are used for authentication, profiles and&amp;nbsp;roles, just like for the application services. Here they have created a separate interface for the service contracts (where&amp;nbsp;this is not the case&amp;nbsp;for Application services). Finally, there is the possibility to retrieve and/or store client settings.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Changes&amp;nbsp;in System.Web.Extensions.dll&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Quick recap: the extension to ASP.NET 2.0 already included the RolesService and LoginService classes, which are WCF services with operations to attempt to log a user in and retrieve their roles. It also already had a ListView control and a DataPager that combine to form a pageable list view. These come complete with designers. And, there is a new Web Event for errors in web services, called WebServiceErrorEvent, that you can leverage in your ASP.NET health monitoring.&lt;/P&gt;
&lt;P&gt;Apart from the addition of the AJAX extensions and client services, there is now a third WCF service named ProfilesService, that can get profile properties from a user (possibly a member through Membership). Also, some minor renames in namespaces. The three WCF services are no longer under System.Web.Security, but System.Web.ApplicationServices.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Build provider for WCF&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Last, but not least, a new build provider is introduced for ASP.NET web sites, that can build service proxies for you by importing service map files (.svcmap). These files are created when adding Service References to an ASP.NET Web site and contain all details of the referenced services, including their meta-data files such as XSD schemas.&lt;/P&gt;
&lt;P&gt;More on .NET FX 3.5 and Visual Studio Orcas in later posts.&lt;/P&gt;&lt;img src="http://www.alexthissen.nl/aggbug.aspx?PostID=2761" width="1" height="1"&gt;</description><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx">.NET FX 3.0</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.5/default.aspx">.NET FX 3.5</category></item><item><title>Hosting the LoginService in .NET 3.5</title><link>http://www.alexthissen.nl/blogs/main/archive/2007/02/17/hosting-the-loginservice-in-net-3-5.aspx</link><pubDate>Sat, 17 Feb 2007 11:26:07 GMT</pubDate><guid isPermaLink="false">badf6229-ffeb-484a-8c5a-fc9c9987c8f2:2749</guid><dc:creator>Alex Thissen</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.alexthissen.nl/blogs/main/rsscomments.aspx?PostID=2749</wfw:commentRss><comments>http://www.alexthissen.nl/blogs/main/archive/2007/02/17/hosting-the-loginservice-in-net-3-5.aspx#comments</comments><description>&lt;p&gt;The January 2007 CTP version of Visual Studio "Orcas" has .NET FX 3.5 version 3.5.11209. One of the assemblies is System.Web.Extensions and hosts some great new additions to the ASP.NET stack. It has new classes in the namespace System.Web.Security, two of which are LoginService and RolesService. In this post we will take a look at the LoginService.&lt;/p&gt; &lt;p&gt;The LoginService class allows you to perform ASP.NET 2.0 Membership validation through a WCF service. This way other applications can also benefit from your efforts of setting up the membership service and maintaining the member&amp;nbsp;store behind it. Let's see how you do that:&lt;/p&gt; &lt;p&gt;The LoginService has been decorated&amp;nbsp;by the ServiceContract attribute. Four of its members are opted-in as operations via the OperationContract attribute: IsLoggedIn, Login, Logout and ValidateUser. A small fragment of the class:&lt;/p&gt; &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:9pt;background:#f5f5f5;padding-bottom:1pt;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt; &lt;p style="margin:0px;"&gt;[&lt;span style="color:teal;"&gt;AspNetCompatibilityRequirements&lt;/span&gt;(RequirementsMode = &lt;span style="color:teal;"&gt;AspNetCompatibilityRequirementsMode&lt;/span&gt;.Required)]&lt;/p&gt; &lt;p style="margin:0px;"&gt;[&lt;span style="color:teal;"&gt;ServiceContract&lt;/span&gt;]&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:teal;"&gt;LoginService&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; AuthenticatingEventHandler Authenticating;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; CreatingCookieEventHandler CreatingCookie;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;static&lt;/span&gt; LoginService();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; [&lt;span style="color:teal;"&gt;OperationContract&lt;/span&gt;]&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; IsLoggedIn();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; [&lt;span style="color:teal;"&gt;OperationContract&lt;/span&gt;]&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; Login(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username, &lt;span style="color:blue;"&gt;string&lt;/span&gt; password, &lt;span style="color:blue;"&gt;string&lt;/span&gt; customCredential, &lt;span style="color:blue;"&gt;bool&lt;/span&gt; isPersistent);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; [&lt;span style="color:teal;"&gt;OperationContract&lt;/span&gt;]&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Logout();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; OnAuthenticating(AuthenticatingEventArgs e);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; OnCreatingCookie(CreatingCookieEventArgs e);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; [&lt;span style="color:teal;"&gt;OperationContract&lt;/span&gt;]&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; ValidateUser(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username, &lt;span style="color:blue;"&gt;string&lt;/span&gt; password, &lt;span style="color:blue;"&gt;string&lt;/span&gt; customCredential);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:green;"&gt;// ...&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&lt;strong&gt;Hosting the service&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Both the LoginService and&amp;nbsp;RolesService&amp;nbsp;need the services of the ASP.NET pipeline. They indicate so by the AspNetCompatibilityRequirements attribute. This also means that this service must be hosted in IIS, instead of another type of host. Some easy steps are needed:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Create an ASP.NET Web Site or Application and add a reference to System.ServiceModel.dll and to System.Web.Extensions.dll. You can try all of this in a VPC with the Janurary 2007 build of VS Orcas, or copy the System.Web.Extensions.dll file from the VPC to your .NET 3.0 machine and use Visual Studio 2005 SP1&amp;nbsp;(I did the latter). &lt;li&gt;Add a .svc file (e.g. LoginService.svc) for the WCF service and change the ServiceHost directive to the following:&lt;br&gt;&lt;br&gt; &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:9pt;background:#f5f5f5;padding-bottom:1pt;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:blue;"&gt;@&lt;/span&gt;&lt;span style="color:red;"&gt;ServiceHost&lt;/span&gt; &lt;span style="color:red;"&gt;Language&lt;/span&gt;&lt;span style="color:blue;"&gt;=C#&lt;/span&gt; &lt;span style="color:red;"&gt;Debug&lt;/span&gt;&lt;span style="color:blue;"&gt;="true"&lt;/span&gt; &lt;span style="color:red;"&gt;Service&lt;/span&gt;&lt;span style="color:blue;"&gt;="System.Web.Security.LoginService"&lt;/span&gt; &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;Note that no CodeBehindFile attribute is needed, since the service type is already compiled.  &lt;li&gt;Create a web.config (if necessary and add a &amp;lt;system.serviceModel&amp;gt; element:&lt;br&gt;&lt;br&gt; &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:9pt;background:#f5f5f5;padding-bottom:1pt;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;serviceHostingEnvironment&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;aspNetCompatibilityEnabled&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;behaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;behavior&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;aspNetBehavior&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;serviceMetadata&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;httpGetEnabled&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;serviceDebug&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;includeExceptionDetailInFaults&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;behavior&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;behaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;services&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;service&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;aspNetBehavior&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Web.Security.LoginService&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;endpoint&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;binding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;basicHttpBinding&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;""&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;LoginServiceEndPoint&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;contract&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Web.Security.LoginService&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;endpoint&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;address&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;MEX&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;binding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;mexHttpBinding&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;""&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;MEX&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;bindingName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;MEX&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;contract&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;IMetadataExchange&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;service&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;services&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;The bolded part is perhaps the important bit here. This is where the ASP.NET compatibility is enabled. If you do not specify this, the service will not be available.  &lt;li&gt;Change the authentication mode of ASP.NET to Forms Authentication. You can do this by editing the web.config yourself or the ASP.NET Website Administration Tool, whichever you prefer best. While you're at it, create one or more test accounts in the Membership store, if you do not have an existing one. Membership is enabled by default, and the AspNetDb.mdf SQL Server Express database should be created automatically in your App_Data folder.  &lt;li&gt;Save it all and visit the URL &lt;a title="http://localhost:3254/ASPNETServicesViaWCF/loginservice.svc" href="http://localhost:1337/ASPNETServicesViaWCF/LoginService.svc"&gt;http://localhost:1337/ASPNETServicesViaWCF/LoginService.svc&lt;/a&gt;, subsituting your port number and site names if needed.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Creating a client&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;At this point you will have a working WCF service that allows clients to use the Membership services over WCF. Creating a client application is pretty straightforward, with one caveat. Just add a Service Reference and call the WCF service via the generated proxy like so:&lt;/p&gt; &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:9pt;background:#f5f5f5;padding-bottom:1pt;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:teal;"&gt;Program&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; username = &lt;span style="color:maroon;"&gt;"alex"&lt;/span&gt;, password = &lt;span style="color:maroon;"&gt;"Str0n5P@ssmoRD"&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:teal;"&gt;LoginService&lt;/span&gt; proxy = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;LoginServiceClient&lt;/span&gt;();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:teal;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:maroon;"&gt;"Validate user '{0}': {1}"&lt;/span&gt;, username,&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; proxy.ValidateUser(username, password, &lt;span style="color:teal;"&gt;String&lt;/span&gt;.Empty));&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:teal;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:maroon;"&gt;"Log in successful: {0}"&lt;/span&gt;, &lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; proxy.Login(username, password, &lt;span style="color:teal;"&gt;String&lt;/span&gt;.Empty, &lt;span style="color:blue;"&gt;true&lt;/span&gt;));&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:teal;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:maroon;"&gt;"Logged in: {0}"&lt;/span&gt;, proxy.IsLoggedIn());&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;The result of this bit of client code shows the following output:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img height="126" src="http://www.alexthissen.nl/blogs/main/WindowsLiveWriter/UsingLoginServicein.NET3.5_128D3/aspnetmeetswcf1.png" width="324"&gt; &lt;/p&gt; &lt;p&gt;You need to make sure that you allow and enable the client to accept cookies if you want to make use of a persistent login. The configuration is in your binding to the service. It should look like this:&lt;/p&gt; &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:9pt;background:#f5f5f5;padding-bottom:1pt;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;bindings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;basicHttpBinding&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;binding&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;LoginServiceEndPoint&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;allowCookies&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;basicHttpBinding&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;bindings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;client&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;endpoint&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;address&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://localhost:1337/ASPNETServicesViaWCF/LoginService.svc&lt;/span&gt;"&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;binding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;basicHttpBinding&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;LoginServiceEndPoint&lt;/span&gt;"&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;contract&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;WCFMeetsASPNET.localhost.LoginService&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;LoginServiceEndPoint&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;client&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&lt;strong&gt;&lt;br&gt;Extensibility points&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;There are also two extensibility points in the service, provided by the two &lt;strong&gt;static (!) &lt;/strong&gt;events Authenticating and CreatingCookie on the LoginService class. Each of these can have a single (although you could attach more: not recommended) handler attached in the global.asax.&amp;nbsp;The constructor of the HttpApplication derived class is a good place to attach the handler to each of the events.&lt;/p&gt; &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:9pt;background:#f5f5f5;padding-bottom:1pt;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:teal;"&gt;Global&lt;/span&gt;: &lt;span style="color:teal;"&gt;HttpApplication&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; Global()&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:teal;"&gt;LoginService&lt;/span&gt;.Authenticating += &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;AuthenticatingEventHandler&lt;/span&gt;(LoginService_Authenticating);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:teal;"&gt;LoginService&lt;/span&gt;.CreatingCookie += &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;CreatingCookieEventHandler&lt;/span&gt;(LoginService_CreatingCookie);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; LoginService_CreatingCookie(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:teal;"&gt;CreatingCookieEventArgs&lt;/span&gt; e)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// User name might not be same as login name&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; realUserName = &lt;span style="color:teal;"&gt;AuthenticationHelper&lt;/span&gt;.GetUserNameFromLogin(e.Username);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:teal;"&gt;FormsAuthentication&lt;/span&gt;.SetAuthCookie(realUserName, e.IsPersistent);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; e.CookieIsSet = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; LoginService_Authenticating(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:teal;"&gt;AuthenticatingEventArgs&lt;/span&gt; e)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; authenticated = &lt;span style="color:teal;"&gt;Membership&lt;/span&gt;.ValidateUser(e.Username, e.Password);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ticket = e.CustomCredential;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; e.Authenticated = authenticated &amp;amp;&amp;amp; &lt;span style="color:teal;"&gt;TicketAuthenticator&lt;/span&gt;.IsValidTicket(ticket);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; &amp;nbsp; e.AuthenticationIsComplete = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;Two possible scenarios are implemented in the code fragment above. &lt;/p&gt; &lt;p&gt;First off, you are able to use custom credentials for your login. These could be used instead of the username and password or complement it. The event arguments for Authenticating give you the user name, password and custom credentials as a set of string properties. The boolean Authenticated property indicates&amp;nbsp;whether the login has succeeded. If you managed to perform authentication the AuthenticationIsComplete should be set to true, or the regular mechanism will kick in (which may be what you want).&lt;/p&gt; &lt;p&gt;The other extensibility point is in the creation of the cookie. The handler for the CreatingCookie event gets arguments of type CreatingCookieEventArgs, that disclose the user name, password, custom credential and whether a persistent cookie should be created. You are given the opportunity to set the cookie yourself. Depending on the circumstances you could decide to not issue a persistent cookie, or alter the username before the cookie is created. However, to do so, you must set the cookie yourself and indicate that you have done so by changing CookieIsSet to&amp;nbsp;true. Also, the cookie that you issue must be a Forms Authentication cookie, containing a encrypted FormsAuthenticationTicket.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Some critical notes&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Although the addition of a WCF service that offers Membership authentication is really nice, I do raise some eyebrows to the implementation of the service. As good practice dictates the service interface should be separated from the implementation. But, it is not. This makes the use of the service less flexible. You will not be able to substitute your own alternative implementation of the same interface. Then again, remember this is a CTP implementation,&amp;nbsp;and the&amp;nbsp;LoginService&amp;nbsp;might or might not make it into the final release as it is now (or at all). Also, what will the plans be for the Login service that the Microsoft AJAX Library 1.0 makes use of? We'll see. Time will tell.&lt;/p&gt; &lt;p&gt;Happy progging.&lt;/p&gt;&lt;img src="http://www.alexthissen.nl/aggbug.aspx?PostID=2749" width="1" height="1"&gt;</description><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/ASP.NET+2.0/default.aspx">ASP.NET 2.0</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx">.NET FX 3.0</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.5/default.aspx">.NET FX 3.5</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/Security/default.aspx">Security</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category></item><item><title>XPS Essentials</title><link>http://www.alexthissen.nl/blogs/main/archive/2007/02/13/xps-essentials.aspx</link><pubDate>Tue, 13 Feb 2007 11:02:00 GMT</pubDate><guid isPermaLink="false">badf6229-ffeb-484a-8c5a-fc9c9987c8f2:2746</guid><dc:creator>Alex Thissen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.alexthissen.nl/blogs/main/rsscomments.aspx?PostID=2746</wfw:commentRss><comments>http://www.alexthissen.nl/blogs/main/archive/2007/02/13/xps-essentials.aspx#comments</comments><description>&lt;P&gt;Windows Presentation Foundation also introduced the Xml Paper Specification (XPS): Microsoft's counterpart to Adobe Portable Document Format (PDF). Where you need the &lt;A href="http://www.acrobat.com/" target=_blank&gt;Adobe Reader&lt;/A&gt; application to view PDF files, you will also need a viewer to see XPS documents.&lt;/P&gt;
&lt;P&gt;This is where the XPS Essentials Pack comes in. You can download it &lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=b8dcffdd-e3a5-44cc-8021-7649fd37ffee&amp;amp;displaylang=en&amp;amp;tm" target=_blank&gt;here&lt;/A&gt;. Once installed it will give you:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;XPS Document Writer&lt;/LI&gt;
&lt;LI&gt;Metadata and thumbnail handlers&lt;/LI&gt;
&lt;LI&gt;Rich-preview provider&lt;/LI&gt;
&lt;LI&gt;Search and index filters&lt;/LI&gt;
&lt;LI&gt;XPSDrv print driver components&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;These components let you create, view, preview, search, index and organize your XPS documents. You should check out the XPS Viewer EP application, which is a pretty nice WPF application. In thumbnail view it will show all pages in a grid. When you hover over one of the thumbnails it will enlarge to the foreground in an animated fashion. The direct neighbors will also come up a bit, giving a bubbling like effect.&lt;/P&gt;
&lt;P&gt;&lt;IMG height=467 src="http://www.alexthissen.nl/blogs/main/WindowsLiveWriter/XPSEssentials_C2C6/XPSEP%5B2%5D.png" width=640&gt; &lt;/P&gt;
&lt;P&gt;If you happened to install the Beta 2 version you will find that de-installing the beta is not possible by running the setup again or by visiting Add/Remove Programs in your control panel.&lt;/P&gt;
&lt;P&gt;Instead you should run the following command from the command line:&lt;/P&gt;
&lt;P&gt;msiexec /uninstall XPSEP.msi&lt;/P&gt;
&lt;P&gt;This will allow you to install XPS Essentials Pack 1.0 without problems after that.&lt;/P&gt;
&lt;P&gt;Side note: as you can see in the picture above, the XPS Document Writer still has some problems with PowerPoint and the Frutiger 57Cn font of Class-A. &lt;/P&gt;&lt;img src="http://www.alexthissen.nl/aggbug.aspx?PostID=2746" width="1" height="1"&gt;</description><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx">.NET FX 3.0</category></item><item><title>.NET 3.0 balloon joke</title><link>http://www.alexthissen.nl/blogs/main/archive/2006/11/08/net-3-0-balloon-joke.aspx</link><pubDate>Wed, 08 Nov 2006 01:41:00 GMT</pubDate><guid isPermaLink="false">badf6229-ffeb-484a-8c5a-fc9c9987c8f2:2018</guid><dc:creator>Alex Thissen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.alexthissen.nl/blogs/main/rsscomments.aspx?PostID=2018</wfw:commentRss><comments>http://www.alexthissen.nl/blogs/main/archive/2006/11/08/net-3-0-balloon-joke.aspx#comments</comments><description>&lt;P&gt;On &lt;A href="http://thewpfblog.com/"&gt;theWPFblog&lt;/A&gt; you can see the celebration of the release of the .NET Framework 3.0. &lt;A href="http://thewpfblog.com/?p=64" target=_blank&gt;This post&lt;/A&gt; shows a nice set of balloons over the logo and release date of .NET FX 3.0. Real nice demonstration of the possibilities of WPF, … except that it is a Flash animation!&lt;/P&gt;
&lt;P&gt;&lt;IMG title="Celebrating .NET FX 3.0" alt="Celebrating .NET FX 3.0" src="http://www.alexthissen.nl/weblog/blogs/athissen/netfx30celebration.jpg" border=0&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.alexthissen.nl/aggbug.aspx?PostID=2018" width="1" height="1"&gt;</description><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/Humor/default.aspx">Humor</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx">.NET FX 3.0</category></item><item><title>Releases for VS2005RTM</title><link>http://www.alexthissen.nl/blogs/main/archive/2006/01/21/releases-for-vs2005rtm.aspx</link><pubDate>Sat, 21 Jan 2006 01:51:00 GMT</pubDate><guid isPermaLink="false">badf6229-ffeb-484a-8c5a-fc9c9987c8f2:2093</guid><dc:creator>Alex Thissen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.alexthissen.nl/blogs/main/rsscomments.aspx?PostID=2093</wfw:commentRss><comments>http://www.alexthissen.nl/blogs/main/archive/2006/01/21/releases-for-vs2005rtm.aspx#comments</comments><description>&lt;P&gt;Just a set of links to stuff that has been released for the VS2005 RTM:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="" href="http://msdn.microsoft.com/library/?url=/library/en-us/dnpag2/html/EntLib2.asp" target=_blank&gt;Enterprise Library 2.0&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="" href="http://www.marcvandewert.nl/ct.ashx?id=41501171-af46-447c-9637-0bad46530b5c&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fdownloads%2fdetails.aspx%3fFamilyID%3d589e23dd-503e-4179-9858-d080c669f8b9%26DisplayLang%3den" target=_blank&gt;&lt;FONT color=#005bba&gt;Visual Studio 2005 Extensions for Windows Workflow Foundation Beta 1.2&lt;/FONT&gt;&lt;/A&gt; (from &lt;A class="" href="http://www.marcvandewert.nl/PermaLink,guid,41501171-af46-447c-9637-0bad46530b5c.aspx" target=_blank&gt;Marc van de Wert&lt;/A&gt;'s log)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Now you know as well.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.alexthissen.nl/aggbug.aspx?PostID=2093" width="1" height="1"&gt;</description><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+3.0/default.aspx">.NET FX 3.0</category><category domain="http://www.alexthissen.nl/blogs/main/archive/tags/.NET+FX+2.0/default.aspx">.NET FX 2.0</category></item></channel></rss>