<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/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>WCF LOB Adapter SDK and BizTalk Adapter Pack : WCF LOB Adapter SDK</title><link>http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx</link><description>Tags: WCF LOB Adapter SDK</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Things to consider when writing WCF LOB Adapters for consumption through BizTalk</title><link>http://blogs.msdn.com/adapters/archive/2009/03/12/things-to-consider-when-writing-wcf-lob-adapters-for-consumption-through-biztalk.aspx</link><pubDate>Thu, 12 Mar 2009 08:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9471336</guid><dc:creator>SandeepP</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/adapters/comments/9471336.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=9471336</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; mso-themecolor: text2; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; mso-themecolor: text2; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;If you are writing a WCF LOB adapter that can be consumed through BizTalk, you need to be aware of certain issues that can manifest because of the way BizTalk interacts with WCF adapters. Some of these can have performance and scalability impact and hence you should consider them when designing/configuring the adapter.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;Processing in IConnection/IConnectionFactory instance – When using SSO, for each message, BizTalk will end up creating a new IConnectionFactory and a new IConnection instance. If your adapter is doing a lot of processing in either of those instances, it can cause significant performance impact. So you will need to think of alternatives – possibly doing the processing upfront and caching.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;Caching of LOB artifacts on IConnection instance – Typically you will have some LOB artifacts that will comprise the context associated with an IConnection instance. If your adapter is using WCF LOB Adapter SDK’s connection pooling, in the non SSO scenario, the IConnection instances will be closed only when the idle connection timeout expires. So you need to think about freeing up the LOB resources that comprise your connection context. If you make idle connection timeout too small, it would impact performance since LOB connection creation will incur an overhead and if you keep it at a large value then you will be holding on to LOB artifacts for a longer time than you really need to, possible scalability/performance impact. &lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;Throughput stall – You can find more details about the issue on &lt;A href="http://blogs.msdn.com/adapters/archive/2008/08/18/throughput-stalls-when-using-adapters-developed-against-the-wcf-lob-adapter-sdk-in-biztalk.aspx" target=_blank&gt;&lt;SPAN style="COLOR: #1f497d; mso-themecolor: text2"&gt;http://blogs.msdn.com/adapters/archive/2008/08/18/throughput-stalls-when-using-adapters-developed-against-the-wcf-lob-adapter-sdk-in-biztalk.aspx&lt;/SPAN&gt;&lt;/A&gt;.&amp;nbsp; Note that if you don’t limit the number of concurrent connections through your adapter, you won’t run into this problem. The problem happens the contention between Open and Send/Execute for thread pool threads. &lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;Writing/promoting properties to BizTalk message context – When the adapter receives a WCF message from BizTalk, it will have all the properties comprising the BizTalk message context. For messages that originate from the adapter, if you want to have properties either written/promoted to BizTalk message context, you can look at &lt;A href="http://technet.microsoft.com/en-us/library/bb246105.aspx"&gt;&lt;SPAN style="COLOR: #1f497d; mso-themecolor: text2"&gt;http://technet.microsoft.com/en-us/library/bb246105.aspx&lt;/SPAN&gt;&lt;/A&gt; on how to go about doing that.&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #1f497d; FONT-FAMILY: 'Calibri','sans-serif'; mso-bidi-font-family: Arial; mso-themecolor: text2"&gt;Transaction overhead – BizTalk will by default start a transaction and send the message/process the response in that transaction scope. This can cause a significant overhead particularly if say the LOB doesn’t support transactions. In BizTalk 2009, there is an option on the Send port that lets you configure whether transactions should be enabled or not. &lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9471336" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category><category domain="http://blogs.msdn.com/adapters/archive/tags/BizTalk/default.aspx">BizTalk</category><category domain="http://blogs.msdn.com/adapters/archive/tags/Adapter+Pack/default.aspx">Adapter Pack</category></item><item><title>Throughput stalls when using adapters, developed against the WCF LOB Adapter SDK, in BizTalk</title><link>http://blogs.msdn.com/adapters/archive/2008/08/18/throughput-stalls-when-using-adapters-developed-against-the-wcf-lob-adapter-sdk-in-biztalk.aspx</link><pubDate>Mon, 18 Aug 2008 18:21:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8876625</guid><dc:creator>mdoctor</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/adapters/comments/8876625.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=8876625</wfw:commentRss><description>&lt;p&gt;We’ve had a few users complaining about the throughput of the adapters (the Adapter Pack ones, and/or custom ones) coming to a standstill during normal operation within BizTalk. In this post, I’ll explain why that happens, and some workarounds.&lt;/p&gt; &lt;p&gt;Let’s say BizTalk has received 100 messages which it needs to send to the adapter on a Send Port. Assume that it queues 50 work items on 50 thread pool threads, with each work item containing 2 messages to be processed.&lt;/p&gt; &lt;p&gt;Now, on each of the above thread pool threads, the logic used is something similar to:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;font color="#006633"&gt;&lt;strong&gt;1. for (int i=0; i &amp;lt; numberOfMessages; i++)&lt;/strong&gt;&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;font color="#006633"&gt;&lt;strong&gt;2. {&lt;/strong&gt;&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#006633"&gt;&lt;strong&gt;3. IRequestChannel channel = CreateNewIRequestChannel();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#006633"&gt;&lt;strong&gt;4. channel.Open();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#006633"&gt;&lt;strong&gt;5. channel.BeginRequest(message[i], callbackFunction);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;em&gt;&lt;font color="#006633"&gt;&lt;strong&gt;6. }&lt;/strong&gt;&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;IRequestChannel above maps to an adapter channel – IOutboundHandler in the Adapter SDK.&lt;/p&gt; &lt;p&gt;Now, many of the LOB systems for which the adapters are written are do not have an asynchronous version of the LOB API or SDK, i.e., the LOB API is synchronous – blocks the current thread while the invocation occurs. However, as can be seen above, a call to &lt;em&gt;BeginRequest()&lt;/em&gt; is made, which means that the caller wants the adapter channel implementation to return immediately. Therefore, in the Adapter SDK, the implementation is:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font color="#004000"&gt;7. BeginRequest(Message message, Callback callbackFunction)&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font color="#004000"&gt;8. {&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#004000"&gt;9. ThreadPool.QueueUserWorkItem(channel.Request, message, callbackFunction);&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#004000"&gt;10. return immediately;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font color="#004000"&gt;11. }&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;What the Adapter SDK does is, since it needs to return immediately, it queues an additional work item in the thread pool queue. The work item, when run, will call &lt;em&gt;Request()&lt;/em&gt;, which is a synchronous call, which maps to &lt;em&gt;IOutboundHandler::Execute()&lt;/em&gt; in the adapter, with the message as the parameter. Once the adapter finishes processing the message (synchronously) on the thread pool thread, the Adapter SDK takes care of invoking the callback function to notify BizTalk that the message has completed processing, and to hand the response message to BizTalk.&lt;/p&gt; &lt;p&gt;Also, one more piece of information – the &lt;em&gt;channel.Open()&lt;/em&gt; call in line number 4 above, is handled by the Adapter SDK. When the &lt;em&gt;Open()&lt;/em&gt; call reaches the Adapter SDK, it tries to obtain a free connection from the connection pool, or create a new connection to the LOB provided the maximum number of connections hasn’t been reached. If it is unsuccessful in both attempts, it blocks until a connection becomes available. Note - The adapters in the Adapter Pack expose a setting (typically named MaxConnectionsPerSystem, or MaxPoolSize, etc); the value of which is passed on to the Adapter SDK via a setting it exposes; custom adapters might expose something similar which the end user can tweak.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Given the two blocks of code above, and the behavior of the &lt;em&gt;Open()&lt;/em&gt; call, it is now easy to come up with a situation where you can see a throughput stall.&lt;/p&gt; &lt;p&gt;Assume that the maximum number of threads in the thread pool is 100. Also, let’s say that the maximum number of connections allowed to the LOB system is 10. You receive a large number of messages from your Receive Location (for example, 500?), and BizTalk, in all its enthusiasm, queues up all messages (one message per work item – lets refer to these work items as W1) on threads from the thread pool. Therefore, you have 100 threads (suppose, since its the maximum number of allowable threads in the thread pool), all of them beginning to execute lines 1 to 6 above. Only 10 threads are able to proceed past line number 4, since they were able to open a connection to the LOB (your maximum number of connections is configured to be 10, remember?). The other 90 threads are blocked at line number 4, waiting for a connection to become available.&lt;/p&gt; &lt;p&gt;Of the 10 which passed 4, they proceeded to 5, which means they now enter lines 7 to 11. They all queue up work items (lets call these work items W2) on the the thread pool (courtesy line number 9), and return immediately. These 10 threads are now freed up, which enables them to go and pick more items to work on from the thread pool queue.&lt;/p&gt; &lt;p&gt;Now, the actual processing against the LOB (and the real usage of the connection which was successfully opened in step 4) only happens when W2 gets a chance to do its work. However, the 10 threads which were freed up, they won’t process W2. Why? Because ahead of W2, there are yet 400 more W1 work items (BizTalk had queued 500 items, remember) in the queue. Hence, the 10 threads will pick up 10 more W1 work items. These work items of course can’t progress since they are in the same state as the other 90 – there is no connection available. And a connection won’t become available until a W2 work item will relinquish it, but it can’t since it can only do its work once a thread becomes available, and that will only happen when one of the current 100 threads (which are all stuck on line 4) gets freed up, and …… and you have a thread pool starvation problem.&lt;/p&gt; &lt;p&gt;How do you work around this? A number of ways, and possibly, you need to use a combination of some of them (at least the ones in your control) to work around this:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;One point where the threads are stuck is on line number 4. Easy – just increase the number of connections available to the LOB to a really large number, and your problem goes away. Right? Well, you might be prevented from doing that based on server resources, licenses, etc. &lt;/li&gt; &lt;li&gt;Lines 7 to 11 are responsible for queuing additional work items in the thread pool queue. You could avoid that if there was no need to queue a work item – for example, if your LOB exposed an asynchronous API, you could directly invoke that, passing it the callback routine pointer to “call back” on once it completed, and you could return immediately after kicking off that asynchronous API. Of course, this is not always possible. For example, LOBs like SAP and Siebel – the SDKs which we use did not offer an asynchronous API which we could use in the adapters.&lt;/li&gt; &lt;li&gt;One of the limitations which led to this situation, was that the maximum number of threads in the thread pool was limited. If you could increase the number of threads in the pool to a sufficiently large number, you wouldn’t see this problem. BizTalk exposes a setting for increasing the number of threads – see &lt;a title="http://msdn.microsoft.com/en-us/library/cc296779.aspx" href="http://msdn.microsoft.com/en-us/library/cc296779.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc296779.aspx&lt;/a&gt;. Note that you should try this out in your environment, since increasing it to a large value could possibly hurt performance.&lt;/li&gt; &lt;li&gt;In my example above, I’ve assumed that if there are 100 threads in the thread pool (maximum), all threads are being used during the processing of messages for my adapter. This is not always the case – the BizTalk runtime (and possibly other artifacts in the same process) will compete for threads from the thread pool, leaving lesser threads for you to work with. One way around this is to configure the send handler for your adapter to run in its own host instance (which means a separate process), leading to lesser contention for the threads from the pool in your process.&lt;/li&gt; &lt;li&gt;If you look at the code again, you notice that the main reason you got into this situation, was BizTalk itself – it queued up a huge number of messages (lines 1 to 6). The link mentioned above contains the information on settings which control the number of messages BizTalk processes simultaneously; tweaking something here can possibly help.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The safest way would be to ensure that the number of messages BizTalk hands to the adapter (lines 1 to 6) is the same as the maximum number of connections allowed to the LOB. I’m not 100% sure, but I think the In-Process Messages Per CPU setting can be used for this purpose; I’ll have to go through all the documentation for the throttling settings a little more thoroughly – meanwhile, you can do the same (the link available in point number 3 above seems to be the place to start).&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8876625" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category><category domain="http://blogs.msdn.com/adapters/archive/tags/BizTalk/default.aspx">BizTalk</category></item><item><title>Changes to the WCF LOB Adapter SDK in SP2</title><link>http://blogs.msdn.com/adapters/archive/2008/07/21/changes-to-the-wcf-lob-adapter-sdk-in-sp2.aspx</link><pubDate>Mon, 21 Jul 2008 21:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8762233</guid><dc:creator>mdoctor</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/adapters/comments/8762233.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=8762233</wfw:commentRss><description>&lt;P&gt;If you’re developing your own adapters against the WCF LOB Adapter SDK, then it might be worth your while to try out the June CTP of the SP2 of the WCF LOB ASDK. There are a few minor changes, but we might make more based on your feedback.&lt;/P&gt;
&lt;P&gt;I’m mentioning the changes from SP1 to the June CTP of SP2 in brief. For more details, you should refer to the documentation.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Support for VS 2008 and .NET 3.5.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Pre SP2, the ASDK allowed all input channel shapes – IInputChannel, IInputSessionChannel, IReplyChannel, and IReplySessionChannel. In SP2, there is a setting exposed to the adapter, which allows the adapter to control which of the above four shapes should be allowed. This is important when the adapter is used with BizTalk, and you want to integrate the LOB transaction (assuming it understands System.Transaction) with the BizTalk MessageBox transaction – in such a situation, you only want to allow one-way channels to be used. In other cases (SAP for example), where a reply always needs to be sent back to the LOB, you might want to only allow two-way channels.&lt;/LI&gt;
&lt;LI&gt;Pre SP2, the WSDL generated (based on the operations selected in the Metadata Search Browse (MSB)&amp;nbsp;UI) was always compiled before being returned to the caller (or being converted to a WCF proxy). In some situations (e.g., where the adapter is overriding the XSD generation to return metadata for – let’s say a System.Data.DataSet) – the XSD/WSDL might not compile (even though svcutil.exe can successfully convert it to a WCF proxy). In order to allow this, a setting is exposed to the adapter which determines whether the WSDL should be compiled or not, before being converted to a WCF proxy. The advantage of compilation is that it can catch “real” errors in the wsdl.&lt;/LI&gt;
&lt;LI&gt;There are two new QualifiedTypes added for System.Data.DataSet. (For “why two” and “why not just one”, refer to the documentation).&lt;/LI&gt;
&lt;LI&gt;Pre SP2, when using the “Consume Adapter Service” tool in a BizTalk project, the XSD files generated had names like “MyBinding1.xsd”, “MyBinding2.xsd”, etc. Even though a “filename prefix” textbox was present, it had a couple of drawbacks - (a) the user had to provide the prefix, which might not clearly indicate what the XSDs contained, and (b) the same prefix applied to all XSDs generated during the metadata resolution of all operations selected in the UI. In SP2, it is now possible for the adapter to specify a “filename hint” for each XSD generated.&lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8762233" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category></item><item><title>Connection Pooling in the WCF LOB ASDK based adapters.</title><link>http://blogs.msdn.com/adapters/archive/2008/04/13/connection-pooling-in-the-wcf-lob-asdk-based-adapters.aspx</link><pubDate>Sun, 13 Apr 2008 18:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8387147</guid><dc:creator>mdoctor</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/adapters/comments/8387147.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=8387147</wfw:commentRss><description>&lt;P&gt;I was recently contacted by a customer using the SAP Adapter. They were using the Adapter directly via a WCF proxy (i.e., without using BizTalk) from within an ASP.NET application. Their complaint was that the throughput was very low. On investigating further, I found that the reason was due to connections being opened and closed, as well as metadata being retrieved from SAP, for every call. All this in spite of the binding property "EnableConnectionPooling" being true. That's strange you might think, but not&amp;nbsp;once you&amp;nbsp;know the details of how the ASDK functions ...&lt;/P&gt;
&lt;P&gt;In the WCF LOB ASDK, there was a need for maintaining a pool of open connections to the LOB, since opening connections to LOB systems is usually expensive. When a connection is required by a channel to a particular LOB server (as determined by the URI), with a specific set of credentials, then the appropriate connection is picked up from the pool and used; when the channel is closed, the connection is returned back to the pool.&lt;/P&gt;
&lt;P&gt;In the current ASDK design,&amp;nbsp; the connection pools are maintained at the channel factory instance. (The exact reasons of why this design was chosen - topic of another blog post). What this means is that if you have two channel factory instances, then each channel factory has its own set of connection pools. i.e., for a server A, each channel factory will have one connection pool for this server.&amp;nbsp;Connections from the pools in one channel factory cannot be used by another channel factory.&lt;/P&gt;
&lt;P&gt;Another set of objects which are cached are metadata objects. The adapters, at runtime, when receiving a message (corresponding to some LOB operation), first connect to the LOB to obtain metadata for the operation. This is required in order to understand how to parse the request message (for example - how many parameters does the function have? What are their names? etc). Once metadata is obtained from the LOB, this metadata is cached within the ASDK. There are a number of settings (exposed by the ASDK to the adapter)&amp;nbsp;which determine for how long is the metadata cached, where is it cached, etc. The adapter has control over whether the ASDK should cache the metadata at an AppDomain level (i.e., "static"), or per channel factory instance. The SAP Adapter instructs the ASDK to cache the metadata per channel factory instance. (Why?&amp;nbsp;Another blog post).&lt;/P&gt;
&lt;P&gt;At this point, here's&amp;nbsp;what we know&amp;nbsp;- in the SAP Adapter, both, the connection pools, as well as the metadata caches, are maintained within each&amp;nbsp;channel factory object. If you have two channel factories, then you will have a separate set of connection pools and metadata objects. The connection pools and metadata objects are freed up only when the channel factory object is closed.&lt;/P&gt;
&lt;P&gt;Now, when you use the Metadata Search Browse tool (using "Add Adapter Service Reference") in your application, we generate an interface (which is the ServiceContract), as well as a client proxy. For example, if you generated the client proxy for RFC_CUSTOMER_GET, you would see a proxy class generated named RfcClient, as well as an interface named Rfc. To use the generated proxy, you would have code similar to:&lt;/P&gt;&lt;FONT color=#2b91af size=2&gt;
&lt;P&gt;RfcClient&lt;/FONT&gt;&lt;FONT size=2&gt; client = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;RfcClient&lt;/FONT&gt;&lt;FONT size=2&gt;(binding, endpointAddress);&lt;BR&gt;client.Open();&lt;BR&gt;client.RFC_CUSTOMER_GET();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//do work here&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;client.Close();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Now, here's something which you might not know - every time you create an instance of RfcClient, this causes a new channel factory to be created, and then, from that channel factory, a channel is created. When you close the RfcClient object, the channel is closed, as well as the channel factory. This leads to the connection pool being closed (i.e., all connections in the pool are closed), and the metadata objects are freed up. When you create a new instance of RfcClient, another channel factory is created, which comes with its own pool and metadata cache. Therefore, effectively, connections are not being pooled, (and neither is the metadata cache acting as a cache), since they are freed up the moment the RfcClient object is closed.&lt;/FONT&gt; &lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;So, how do you get around this? One way would be to cache the RfcClient object, and then use that from multiple threads (for example). However, this really doesn't help. The reason being, that the RfcClient object not only represents one channel factory, but also just one channel (which ultimately maps to one LOB connection). Therefore, if you have, say, 50 threads accessing the same RfcClient object, they will all ultimately end up using the same LOB connection, which will definitely not be good for performance.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;What you really want to do, is open one channel factory, cache that, and then, open and close channels at will from that channel factory. When you open a channel, a connection will be obtained from the connection pool; and when you close the channel, the connection will be released back to the pool. Plus, the metadata cache will be shared across the channels, since they are part of the same channel factory.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;So, how do you this? You can't use the RfcClient proxy. Instead, you need to use the ChannelFactory&amp;lt;&amp;gt; class, and use the generated ServiceContract (which will be named Rfc if you added only RFCs in the "Add Adapter Service Reference" wizard). (You can always figure out the name of the interface, by looking up the definition of the generated proxy, and seeing which interface it implements). Thus, you need to do something like:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;//do this only once&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;ChannelFactory&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Rfc&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt; factory = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;ChannelFactory&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Rfc&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt;(binding);&lt;BR&gt;factory.Open();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//cache the "factory" object somewhere.&lt;/P&gt;
&lt;P&gt;//When you need to make a call to SAP:&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Rfc&lt;/FONT&gt;&lt;FONT size=2&gt; channel = factory.CreateChannel(endpointAddress);&lt;BR&gt;channel.RFC_CUSTOMER_GET();&lt;BR&gt;((&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IChannel&lt;/FONT&gt;&lt;FONT size=2&gt;)channel).Close();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;//that's all.&lt;/P&gt;
&lt;P&gt;//When you ultimately want to free up&lt;BR&gt;//all connections in the pool, and free&lt;BR&gt;//up all the stored metadata,&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;factory.Close();&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8387147" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category></item><item><title>Announcing the Microsoft BizTalk Adapter Pack – Office Developer Program</title><link>http://blogs.msdn.com/adapters/archive/2008/03/30/announcing-the-microsoft-biztalk-adapter-pack-office-developer-program.aspx</link><pubDate>Sun, 30 Mar 2008 18:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8344394</guid><dc:creator>sreeramn</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/adapters/comments/8344394.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=8344394</wfw:commentRss><description>&lt;P&gt;As was already announced on this forum, the BizTalk Adapter Pack (BAP) was &lt;A class="" href="http://blogs.msdn.com/adapters/archive/2008/02/15/biztalk-adapter-pack-released.aspx" target=_blank mce_href="http://blogs.msdn.com/adapters/archive/2008/02/15/biztalk-adapter-pack-released.aspx"&gt;announced&lt;/A&gt; more than a month ago during the Office Developer Conference and became available starting March 1st. The BAP provides a robust and comprehensive out-of-the-box connectivity infrastructure to three major line-of-business (LOB) systems - SAP, Siebel, and Oracle Databases. The technology is based on the &lt;A href="http://technet.microsoft.com/en-us/library/bb798126.aspx" target=_blank mce_href="http://technet.microsoft.com/en-us/library/bb798126.aspx"&gt;Windows Communication Foundation (WCF) LOB Adapter SDK&lt;/A&gt; and inherently relies on the core WCF concepts, principles, and classes implemented in the .NET Framework 3.5. &lt;/P&gt;
&lt;P&gt;Along with the BAP, we also launched the &lt;B&gt;BizTalk Adapter Pack – Office Developer Program&lt;/B&gt;, designed to validate the use of the BizTalk Adapter Pack as a connectivity solution in direct integration scenarios with Microsoft Office SharePoint Server (MOSS) 2007 and the Office Business Applications such as Microsoft Office Excel and Microsoft Office Word. The scope of the program is validation of six key scenarios, as depicted in the following diagram.&lt;B&gt;&amp;nbsp;&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;Customer Participation&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;&lt;B&gt;&lt;/B&gt;
&lt;P&gt;The BAP - Office Developer Program is now open for new customer nominations. Joining this program will provide you with access to conference calls with members of the BAP development team, access to private discussion forums, and the ability to discuss and report bugs and issues directly back to the team at Microsoft. 
&lt;P&gt;If you would like to work closely with the product team and implement and test any of the six scenarios in your solution, please fill out the &lt;A href="https://live.datstat.com/MSCSD-Collector/Survey.ashx?Name=AdapterPack_SharePoint_Survey_Final" target=_blank mce_href="https://live.datstat.com/MSCSD-Collector/Survey.ashx?Name=AdapterPack_SharePoint_Survey_Final"&gt;short survey&lt;/A&gt; and be specific in answering the questions to help us accurately evaluate your application. We will contact you shortly thereafter. If you have any questions, you can contact us via e-mail by clicking &lt;A href="mailto:btssoacp@microsoft.com?subject=BizTalk%20Adapter%20Pack%20participation" target=_blank mce_href="mailto:btssoacp@microsoft.com?subject=BizTalk%20Adapter%20Pack%20participation"&gt;here&lt;/A&gt;. 
&lt;P&gt;You can also get additional information about this program on the SharePoint Product Team blog&amp;nbsp;&lt;A class="" title="SharePoint Team Blog Site" href="http://blogs.msdn.com/sharepoint/archive/2008/03/24/announcing-the-microsoft-biztalk-adapter-pack-office-developer-program.aspx" mce_href="http://blogs.msdn.com/sharepoint/archive/2008/03/24/announcing-the-microsoft-biztalk-adapter-pack-office-developer-program.aspx"&gt;site&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;The BizTalk SOA Customer Programs Team&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8344394" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category><category domain="http://blogs.msdn.com/adapters/archive/tags/Adapter+Pack/default.aspx">Adapter Pack</category></item><item><title>Transactional behavior in a receive location using an adapter</title><link>http://blogs.msdn.com/adapters/archive/2008/03/23/transactional-behavior-in-a-receive-location-using-an-adapter.aspx</link><pubDate>Sun, 23 Mar 2008 14:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8332181</guid><dc:creator>mdoctor</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/adapters/comments/8332181.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=8332181</wfw:commentRss><description>Quite a few customers developing custom adapters built on the WCF LOB Adapter SDK have come back to us asking for details on how to have transactional behavior while receiving messages from the LOB and submitting them to BizTalk (receive location) - for example, assume in your receive location:&lt;BR&gt;&lt;OL&gt;&lt;LI&gt;You read some data from the LOB&lt;BR&gt;&lt;/LI&gt;&lt;LI&gt;You delete the data from the LOB (since you don't want to read it again)&lt;/LI&gt;&lt;LI&gt;In IInboundHandler, you construct a message containing this data&lt;/LI&gt;&lt;LI&gt;You return this message via the out parameter in the TryReceive function (in other words, you are submitting this message into BizTalk).&lt;/LI&gt;&lt;/OL&gt;If an error occurs after step 4, you have lost the data! (since it has already been deleted from the LOB).&lt;BR&gt;&lt;BR&gt;If your LOB supports transactions, then you can prevent this from happening - the same transaction can be used to read + delete the data from the LOB, as well as submit the message into BizTalk, and if anything fails at any point, everything is rolled back.&lt;BR&gt;&lt;BR&gt;More information on how you can do this - read this post by Sonu Arora at &lt;A href="http://blogs.msdn.com/sonuarora/archive/2007/06/19/transaction-support-in-inbound-message-exchange-handler.aspx" mce_href="http://blogs.msdn.com/sonuarora/archive/2007/06/19/transaction-support-in-inbound-message-exchange-handler.aspx" target="_blank"&gt;http://blogs.msdn.com/sonuarora/archive/2007/06/19/transaction-support-in-inbound-message-exchange-handler.aspx&lt;/A&gt;.&lt;BR&gt;&lt;BR&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8332181" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category></item><item><title>How To: Obtain a list of receive actions when an ASDK-based Adapter is used with BizTalk in a Receive Location</title><link>http://blogs.msdn.com/adapters/archive/2008/01/18/how-to-obtain-a-list-of-receive-actions-when-an-asdk-based-adapter-is-used-with-biztalk-in-a-receive-location.aspx</link><pubDate>Fri, 18 Jan 2008 08:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7146467</guid><dc:creator>mdoctor</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/adapters/comments/7146467.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=7146467</wfw:commentRss><description>&lt;P&gt;The WCF LOB Adapter SDK (ASDK) contains a behavior named "InboundActionEndpointBehavior" which you can add to your ServiceHost in inbound scenarios. What this behavior does is, at runtime, analyzes the contract deployed, determines the Actions on the Contract, and passes those to the adapter in the StartListener() call (on the IInboundHandler interface) via the "string[] actions" parameter. This allows the adapter to determine what actions the user is listening for, and send only messages of those type.&lt;/P&gt;
&lt;P&gt;More information on this can be found at: &lt;A href="http://blogs.msdn.com/sonuarora/archive/2007/06/11/passing-soap-actions-to-adapter-inbound-handler-for-filtering-type-of-listeners.aspx"&gt;http://blogs.msdn.com/sonuarora/archive/2007/06/11/passing-soap-actions-to-adapter-inbound-handler-for-filtering-type-of-listeners.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;What do you do when the adapter is used in a Receive Location from BizTalk? The WCF Adapter allows you specify endpoint behaviors for the ServiceHost which it creates, and that's how you can plug in the InboundActionEndpointBehavior. However, this doesnt work as expected. Reason - the WCF Adapter uses an "untyped" contract for the Service, i.e., the Action/ReplyAction is specified as "*" / "*". Hence, even if you add the endpoint behavior, the "string[] actions" array just contains "*". How would a user let the adapter know what operations he is interested in?&lt;/P&gt;
&lt;P&gt;Attached is a sample endpoint behavior which you can use. The primary difference between this behavior and the one which ships with ASDK is this - the ASDK behavior determines the list of actions from the deployed contract, and passes those to the adapter. On the other hand, the sample endpoint behavior (attached) gets the list of actions via user input. That is, while configuring your receive location, add this endpoint behavior (via the behaviors tab), and you'll see&amp;nbsp;two properties:&amp;nbsp;"receiveActions" and "delimiter". You need to concatenate all the actions into&amp;nbsp;a single string and set it on the "receiveActions" property. Also, specify the delimiter you used in the "delimiter" property. The behavior will then split the concatenated string into a list of actions, store them in an ASDK specific class, and add this object to the Binding Parameter Collection. ASDK will then pick out the actions from there and pass them to the adapter in the StartListener call.&lt;/P&gt;
&lt;P&gt;The attached .cs file contains comments towards the top of the file detailing how it needs to be compiled, and what entries need to be made in machine.config.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7146467" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/adapters/attachment/7146467.ashx" length="4686" type="text/plain" /><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category></item><item><title>Getting LOB metadata from SAP, OracleDB and Siebel adapter using svcutil</title><link>http://blogs.msdn.com/adapters/archive/2007/10/23/getting-metadata-for-sap-oracledb-and-siebel-adapter-using-svcutil.aspx</link><pubDate>Tue, 23 Oct 2007 11:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5620841</guid><dc:creator>Jayanthi S</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/adapters/comments/5620841.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=5620841</wfw:commentRss><description>&lt;P&gt;The WCF based adapters that ship in the Biztalk Adapter Pack&amp;nbsp;are WCF bindings. The svcutil tool can be used to get metadata for a LOB method using these bindings. The scheme in the URI determines which adapter binding is loaded by svcutil. However when using the svcutil tool, there is no easy way to specify the LOB credentials that should&amp;nbsp;be used to get metadata from the LOB. One way to specify the LOB credentials to our adapters is to set it in the URI.&amp;nbsp;However, by default (for security reasons) the adapters do not accept credentials in the URI. &lt;/P&gt;
&lt;P&gt;To get around this, you need to set the binding property acceptCredentialsInUri to true and then specify the LOB credentials in the URI. To be able to set binding properties or other custom settings when using svcutil.exe, you should&amp;nbsp;use the svcutil.exe.config file. &lt;A class="" title="svcutil config" href="http://msdn2.microsoft.com/en-us/library/aa395212.aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/library/aa395212.aspx"&gt;This&lt;/A&gt; article describes how to use it. &lt;/P&gt;
&lt;P&gt;Attached is a sample svcutil.exe.config which has the endpoint and binding configurations for all the three adapter bindings. Place this in the same folder as svcutil.exe.&lt;/P&gt;
&lt;P&gt;The following are sample command lines to use to get metadata from&amp;nbsp;our adapters.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;SvcUtil.exe "sap://user=youruser;passwd=yourpassword;Client=800;lang=EN@A/adapsap47/00?op=http://Microsoft.LobServices.Sap/2007/03/Rfc/RFC_GET_FUNCTION_INTERFACE"&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;SvcUtil.exe "oracledb://User=MYUSER;Password=MYPASSWORD@ADAPTER/?op=http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/AEMP/Insert"&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;&lt;B&gt;SvcUtil.exe "siebel://Username=MYUSER;Password=MYPASSWORD@mssebldemo:2321?SiebelObjectManager=SSEObjMgr_enu&amp;amp;SiebelEnterpriseServer=ent771&amp;amp;Language=enu&amp;amp;op=http://Microsoft.LobServices.Siebel/2007/03/BusinessObjects/Account/Agreement/Query"&lt;/B&gt;&lt;/P&gt;&lt;/STRONG&gt;
&lt;P&gt;Note the quotation mark&amp;nbsp;around the URI. In the configuration&amp;nbsp;for Siebel (in the attached config file) also note the idleConnectionTimeout without which it will take the default 1 minute for svcutil to terminate. Look for more details on the idleConnectionTimeout in a separate post on Siebel.&lt;/P&gt;
&lt;P&gt;Note also that if you use the Add Adapter Service Reference tool (that gets installed with the WCF LOB Adapter SDK) to get&amp;nbsp;metadata for a LOB method for use in a&amp;nbsp;C# or VB&amp;nbsp;project, the AcceptCredentialsInUri binding property will not be visible or settable. You can set the LOB credentials using the credentials tab in the tool.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5620841" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/adapters/attachment/5620841.ashx" length="1139" type="application/xml" /><category domain="http://blogs.msdn.com/adapters/archive/tags/SAP/default.aspx">SAP</category><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category><category domain="http://blogs.msdn.com/adapters/archive/tags/Siebel/default.aspx">Siebel</category><category domain="http://blogs.msdn.com/adapters/archive/tags/OracleDB/default.aspx">OracleDB</category><category domain="http://blogs.msdn.com/adapters/archive/tags/SQL/default.aspx">SQL</category><category domain="http://blogs.msdn.com/adapters/archive/tags/Oracle+E-Business/default.aspx">Oracle E-Business</category><category domain="http://blogs.msdn.com/adapters/archive/tags/Adapter+Pack/default.aspx">Adapter Pack</category></item><item><title>Sample - SQL Adapter built on the ASDK.</title><link>http://blogs.msdn.com/adapters/archive/2007/10/05/sample-sql-adapter-built-on-the-asdk.aspx</link><pubDate>Sat, 06 Oct 2007 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5300552</guid><dc:creator>mdoctor</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/adapters/comments/5300552.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adapters/commentrss.aspx?PostID=5300552</wfw:commentRss><description>&lt;P&gt;Attached is a sample SQL Adapter built on the ASDK. This adapter (being a sample), is rather simple:&lt;/P&gt;
&lt;P&gt;(a) Only stored procedure execution is supported.&lt;/P&gt;
&lt;P&gt;(b) For obtaining metadata about the result set returned by the stored procedure, the stored procedure is executed (GetSchemaOnly) with default values for each input parameter.&lt;/P&gt;
&lt;P&gt;(c) Parameters are assumed to be either IN, or INOUT. &lt;/P&gt;
&lt;P&gt;The adapter requires the Adventure Works sample database, which can be obtained from here: &lt;A href="http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004" mce_href="http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004"&gt;http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004&lt;/A&gt;. (I used AdventureWorksDB.msi).&lt;/P&gt;
&lt;P&gt;There is a test project included which should help you out in figuring how the connection uri should look like. The test project browses, searches, and gets the metadata for a stored procedure. Then, it executes a procedure to get the ManagerId for a particular employee.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5300552" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/adapters/attachment/5300552.ashx" length="44146" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/adapters/archive/tags/WCF+LOB+Adapter+SDK/default.aspx">WCF LOB Adapter SDK</category></item></channel></rss>