<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9057379846514679550</id><updated>2012-02-11T23:14:05.052+01:00</updated><category term='Excel 2010'/><category term='Interoperability'/><category term='Content Database'/><category term='Microsoft'/><category term='BCS'/><category term='Dependency Injection'/><category term='Deployment'/><category term='Site Definition'/><category term='BizTalk'/><category term='Provision'/><category term='Consulting'/><category term='MasterPage'/><category term='Build'/><category term='Maintainability'/><category term='Integration'/><category term='SiteColumn'/><category term='Enterprise Architecture'/><category term='Administration'/><category term='Enterprise Portal'/><category term='VSTO'/><category term='SAP'/><category term='ALM'/><category term='OBA'/><category term='ObjectModel'/><category term='Organization'/><category term='Geneva'/><category term='Conference'/><category term='PageLayout'/><category term='NetWeaver'/><category term='Duet Enterprise'/><category term='Custom development'/><category term='Managed Property'/><category term='Code structure'/><category term='Identity Management'/><category term='web.config'/><category term='Sandbox solution'/><category term='InfoPath Forms Server'/><category term='Dynamic Configuration'/><category term='Functional Management'/><category term='Feature'/><category term='jQuery'/><category term='Information Architecture'/><category term='Publishing'/><category term='CSS'/><category term='Javascript'/><category term='Portal'/><category term='Office'/><category term='HPW'/><category term='WebSphere MQ'/><category term='Migration'/><category term='SharePoint'/><category term='Workflow'/><category term='Connector'/><category term='CAML'/><category term='SSO'/><category term='SharePoint 2010'/><category term='Search'/><category term='Web Service'/><category term='User eXperience'/><category term='VS2008'/><category term='Enterprise Search'/><category term='Content Type'/><category term='WebPart'/><category term='Tip'/><category term='ContentType'/><category term='Content Management'/><category term='WCF'/><category term='IE8'/><category term='WS-I'/><category term='Design Pattern'/><category term='standards'/><category term='Internet Explorer'/><category term='Audience'/><category term='Outphase'/><category term='DUET'/><category term='NetWeaver Gateway'/><category term='FBA'/><category term='WPF'/><category term='Installation'/><category term='Silverlight'/><category term='InfoPath'/><category term='.NET'/><category term='Best practice'/><title type='text'>Thoughts on SharePoint Development</title><subtitle type='html'>My professional but personal ideas, thoughts, experiences and opinions wrt SharePoint custom development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default?start-index=101&amp;max-results=100'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>126</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-8163903348673651667</id><published>2012-02-04T21:33:00.025+01:00</published><updated>2012-02-04T22:39:53.996+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><category scheme='http://www.blogger.com/atom/ns#' term='BCS'/><title type='text'>Impossible to use custom implementation of public BCS interface IEntityInstanceProvider</title><content type='html'>&lt;div&gt;SharePoint Business Connectivity Services contains out-of-the-box webparts to visualize external business data. All the standard BCS business data renderers utilize the pattern that data selection is delegated to a data provider control. The 2 controls are associated via consumer/provider connectionpoints. &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataDetailsWebPart&lt;/span&gt; is one of them. Its standard usage is for BCS profile pages. However, usage of this webpart on itself is not necessarily limited to that context alone. The webpart is selectable in the webpart gallery, and can be added to arbitrair SharePoint webpart page. The challenge is how to connect it to an external BCS entity. The trivial approach is to do it similar as on profile pages; feed it via the provider &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataItemBuilder&lt;/span&gt;. The working of &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataItemBuilder&lt;/span&gt; depends on an ‘ID’ querystring parameter. However, when that parameter is included in the url of a page with the 2 BCS webparts on it, SharePoint faults with an error message:&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:10pt;padding:10px;width:98%;'&gt;System.NullReferenceException: Object reference not set to an instance of an object.&lt;br/&gt;&amp;nbsp;&amp;nbsp;at Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapDataSource.OnInit(EventArgs e) &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;margin-top:10px;'&gt;This occurs because &lt;span style='font-family:Syntax;font-size:11pt;'&gt;PortalSiteMapDataSource&lt;/span&gt; &lt;span style='font-style:italic;'&gt;also&lt;/span&gt; reacts on the presence of ‘ID’ querystring parameter, but assigns another and in this context incorrect meaning to the value. When the ‘ID’ querystring parameter is renamed, the error is prevented. However, then the standard &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataItemBuilder&lt;/span&gt; no longer reacts on it.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;A proper solution seemed to build a custom provider that relies on another named querystring parameter to retrieve the BCS entity item. The BCS architecture has the promise to support this: it heavily decouples via interfaces from the specific BCS implementation classes. But this appears to be a false promise. Microsoft already points you to that via the warning accompanying the public (!!) interface &lt;span style='font-family:Syntax;font-size:11pt;'&gt;IEntityInstanceProvider&lt;/span&gt;&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:#e66a38;margin:10px;'&gt;&lt;div style='padding:20px;width:95%;font-style:italic;'&gt;This class and its members are reserved for internal use and are not intended to be used in your code.&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;'&gt;Still, since the interface is public; and also the connectionpoints are public; it sounded safe to expect it must work. But when I added both my own &lt;span style='font-family:Syntax;font-size:11pt;'&gt;IEntityInstanceProvider&lt;/span&gt; implemenation class and a &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataDetailsWebPart&lt;/span&gt; on a page; it was not possible to connect them; not in the GUI, and also not explicit in custom code. Via Reflector I reverse engineered the cause, to ultimately end up with the following:&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:10pt;padding:20px;width:90%;'&gt;Microsoft.SharePoint.WebPartPages.WebPartPageUserException was unhandled&lt;br /&gt;  Message=The connectionpoint BDWP Item on g_1e1e7d15_652d_44cd_bc7d_9026382ff33b is disabled.&lt;br /&gt;  Source=Microsoft.SharePoint&lt;br /&gt;  StackTrace:&lt;br /&gt;       at Microsoft.SharePoint.WebPartPages.SPWebPartManager.CanSPConnectWebPartsCore(WebPart provider, ProviderConnectionPoint providerConnectionPoint, WebPart consumer, ConsumerConnectionPoint consumerConnectionPoint, WebPartTransformer transformer, Boolean throwOnError) &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;margin-top:10px;'&gt;and digging deeper:&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:10pt;padding:20px;width:75%;'&gt;if (!providerConnectionPoint.GetEnabled(connectionAgentByInterfaceName))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (throwOnError)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new WebPartPageUserException(WebPartPageResource.GetString("SPWebPartConnection_DisabledConnectionPoint", new object[] { providerConnectionPoint.ID, provider.ID }));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:10pt;padding:20px;width:95%;'&gt;public override bool GetEnabled(Control control)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool flag = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BusinessDataWebPart part = control as BusinessDataWebPart;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (part != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return part.CanConnect(true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (control is BusinessDataItemBuilder)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flag = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return flag;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;margin-top:10px;'&gt;Thus: although at the external front decoupled via interface &lt;span style='font-family:Syntax;font-size:11pt;'&gt;IEntityInstanceProvider&lt;/span&gt;, internally &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataDetailsWebPart&lt;/span&gt; demands it's provider to be either a &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataWebPart&lt;/span&gt; or &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataItemBuilder&lt;/span&gt; webpart!! So much for interface decoupling.&lt;br/&gt;Confine to this internal constraint by inheriting either of these classes is also not possible: &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataItemBuilder&lt;/span&gt; is sealed, and &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataWebPart&lt;/span&gt; is public abstract, but with 4 &lt;span style='font-style:italic;'&gt;internal&lt;/span&gt; abstract methods.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataDetailsWebPart&lt;/span&gt; also allows to explicit connect it in code with a BCS entity. Less elegant as via the connectionpoint, but workable. The standard &lt;span style='font-family:Syntax;font-size:11pt;'&gt;BusinessDataDetailsWebPart&lt;/span&gt; can then still be used to render the external data item; no need to custom build an own one (or ‘copy’).&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:10pt;padding:20px;width:95%;'&gt;BusinessDataDetailsWebPart busDetailsWp = wp as BusinessDataDetailsWebPart;&lt;br /&gt;if (busDetailsWp.BdcEntity != null &amp;&amp; busDetailsWp.BdcEntity.Equals(entity))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string entityInstanceId = ((IEntityInstanceProvider)this).GetEntityInstanceId();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;busDetailsWp.ItemID = entityInstanceId;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-8163903348673651667?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/8163903348673651667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2012/02/impossible-to-use-custom-implementation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8163903348673651667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8163903348673651667'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2012/02/impossible-to-use-custom-implementation.html' title='Impossible to use custom implementation of public BCS interface IEntityInstanceProvider'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-811615342007457891</id><published>2012-01-16T18:34:00.008+01:00</published><updated>2012-01-16T23:21:34.327+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver Gateway'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Consulting'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Reasoning for Duet Enterprise in addition to SAP NetWeaver Gateway</title><content type='html'>&lt;div&gt;With the release of Gateway 2.0 as addition to the SAP NetWeaver stack, the question is justifiable whether this on itself is sufficient for SAP / Microsoft interoperability. Stated otherwise: &amp;lsquo;Do you need Duet Enterprise?&amp;rsquo; The answer on that depends on your requirements, IT strategy, plans and situation. On level of desired application(s) functionalities as well as the Enterprise Architecture strategy, policy and plans in your company.&lt;/div&gt;&lt;div style='margin-top:5px;margin-bottom:20px;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:110%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/28266'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h2 style='font-size:110%;'&gt;Is Duet Enterprise required for SAP / Microsoft interoperability?&lt;/h2&gt;&lt;div&gt;An answer to that question is: No, Duet Enterprise is not per se required, but it might be the wise decision. To make that decision, multiple aspects must be considered.&lt;/div&gt;&lt;ol&gt;&lt;li&gt;The extras Duet Enterprise brings to the table (compared to Gateway alone)&lt;/li&gt;&lt;li&gt;Your SAP / Microsoft roadmap and plans; multiple applications and a future-robust strategy, or just now for a single project?&lt;/li&gt;&lt;li&gt;Enterprise Architecture guidelines&lt;/li&gt;&lt;li&gt;Functional requirements&lt;/li&gt;&lt;li&gt;Limitations and implications of Duet Enterprise&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h2 style='font-size:110%;'&gt;Duet Enterprise extras&amp;nbsp;to SAP Gateway&amp;nbsp;for SAP / Microsoft interoperability&lt;/h2&gt;The extras fall into different categories.&lt;/div&gt;&lt;div&gt;&lt;h3 style='font-size:110%;'&gt;Functional&lt;/h3&gt;&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Standard SharePoint rendering of the imported SAP data through SharePoint Business Data webparts&lt;/li&gt;&lt;li&gt;Standard CRUD+Q UI-process pattern on SAP data; for bidirectional data handling&lt;/li&gt;&lt;li&gt;Support / hook into SharePoint Enterprise Search&lt;/li&gt;&lt;li&gt;Collaboration workspace around SAP data entity: Customer, Product, Quote&lt;/li&gt;&lt;li&gt;Integration of SAP workflow into SharePoint context&lt;/li&gt;&lt;li&gt;Same for reporting: schedule + review SAP BW reports from SharePoint front-end&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:110%;'&gt;Connectivity&lt;/h3&gt;&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Single Sign-On from SharePoint into SAP&lt;/li&gt;&lt;li&gt;Propagation of SAP user authorizations into SharePoint roles + permissions&lt;/li&gt;&lt;li&gt;Propagation of SAP data authorizations to SharePoint Search context, via construction of ACL&amp;rsquo;s on the External Data entities&lt;/li&gt;&lt;li&gt;Transparant SharePoint (consumer) &amp;ndash; SAP (provider) runtime connectivity via SharePoint BCS&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:110%;'&gt;Operations and lifecycle management&lt;/h3&gt;&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;End-2-end monitoring; starting from SharePoint, via SCL, upto SAP backend&lt;/li&gt;&lt;li&gt;Audit trail per use case&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:110%;'&gt;Development&lt;/h3&gt;&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Design tool for generation of BCS Model on basis of Gateway Model (itself generated via Gateway generation tools)&lt;/li&gt;&lt;li&gt;Integration with SharePoint; Gateway is strict to provide standards-based access to SAP data, Duet Enterprise is also a first-class&lt;br /&gt;SharePoint-aware user.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:110%;'&gt;Roadmap + ecosystem&lt;/h3&gt;&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;SAP and Microsoft have a roadmap outlined for Duet Enterprise&lt;/li&gt;&lt;li&gt;Base functionality provided by Duet Enterprise&lt;br /&gt;product is augmented via the partner ecosystem (via Unite program)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h2 style='font-size:110%;'&gt;Enterprise Architecture&lt;/h2&gt;The decision for Duet Enterprise implementation is not made in isolement. It must be considered and fit in the greater area of enterprise architecture. It is evident that Duet Enterprise only makes sense if your IT&lt;br /&gt;landscape contains both SAP and Microsoft. But that alone is not sufficient to justify the purchase and implementation of the product Duet Enterprise. Does EA mandate usage of standards: interoperability protocols, products? And for&lt;br /&gt;common-of-the-shelf products, prefer strategic suppliers Microsoft and SAP above third-party suppliers? These are just 2 examples of questions on which EA should make a thoughtful decision and statement, resulting in EA guidelines.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h2 style='font-size:110%;'&gt;Functional requirements&lt;/h2&gt;The often required rationale for Duet Enterprise is actually a negativisme of the SAP (G)UI. So it is not so much that the decision is made &lt;strong&gt;&lt;em&gt;for&lt;/em&gt;&lt;/strong&gt; Microsoft / SharePoint, but more that it is decided &lt;strong&gt;&lt;em&gt;against&lt;/em&gt;&lt;/strong&gt; the 'detested' SAP user interface. But if the only motivation is to get rid of the SAP user interface and replace it by another, there are other possibilities. Build a custom user interface in SAP WebDynpro for instance. &lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Duet Enterprise starts to shine when you combine the powers of the SharePoint platform with the functionality of the SAP processing. Not merely rebuild the SAP user interface, but design and architect an improved user experience by integrating it within context of the information worker.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h2 style='font-size:110%;'&gt;Limitations and implications of Duet Enterprise&lt;/h2&gt;Duet Enterprise is not a silver bullet for all SAP / Microsoft interoperability occassions. It has limitations, intended or as consequence of architectural desicisions. Also, implementation of Duet Enterprise has its costs.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:110%;'&gt;Limitations of Duet Enterprise&lt;/h3&gt;&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;No support of REST protocol&lt;/li&gt;&lt;li&gt;Limited to data-oriented, CRUD+Q service signatures&lt;/li&gt;&lt;li&gt;Design-time tooling support only for inside-out approach; not for outside-in&lt;/li&gt;&lt;li&gt;Full design-time tooling support only for flattened SAP data-structures&lt;/li&gt;&lt;li&gt;Standard SharePoint rendering only for flattened data structures. This is actually a limitation of the standard SharePoint BCS UI controls. Rendering of complex data structures can be done via custom build SharePoint UI-controls (example: &lt;a href="http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/25112"&gt;Working with complex SAP business entities in Duet Enterprise&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:110%;'&gt;Costs of Duet Enterprise&lt;/h3&gt;The costs fall apart in different categories:&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Recurring license costs&lt;/li&gt;&lt;li&gt;One-time deployment and installation effort &lt;/li&gt;&lt;li&gt;Training of IT operations, architects and developers (for all: SAP and Microsoft)&lt;/li&gt;&lt;li&gt;Optional (but recommended for any except a simple SAP landscape): dedicated SAP Gateway application server&lt;/li&gt;&lt;li&gt;Duet Enterprise design time requires presence of SAP Enterprise Service Repository (ESR)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h2 style='font-size:110%;'&gt;Conclusion&lt;/h2&gt;The decision for the implementation of Duet Enterprise must be made in perspective of the business requirements and middle-term enterprise architecture. If SAP / SharePoint policy is a fundamental part of the [future] business application and IT landscape, Duet Enterprise might very well be the sensible decision. Better as realizing + maintaining an own SAP / Microsoft interop layer (no matter how smart your IT people are, they will on longer term never win it from the sheer combination of SAP + Microsoft product team). And also better as purchasing + implementing third party products. That will result in more shattering in your IT landscape, while you must assure yourself of the continuity of the product and its supplier. Again here the combination SAP + Microsoft gives on the longer run more trust as that of smaller although dedicated suppliers.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-811615342007457891?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/811615342007457891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2012/01/reasoning-for-duet-enterprise-in.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/811615342007457891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/811615342007457891'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2012/01/reasoning-for-duet-enterprise-in.html' title='Reasoning for Duet Enterprise in addition to SAP NetWeaver Gateway'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-6664656746711329034</id><published>2012-01-13T21:14:00.005+01:00</published><updated>2012-01-13T22:24:08.277+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Dynamic browser redirect with preserving UrlReferrer</title><content type='html'>&lt;div&gt;The standard way for a dynamic redirect executed from the browser context is via '&lt;span style='font-family:Syntax;font-size:11pt;'&gt;window.location = "&amp;lt;runtime derived url&amp;gt;";&lt;/span&gt;'. A side effect of this approach is that you have lost the UrlReferrer information after navigation to the second page. The browser namely treats this approach the same as if the user has explicitly entered the url in the location bar. There is no referrer since referrers are about one page directly referring to another (eg. via a link), not the browser just navigating to another page. If you need the UrlReferrer setting - a typical example is for (re)directing the browser to the first page after action performed on the second page -, a simple javascript trick can be used.&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:10pt;padding:20px;width:95%;'&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;EditLink2 = function(a,b)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var redirectLink = document.createElement('A');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redirectLink.setAttribute("href", "&amp;lt;runtime derived url&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.body.appendChild(redirectLink);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redirectLink.click();&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;margin-top:10px;'&gt;With this code setup, the dynamic derived redirect is added to the context of first page. As result, the UrlReferrer state is repaired and available for inquiry in the (&lt;span style='font-style:italic;'&gt;webclient + webserver&lt;/span&gt;) context of second page.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-6664656746711329034?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/6664656746711329034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2012/01/dynamic-browser-redirect-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6664656746711329034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6664656746711329034'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2012/01/dynamic-browser-redirect-with.html' title='Dynamic browser redirect with preserving UrlReferrer'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3769867171304523137</id><published>2012-01-09T04:52:00.012+01:00</published><updated>2012-01-09T04:52:00.213+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver Gateway'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>User Experience improvement of OOTB SharePoint rendering of SAP data imported via Duet Enterprise</title><content type='html'>&lt;div style='margin-top:15px;'&gt;Duet Enterprise makes it simpler to bring SAP data into the realm of SharePoint based front-end. At the SharePoint side the SAP data integration is enabled via Business Connectivity Services. The SharePoint platform provides multiple standard controls that hook into BCS Service Application to render external SAP data. &lt;span style='font-family:Syntax;font-size:9pt;'&gt;XsltListViewWebPart&lt;/span&gt; to render a view on ExternalList, &lt;span style='font-family:Syntax;font-size:9pt;'&gt;BusinessDataDetailsWebPart&lt;/span&gt; to display details of a single external SAP BCS entity. These standard controls have a generic ui-process handling. In case the SAP process handling is different, the result may in fact be a lesser user experience as that ‘detested’ SAP UI.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;However, within limitations it is possible to extend and adapt the standard SharePoint ui-process handling, while still using and relying on the standard controls.&lt;/div&gt;&lt;div style='margin-top:5px;margin-bottom:20px;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/28180'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The standard ExternalList UI-process handling is to display all selected fields in a gridview; and display details of a selected external entity in a popup window.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://2.bp.blogspot.com/-GzKk2zAZ2LA/TwhtYqE98pI/AAAAAAAAARI/bPyJHDN8ZTY/s1600/img1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5694921999189406354" /&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://3.bp.blogspot.com/-BMiiOijI_HY/TwhtYw-ZrMI/AAAAAAAAARQ/Z_tD5ByMweQ/s1600/img2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5694922001040911554" /&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;In case of a relational or hierarchical data model (typical SAP structures), it is more natural to navigate to another portal page with a composite view: display some details of the selected external entity, accompanied with table based overview(s) of related items. This modified UI-process can be achieved with standard SharePoint controls by a number of measures:&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use javascript/jQuery to overload the standard SharePoint client-side handling that is generated for (External)List. This can be done by utilizing the standard &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ContentEditorWebPart&lt;/span&gt; for injecting the jQuery in the SharePoint page, it does not require custom server control development + deployment.&lt;/li&gt;&lt;li&gt;Modify the Xslt-rendering of the standard WebParts to beatify the rendering. Examples of this are applying conditional rendering, other display-formats of data structures, html-layout changes. Also this can be done at SharePoint configuration level, from context of the SharePoint GUI. It does not require custom server controls. Note: Xslt programming is an expertise on its own. Although you can deploy it via SharePoint GUI, it is not something that you can expect the content owner or functional administrator to do.&lt;/li&gt;&lt;li&gt;Use CSS for consistent style of the rendered data displays. Again this can be done via SharePoint GUI; no deployment required to the SharePoint farm.&lt;/li&gt;&lt;li&gt;Readible names for SAP datafields by defining readible names in the BCS resource file per SAP external contenttype. This is something to be done by the SharePoint administrator that has access to BCS Service Application UI.&lt;/li&gt;&lt;li&gt;Build a custom server control to propagate value(s) of the selected SAP external entity as filter(s) to &lt;span style='font-family:Syntax;font-size:9pt;'&gt;XsltListViewPart&lt;/span&gt; that exposes view on &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ExternalList&lt;/span&gt; of related SAP data entity. This does require some custom SharePoint development and a farm deployment. Afterwards this generic server control can be reused in multiple SharePoint pages.&lt;/li&gt;&lt;li&gt;Build a custom server control to provide to standard &lt;span style='font-family:Syntax;font-size:9pt;'&gt;BusinessDataWebPart&lt;/span&gt; the entity identifier of the SAP entity that was selected in &lt;span style='font-family:Syntax;font-size:9pt;'&gt;XsltListViewWebPart&lt;/span&gt; on the referrer page. This server control implements the BCS IEntityInstanceProvider interface. This does require some custom SharePoint development and a farm deployment. Afterwards this generic server control can be reused in multiple SharePoint pages.&lt;/li&gt;&lt;/ol&gt;&lt;div style='margin-top:10px;'&gt;The effect of these measures with still usage of OOTB SharePoint controls to display SAP data imported via Duet Enterprise:&lt;/div&gt;&lt;div style='margin-top:5px;font-size:smaller;font-style:italic;'&gt;Start: browse to the SharePoint page that initiates retrieval of SAP category data (via SAP NetWeaver Gateway Model Query method) + display within &lt;span style='font-family:Syntax;font-size:9pt;'&gt;XsltListViewWebpart&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/-zfftAtfGaAU/TwhtbSLkYBI/AAAAAAAAARg/May7NyOovPY/s1600/img3.jpg" /&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;font-size:smaller;font-style:italic;'&gt;User clicks on one of the categories, as result the browser navigates to a second page. On that page some details of the selected category are displayed (via &lt;span style='font-family:Syntax;font-size:9pt;'&gt;BusinessDataDetailsWebPart&lt;/span&gt;, issuing via BCS the Gateway Model Read method), and also data of 2 additional SAP entities  (via Gateway Model &lt;span style='font-family:Syntax;font-size:9pt;'&gt;Query&lt;/span&gt; method,with one or more input parameters, the value of these set as BCS filter in &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ReadList&lt;/span&gt; method.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://1.bp.blogspot.com/-3HO-mH3D9GI/TwhtbY-9ZGI/AAAAAAAAARo/vWozQFZKSWI/s1600/img4.jpg" /&gt;&lt;br /&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/-L3Ab0K3fGNY/Twhtbp_r93I/AAAAAAAAAR8/f3hKewkzZrk/s1600/img5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5694922050706863986" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;font-size:smaller;font-style:italic;'&gt;User clicks on one the related SAP entity instance, browser navigates to a third page. On that page some details of the selected instance are displayed (via &lt;span style='font-family:Syntax;font-size:9pt;'&gt;BusinessDataDetailsWebPart&lt;/span&gt;, issuing via BCS the Gateway Model &lt;span style='font-family:Syntax;font-size:9pt;'&gt;Read&lt;/span&gt; method), and again also data of additional SAP entity  (via Gateway Model Query method).&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;" src="http://4.bp.blogspot.com/-7P-SIy6_Z4g/TwiEMEpZB7I/AAAAAAAAASE/k5JK7_SAd_g/s1600/img6.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5694947071750637490" /&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Conclusion&lt;/h3&gt;Via such SharePoint customizations the UI-process handling for external data can be largely improved. In case the User Interaction Design demands more and deeper adjustments, somewhere the line will be crossed what is sensible possible via SharePoint customization. Then it is more sensible to build custom webparts for exposing the SAP data retrieved via Duet Enterprise. For the SAP side this is transparent, as long as it can deliver the required SAP data structures to compose the SharePoint UI-handling.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3769867171304523137?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3769867171304523137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2012/01/user-experience-improvement-of-ootb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3769867171304523137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3769867171304523137'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2012/01/user-experience-improvement-of-ootb.html' title='User Experience improvement of OOTB SharePoint rendering of SAP data imported via Duet Enterprise'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-GzKk2zAZ2LA/TwhtYqE98pI/AAAAAAAAARI/bPyJHDN8ZTY/s72-c/img1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3183202283133770515</id><published>2011-12-10T20:30:00.016+01:00</published><updated>2011-12-10T21:47:53.850+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><category scheme='http://www.blogger.com/atom/ns#' term='FBA'/><title type='text'>Synchronisation issue with SharePoint FBA claims-based</title><content type='html'>&lt;div&gt;In a SharePoint 2010 extranet I apply a custom membership provider for Forms-Based Authentication.  The provider works like a charm, external users are authenticated when logging on with valid credentials, and denied access otherwise.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;However, after functioning smoothly for a while, we suddenly encountered the error below when trying to logon via FBA:&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:95%;'&gt;[FaultException`1: The context has expired and can no longer be used. (Exception from HRESULT: 0x80090317)]&lt;br /&gt;   Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannel.ReadResponse(Message response) +1161205&lt;br /&gt;   Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannel.Issue(RequestSecurityToken rst, RequestSecurityTokenResponse&amp; rstr) +73&lt;br /&gt;   Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannel.Issue(RequestSecurityToken rst) +36&lt;br /&gt;   Microsoft.SharePoint.SPSecurityContext.SecurityTokenForContext(Uri context, Boolean bearerToken, SecurityToken onBehalfOf, SecurityToken actAs, SecurityToken delegateTo) +26060225&lt;br /&gt;   Microsoft.SharePoint.SPSecurityContext.SecurityTokenForFormsAuthentication(Uri context, String membershipProviderName, String roleProviderName, String username, String password) +26063596&lt;br /&gt;   Microsoft.SharePoint.IdentityModel.Pages.FormsSignInPage.GetSecurityToken(Login formsSignInControl) +188&lt;br /&gt;   Microsoft.SharePoint.IdentityModel.Pages.FormsSignInPage.AuthenticateEventHandler(Object sender, AuthenticateEventArgs formAuthenticateEvent) +123&lt;br /&gt;   System.Web.UI.WebControls.Login.AttemptLogin() +152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Logon via Windows authentication had no problem, only the FBA route. Since there had been no software or configuration changes for the custom provider, the cause must be found to be at [SharePoint Farm] infra level. In the Application Eventlog I noticed the following Error log: &lt;span style='color:red;'&gt;An exception occurred when trying to issue &lt;span style='font-weight:bolder;'&gt;security token&lt;/span&gt;: The context has expired and can no longer be used. (Exception from HRESULT: 0x80090317).&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;This steered me within the direction of the generic Security Token handling in the farm, instead of the context of the extranet webapplication self. As first attempt I decided to restart the SecureToken Service Application. And voila, this was already sufficient: problem resolved. That is, for a while... The problem namely structural reappears after a couple of days of minor or no activity in the SharePoint farm. It looks to me as something of a clock timer synchronization issue within the SharePoint farm, that can for a period be prevented by timely 'refreshing' the SecureToken application pool.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3183202283133770515?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3183202283133770515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/12/synchronisation-issue-with-sharepoint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3183202283133770515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3183202283133770515'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/12/synchronisation-issue-with-sharepoint.html' title='Synchronisation issue with SharePoint FBA claims-based'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-616434568755430393</id><published>2011-12-09T22:27:00.005+01:00</published><updated>2011-12-09T22:59:25.811+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Workflow'/><category scheme='http://www.blogger.com/atom/ns#' term='Office'/><title type='text'>Exposing business information of SAP workflow via Duet Enterprise</title><content type='html'>&lt;div&gt;Often a SAP workflow includes specific business data. This data is needed at the decision moments within the workflow to make an informed decision. And thus also needed within the SharePoint context if the workflow decision step is exposed there via Duet Enterprise workflow handling.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;As the default Duet Enterprise workflow handling is a generic set-up, it is evident that it cannot provide direct support for all imaginable and variant occurences of specific business data. Instead there are hooks in the workflow pipeline in which you can plug-in custom extensions for exchanging workflow specific/contextual data from SAP backend to SharePoint frontend. You need to build a custom workflow outbound handler to transfer the contextual SAP business data from SAP workflow to SharePoint via Duet Enterprise workflow feature. Herein you have 2 options.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Expose business data in the format of static HTML or XML content&lt;/h3&gt;In this approach the additional workflow information is added to the SAP workitem-details (SOSP_TT_WF_RUNTIME_INFO). The Duet Enterprise system dataflow is as follows:&lt;table style='border:solid 2px #000;' rules='all' cellpadding='2' cellspacing='2'&gt;&lt;tr style='border:solid 1px #000;'&gt;&lt;td&gt;SAP ERP&lt;/td&gt;&lt;td&gt;Outbound handler&lt;/td&gt;&lt;td&gt;Extend or replace the workitem details that are propagated via Duet Enterprise workflow capability, with pre-formatted business content (XML or HTML)&lt;/td&gt;&lt;/tr&gt;&lt;tr style='border:solid 1px #000;'&gt;&lt;td&gt;SCL&lt;/td&gt;&lt;td colspan='2'&gt;No action&lt;/td&gt;&lt;/tr&gt;&lt;tr style='border:solid 1px #000;'&gt;&lt;td&gt;SharePoint&lt;/td&gt;&lt;td&gt;Taskform&lt;/td&gt;&lt;td&gt;IF HTML: simple display&lt;br/&gt;IF XML: Xslt-transformation, preceeding display&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Expose business data in the format of XML payload&lt;/h3&gt;In this approach the additional workflow information is passed via the XPROP key-value structure delivered with Duet Enterprise workflow handling at the SAP side. The Duet Enterprise system dataflow is as follows:&lt;table style='border:solid 2px #000;' rules='all' cellpadding='2' cellspacing='2'&gt;&lt;tr style='border:solid 1px #000;'&gt;&lt;td&gt;SAP ERP&lt;/td&gt;&lt;td&gt;Outbound handler&lt;/td&gt;&lt;td&gt;Populate the Duet Enterprise key-value XPROP structure with the required business properties (name =&gt; value; eg ‘CustomerId’ =&gt; ‘02345’)&lt;br/&gt;The business property values are retrieved from the SAP workflow container.&lt;/td&gt;&lt;/tr&gt;&lt;tr style='border:solid 1px #000;'&gt;&lt;td&gt;SCL&lt;/td&gt;&lt;td&gt;Configuration&lt;/td&gt;&lt;td&gt;Register EACH individual XPROP business property at the associated workflow template&lt;/td&gt;&lt;/tr&gt;&lt;tr style='border:solid 1px #000;'&gt;&lt;td&gt;SharePoint&lt;/td&gt;&lt;td&gt;Config&lt;/td&gt;&lt;td&gt;Register EACH individual XPROP business property as external/extended business property at the task definition in the Duet Enterprise workflow subsite&lt;/td&gt;&lt;/tr&gt;&lt;tr style='border:solid 1px #000;'&gt;&lt;td&gt;SharePoint&lt;/td&gt;&lt;td&gt;Workflow&lt;/td&gt;&lt;td&gt;Extend the ‘Approval task screen’ to render the additional business data properties [extend standard taskform via SharePoint Designer or via InfoPath]&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Decide between the 2 approaches&lt;/h3&gt;Both options are viable to expose specific SAP business data to Microsoft SharePoint and Outlook context. Which is most appropriate depends on the characteristics of both the data, and what will be done with it within the Microsoft front-end. If it will only be displayed, it may be best to use the approach to expose it as single set of XML or HTML content; and then directly or via Xslt render within the UI. If the data is also needed within the front-end for additional processing, it is properly better to expose the data properties individual. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-616434568755430393?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/616434568755430393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/12/exposing-business-information-of-sap.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/616434568755430393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/616434568755430393'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/12/exposing-business-information-of-sap.html' title='Exposing business information of SAP workflow via Duet Enterprise'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3033691007053456530</id><published>2011-11-22T21:17:00.013+01:00</published><updated>2011-11-22T21:53:08.309+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Workflow'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Workflow in Duet Enterprise: concept + implications</title><content type='html'>&lt;div&gt;One of the Duet Enterprise core capabilities is publishing SAP workflows into the realm of SharePoint sites. In this posting I outline the conceptual working, and what implications result from the Duet Enterprise workflow architecture. The information below is not entirely new, but builds upon blog material of Xiaosheng (Edward) Lu [SAP AG] and Kiki Shuxteau [Microsoft Corp].&lt;/div&gt;&lt;div style='margin-top:5px;margin-bottom:20px;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/27459'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;h3 style='font-size:110%;'&gt;Prerequisites for exposing a SAP workflow via Duet Enterprise&lt;/h3&gt;&lt;ol style='margin-top:3px;'&gt;&lt;li&gt;SAP ERP workflow; it does not matter whether a standard workflow, or a company-custom developed one. SAP BPM workflows are currently not supported for Duet Enterpise exposition.&lt;/li&gt;&lt;li&gt;The SAP workflow must contain one or more discrete user interaction tasks.&lt;/li&gt;&lt;li&gt;Duet Enterprise out-of-the-box supports User Decision interaction step. Interaction task with an Activitity Dialog are also supported, but require some manual work. Effectively you need to replace both the SAP GUI screenhandling plus&amp;nbsp;propagate the dialog resultdata as outcome for the SAP workflow Activity Dialog task. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="float: right;"&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-qiUKpV7YpOc/TswKthWX-sI/AAAAAAAAAQs/kTPykgQbz8Q/s1600/DE%2BWorkflow%2Bgateways.png" border="0" alt="image" width="400" height="258" /&gt;&lt;/p&gt;&lt;p&gt;source: &lt;a href="http://technet.microsoft.com/en-us/library/gg998764.aspx" target="_top"&gt;Microsoft Technet&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;h3 style='font-size:110%;'&gt;Conceptual working&lt;/h3&gt;&lt;div&gt;The following steps are performed in the exposition of a SAP ERP workflow interaction task to SharePoint context:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;In the SAP ERP workflow a status change occurs that next requires user interaction to act upon, via a SAP Workflow Interaction Task (Decision Step or Activity Dialog). When the SAP Workflow reaches the Interation Task, a Duet Enterprise specific outbound handler is invoked from within the runtime context of SAP workflow execution. This outbound handler uploads an XML payload document, containing the workflow instance details, to the associated [by configuration] SharePoint workflow subsite. In the Duet Enterprise architecture, this XML payload is send from SAP ERP Workflow context via the SAP Document Publisher, which resides on the Duet Enterprise SAP Add-on. The SAP Document Publisher service on its turn invokes the SharePoint OBAWorkflowService, which is deployed in the SharePoint farm as part of Duet Enterprise installation.&lt;/li&gt;&lt;li&gt;On the receiving SharePoint document library [in the workflow subsite] is a Duet Enterprise specific SharePoint workflow configured. This workflow is triggered on addition of new content in the document library. The workflow contains 1 user task to act from the context of SharePoint user interface upon the specific surfaced SAP interaction task.&lt;/li&gt;&lt;li&gt;The decision made by the SharePoint enduser in the SharePoint workflow task, is propagated to the SAP ERP workflow by means of a taskflow BDC entity. Duet Enterprise specific SAP webservices are herefore invoked via SharePoint BCS. These SAP webservices next invoke a Duet Enterprise specific inbound handler to receive and process the exchanged decision details, and propagate it as outcome of the user interaction task in the SAP ERP workflow.&lt;/li&gt;&lt;/ol&gt;&lt;div style="float: right;"&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/-CwCBXLnKj9w/TswKtupOqLI/AAAAAAAAAQ0/eL62WO07vos/s1600/DE%2BWorkflow%2Bflow.png" border="0" alt="image" width="400" height="457" /&gt;&lt;/p&gt;&lt;p&gt;source: &lt;a href="http://technet.microsoft.com/en-us/library/gg998764.aspx" target="_top"&gt;Microsoft Technet&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;&lt;h3 style='font-size:110%;'&gt;Implications&lt;/h3&gt;&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Duet Enterprise provides default Function Modules for both inbound and outbound handlers. By design, these are limited to generic handling of SAP workflow. In case the SAP ERP workflow decision task includes context information that is workflow specific, it is required to build a custom outbound handler. Also in case the result datacontainer of the decision task contains context data besides or instead of a simple decision outcome, it is required to build a custom inbound handler to process that received data from SharePoint task into the SAP workflow.&lt;ul&gt;&lt;li&gt;In concrete reality, SAP workflows more often than not involve acting upon workflow specific data. In all such situations it is thus required to overload the default function module with a custom implementation, for surfacing that specific data outside the boundaries of the SAP workflow.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;The default Duet Enterprise outbound handler S_OSP_WF_PAT_DEFAULT_CH_OB handles the publishing of XML payload to SharePoint. Even in case of a custom outbound handler, it must therefore still be utilized in the Duet Enterprise workflow publication. More specifically, the S_OSP_WF_PAT_DEFAULT_CH_OB outbound handler must always be the last invoked outbound handler in the SAP workflow outbound handlers pipeline. The order in which outbound handlers are invoked is configured within SAP ERP, not in the SCL (aka Gateway).&lt;/li&gt;&lt;li&gt;The default Duet Enterprise inbound handler S_OSP_WF_PAT_DEFAULT_CH_IB handles the receiving of Duet Enterprise taskflow entity from SharePoint BCS. It must therefore always be present as the first invoked inbound handler in the SAP workflow inbound handlers pipeline.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3033691007053456530?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3033691007053456530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/workflow-in-duet-enterprise-concept.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3033691007053456530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3033691007053456530'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/workflow-in-duet-enterprise-concept.html' title='Workflow in Duet Enterprise: concept + implications'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-qiUKpV7YpOc/TswKthWX-sI/AAAAAAAAAQs/kTPykgQbz8Q/s72-c/DE%2BWorkflow%2Bgateways.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-672460830155847047</id><published>2011-11-19T16:35:00.021+01:00</published><updated>2011-11-19T22:04:01.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><category scheme='http://www.blogger.com/atom/ns#' term='BCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Alternative ways to programmatic read contents of External List with filtered view</title><content type='html'>&lt;div&gt;In order to export the displayed contents of a BCS External List to Excel (see &lt;a href='http://williamvanstrien.blogspot.com/2011/11/excel-2010-protected-view-hinders.html'&gt;previous post&lt;/a&gt;), I first have to programmatically retrieve the contents in custom code. The External List has a filter applied to it's Finder method, set via the default SPView:&lt;img  style='width:90%;' src="http://2.bp.blogspot.com/-WJSf2gCCcyI/TsfayJB45bI/AAAAAAAAAQI/TcPHdGi61f0/s1600/Screen%2BShot%2B2011-11-19%2Bat%2B5.34.36%2BPM.png"&gt;&lt;/img&gt;&lt;/div&gt;&lt;div&gt;My first thought was therefore that below code should retrieve the same filtered external data as when rendering the BCS External List on a SharePoint page:&lt;/div&gt;&lt;img style='width:70%;' src="http://2.bp.blogspot.com/-FhJZ9Os2h_c/TsfPd96BdYI/AAAAAAAAAP8/tVxYt74RrZY/s1600/Screen%2BShot%2B2011-11-19%2Bat%2B4.46.04%2BPM.png"&gt;&lt;/img&gt;&lt;div style='margin-top:5px;'&gt;However, GetItems returns an empty collection. Upon debugging the called GetNotifications webservice method, I discovered that the filter-param always has value ‘null’. To me unclear why, since it has been set in the DefaultView.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Via internet search I ended up with an &lt;a href='http://msdn.microsoft.com/en-us/library/ff798510.aspx'&gt;approach to retrieve the contents directly by invoking the BCS API&lt;/a&gt;:&lt;/div&gt;&lt;img style='width:95%;' src="http://1.bp.blogspot.com/-AEkWpoaBvqk/TsgS01RLy0I/AAAAAAAAAQU/E1JhWqtvdhE/s1600/Screen%2BShot%2B2011-11-19%2Bat%2B5.42.43%2BPM.png"&gt;&lt;/img&gt;&lt;div style='margin-top:5px;'&gt;However, although this approach works; it left me rather dissatisfied. Conceptually I want to export the contents of the same (External) List that I already have provisioned on a SharePoint page; so why should I have to dive under the BCS hood to get the same contents? Also, this code is very much aware / coupled to BCS API, while the 'Export SPList to Excel' functionality on itself is general. Thus, with some ample time available, I decided to analyze the way in which the standard &lt;span style='font-family:Syntax;'&gt;XsltViewWebPart&lt;/span&gt; is issuing the external data retrieval – using JetBrains DotPeek reflector tool (as .NET Reflector is no longer free of licensee charge). It appears that this is done slightly different as my original attempt:&lt;/div&gt;&lt;img style='width:90%;' src="http://2.bp.blogspot.com/-CJfwa45pDRc/TsgV9d2-RZI/AAAAAAAAAQg/Z0LjKb8gBhc/s1600/Screen%2BShot%2B2011-11-19%2Bat%2B9.47.28%2BPM.png"&gt;&lt;/img&gt;&lt;div style='margin-top:5px;'&gt;Not only is the code LOC of this far less, but also this code is general; applicable for both regular SharePoint lists as BCS External Lists.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-672460830155847047?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/672460830155847047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/alternative-ways-to-programmatic-read.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/672460830155847047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/672460830155847047'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/alternative-ways-to-programmatic-read.html' title='Alternative ways to programmatic read contents of External List with filtered view'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-WJSf2gCCcyI/TsfayJB45bI/AAAAAAAAAQI/TcPHdGi61f0/s72-c/Screen%2BShot%2B2011-11-19%2Bat%2B5.34.36%2BPM.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-8691578360029529369</id><published>2011-11-18T08:46:00.017+01:00</published><updated>2011-11-18T13:03:14.399+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><category scheme='http://www.blogger.com/atom/ns#' term='BCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel 2010'/><title type='text'>Excel 2010 Protected View hinders browser-opening of downloaded .xlsx file</title><content type='html'>&lt;div&gt;An user requirement in one of our SharePoint 2010 projects is to export at any moment the displayed contents of an External List (&lt;span style='font-style:italic;'&gt;with content originating from SAP ERP, retrieved via SharePoint BCS connecting to BAPI based web services&lt;/span&gt;) to an offline file. The functional rationale is version-administration for history and auditing purposes. The SharePoint platform supports this out-of-the-box for regular Lists, by the Export into Excel functionality. However, not so for BCS External Lists. But you can realize it yourself via some custom code. First retrieve the External List contents, and next construct a .xlsx file via Open XML SDK. The .xlsx file is generated server-side in memory, and send to the browser as HttpResponse content. The end-user can next either open the file, or save it somewhere at client-side:&lt;/div&gt;&lt;div style='margin-top:10px;float:right;'&gt;&lt;img style="width: 320px; height: 226px;" src="http://1.bp.blogspot.com/-oRRxa7MSBTU/TsYOrin2LDI/AAAAAAAAAPY/uZtZIluWrvs/s320/Screen%2BShot%2B2011-11-18%2Bat%2B8.35.26%2BAM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5676240521538186290" /&gt;&lt;/div&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Strange thing I noticed was that when saving the file, that saved file can next be opened successfully. But when instead choose to directly open the file, Excel 2010 displays the error message “The file is corrupt and cannot be opened”.&lt;/div&gt;&lt;div style='margin-top:10px;float:right;'&gt;&lt;img style="width: 208px; height: 106px;" src="http://3.bp.blogspot.com/-lpfO7IZYXOs/TsYOr6uXS9I/AAAAAAAAAPk/5BOWI1q3fbo/s320/Screen%2BShot%2B2011-11-18%2Bat%2B8.35.56%2BAM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5676240528007973842" /&gt;&lt;/div&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;This must be a client-side issue; the server-side is not aware of the context in which the client-side handles the received HttpResponse (&lt;span style='font-style:italic;'&gt;Note: via Fiddler I even analyzed that the HttpResponse contents were identical&lt;/span&gt;). &lt;br/&gt;&lt;br /&gt;The resolution is hinted at in the File Download window, by the trust-warning about internet downloaded files. The default Excel 2010 TrustSettings are to distrust all downloaded content from non-trusted locations. To validate this I unchecked in Excel 2010 the default settings (via File \ Options \ TrustCenter \ TrustCenter Settings \ Protected View):&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;img style="width:90%;" src="http://4.bp.blogspot.com/-DTl3cbYHxiI/TsYOsN4LCYI/AAAAAAAAAPw/cOMNFWHSgMk/s1600/Screen%2BShot%2B2011-11-18%2Bat%2B8.43.32%2BAM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5676240533149387138" /&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;This helps, Excel 2010 now direct opens the downloaded file.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-8691578360029529369?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/8691578360029529369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/excel-2010-protected-view-hinders.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8691578360029529369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8691578360029529369'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/excel-2010-protected-view-hinders.html' title='Excel 2010 Protected View hinders browser-opening of downloaded .xlsx file'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-oRRxa7MSBTU/TsYOrin2LDI/AAAAAAAAAPY/uZtZIluWrvs/s72-c/Screen%2BShot%2B2011-11-18%2Bat%2B8.35.26%2BAM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-4622933744356789906</id><published>2011-11-10T16:16:00.043+01:00</published><updated>2011-11-11T09:09:20.439+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Identity Management'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='FBA'/><title type='text'>Inconvenient configuration of Forms-Based Authentication in SharePoint 2010</title><content type='html'>&lt;div style='margin-bottom:10px;'&gt;For an extranet we aim to utilize Forms-Based Authentication to authenticate external users. In SharePoint 2010 this means that you have to apply the Claims-Based authentication model. And next set up the SharePoint webapplication configuration for the Membership provider that will be used for FBA. This is where things can be a little confusing. In fact you have to configure FBA membership on 3 different locations, and it is essential that all 3 are in sync:&lt;/div&gt;&lt;div&gt;&lt;h3 style='font-size:90%;'&gt;1. In Central Admin&lt;/h3&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/--RfabMlpC0A/Trw2OwveDjI/AAAAAAAAANg/hpjRjb15lHs/s1600/AuthenticationProviders.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 160px;margin-left:10px;float:right;" src="http://4.bp.blogspot.com/--RfabMlpC0A/Trw2OwveDjI/AAAAAAAAANg/hpjRjb15lHs/s320/AuthenticationProviders.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673469257810054706" /&gt;&lt;/a&gt;Configure Web Application \ Authentication Providers; here you specify the name of the Membership- and RoleProviders used in FBA context within the web application&lt;div style='clear:both;'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style='margin-top:20px;font-size:90%;'&gt;2. Security Token context&lt;/h3&gt;In the SharePoint 2010 service applications architecture, membership handling is delegated to the SecurityToken service application. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-lOcJSe8QT18/Trw3hr2ZzhI/AAAAAAAAANs/daL8UQx7my0/s1600/SecurityTokenWebConfig.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 199px;margin-left:10px;float:right;" src="http://2.bp.blogspot.com/-lOcJSe8QT18/Trw3hr2ZzhI/AAAAAAAAANs/daL8UQx7my0/s320/SecurityTokenWebConfig.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673470682426101266" /&gt;&lt;/a&gt;This is a major difference wrt SharePoint 2007 architecture, in which the individual webapplication process themselves handle the membership handling. Direct consequence for configuration is that you need to specify in the web.config of the SecurityToken service application all the membershipproviders and roleproviders that are used in the SharePoint farm. &lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The SecurityToken service application directory is located at: 14hive\WebServices\SecurityToken&lt;div style='clear:both;'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style='margin-top:20px;font-size:90%;'&gt;3. Webapplication context&lt;/h3&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Ke9fnNFnIWQ/Trw4xFg7ILI/AAAAAAAAAN4/otptfCq2C0M/s1600/PeoplePicker.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 240px; height: 52px;margin-left:10px;float:right;" src="http://2.bp.blogspot.com/-Ke9fnNFnIWQ/Trw4xFg7ILI/AAAAAAAAAN4/otptfCq2C0M/s320/PeoplePicker.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673472046524997810" /&gt;&lt;/a&gt;Finally, despite that membership handling is within SharePoint 2010 done via the independent SecurityToken service application; you may still need to add the membershipprovider to the web.config of the individual webapplication. This is required in case you want to be able to use the standard PeoplePicker for selecting credentials via the FBA membershipprovider. Besides adding the ‘membershipprovider’ node, you then also have to set the peoplepicker directing to that membership provider.&lt;div style='clear:both;'/&gt;&lt;/div&gt;&lt;div style='margin-top:20px;'&gt;What if the 3 locations are not in sync? I evaluated the different inconsistent configurations:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style='margin-top:15px;font-size:90%;'&gt;1. Name entered in Central Admin does not match with name in SecureToken’s web.config&lt;/h3&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-M9j-c9cVObc/Trw5X0bDcQI/AAAAAAAAAOE/4mRgNXbquWI/s1600/MismatchCentralAdmin_SecureToken.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 178px;margin-right:10px;float:left;" src="http://1.bp.blogspot.com/-M9j-c9cVObc/Trw5X0bDcQI/AAAAAAAAAOE/4mRgNXbquWI/s320/MismatchCentralAdmin_SecureToken.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673472711951872258" /&gt;&lt;/a&gt;&lt;div style='margin:10px;'&gt;In this case, SharePoint Identity handling cannot get an handle to the configured MembershipProvider. When someone tries to log in via Forms-Based Authentication, SharePoint Identity handling will report the displayed exception.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Note, to have the 'Cannot get Membership Provider' exception details displayed you already need to make a change to the default settings within SecurityToken web.config. Namely set attribute includeExceptionDetailInFaults of ServiceDebug to true. Without this, only a general error is displayed: &lt;span style='color:red;'&gt;The server was unable to process the request due to an internal error&lt;/span&gt;&lt;/div&gt;&lt;div style='clear:both;'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style='margin-top:20px;font-size:90%;'&gt;2. Missing MembershipProvider in Central Admin&lt;/h3&gt;Well, you cannot actually forget to fill them in if you selected ‘Enable Forms Based Authentication’. But you could per accident forget to select that option.&lt;img style="width: 160px; height: 68px;margin-right:10px;float:left;" src="http://4.bp.blogspot.com/-ASdijNUtMp4/Trw6wSZsDcI/AAAAAAAAAOQ/Ii8RW5OJSZ4/s320/ForgotCentralAdminFBA.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673474231827697090" /&gt;&lt;div style='margin-top:10px;'&gt;The result of this is more a functional error: the forms-based authentication is now missing as option to logon to the web application.&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style='margin-top:20px;font-size:90%;'&gt;3. Missing or different named MembershipProvider in web application’s web.config&lt;/h3&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-4PJd3-sAATU/Trw7gu7LqjI/AAAAAAAAAOc/bl6tW3iCJEs/s1600/PeoplePickerDoesFindNotFind_0.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 280px; height: 252px;margin-left:10px;float:right;" src="http://4.bp.blogspot.com/-4PJd3-sAATU/Trw7gu7LqjI/AAAAAAAAAOc/bl6tW3iCJEs/s320/PeoplePickerDoesFindNotFind_0.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673475064118094386" /&gt;&lt;/a&gt;In this case you can still logon to the webapplication: either via Windows Authentication or via FBA. See above, membership is namely handled by SecurityToken service application, and not by the webapplication self. This can be a bit confusing at first. The result of the configuration error is noticed within the application self, when you try to search credentials from the FBA-Membership provider via the PeoplePicker. Strange enough the PeoplePicker is aware of the configured FBA-membership, but apparently cannot include it in it’s search space.&lt;div style='clear:both;'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style='margin-top:20px;font-size:90%;'&gt;4. Mismatch PeoplePicker (incorrect) versus named MembershipProvider in webapplication’s web.config&lt;/h3&gt;In this case strangely enough, PeoplePicker is able to use the Membership provider, that is if it is consistently named wrt SecurityToken web.config (otherwise issue 1).&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-IZTvsNVTpgk/Trw81tK84bI/AAAAAAAAAO0/E4M5jGIvYVc/s1600/PeoplePickerWildcards_All.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 280px; height: 253px;margin-left:10px;float:right" src="http://1.bp.blogspot.com/-IZTvsNVTpgk/Trw81tK84bI/AAAAAAAAAO0/E4M5jGIvYVc/s320/PeoplePickerWildcards_All.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673476523936244146" /&gt;&lt;/a&gt;&lt;div style='margin-top:10px;'&gt;At first I could not detect any PeoplePicker malfunction as result of this configuration mismatch. I could still find all credentials in the membershipprovider, also via wildcarding.&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;padding-top:10px;'&gt;Only when I on purpose sabotaged the wildcarding, I could see the effect.&lt;/div&gt;&lt;img style="width: 240px; height: 39px;float:right;" src="http://4.bp.blogspot.com/-zNWX_PT8hA0/Trw8QABVmFI/AAAAAAAAAOo/6Vst1zDlCF0/s320/SabotagePeoplePicker.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673475876161165394" /&gt;&lt;img style="width: 280px; height: 253px;" src="http://2.bp.blogspot.com/-eHzmOHJgieA/Trw9HWFiglI/AAAAAAAAAPA/5rFJv7Fpx1I/s320/PeoplePickerWildcards.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673476826977174098" /&gt;&lt;div style='clear:both;margin-top:10px;'&gt;So it appears that for wildcard search the ‘%’ is already somewhere set as default for all Membership providers; and that you only have to override this in case your Membership provider uses a different wildcard-pattern.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Personally, I find it better to always be explicit; and thus also explicitly specify ‘%’ as wildcharacter for each Membership provider that is valid for your application. But it is optional, and others might differ with me on this…&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-4622933744356789906?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/4622933744356789906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/inconvenient-configuration-of-forms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4622933744356789906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4622933744356789906'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/inconvenient-configuration-of-forms.html' title='Inconvenient configuration of Forms-Based Authentication in SharePoint 2010'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/--RfabMlpC0A/Trw2OwveDjI/AAAAAAAAANg/hpjRjb15lHs/s72-c/AuthenticationProviders.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-2924465934474833719</id><published>2011-11-04T21:52:00.008+01:00</published><updated>2011-11-04T22:21:10.902+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><title type='text'>Programatically open SPSite using Windows Credentials</title><content type='html'>&lt;div&gt;In a Proof of Concept I employ a &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPListMembershipProvider&lt;/span&gt; for forms-based access into (sub)sites. For the PoC, a &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPList&lt;/span&gt; in the rootweb is utilized as User Administration. In SharePoint 2010 architecture, Claims-Based authentication is handled by SecureToken service application. In the local development image, the STS service application may run under the same Application Pool account as the SharePoint webapplication. But this is not recommended, thus not to be expected within a real farm setup. As result, it is not possible to directly access from within runtime STS context the list in the external &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPSite&lt;/span&gt;.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPSecurity.RunWithElevatedPrivileges&lt;/span&gt; cannot help here; that only be used within the same application pool context. Instead the proper way is to open the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPSite&lt;/span&gt; in the external &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPWebApplication&lt;/span&gt; via the credentials of a &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPUser&lt;/span&gt; in that site; e.g. that of a service account. Problem is that the SharePoint API does not directly provide a way to open a &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPSite&lt;/span&gt; with Windows Credentials. You can open a site under the credentials of a SharePoint user, but you need the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPUserToken&lt;/span&gt; of the user for this. And guess what, you can only determine that token when within the context of the site. Talking about a chicken-egg situation.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;However I came up with a manner to get out of this loop. It consists of a 2-steps approach: first programmatically impersonate under the credentials of the service account, open the site, determine the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPUserToken&lt;/span&gt; of the site’s &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SystemAccount&lt;/span&gt;, and undo the impersonation; second apply the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPUserToken&lt;/span&gt; to (re)open the site under the authorization of the site’s &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SystemAccount&lt;/span&gt;. Since Windows Impersonation is a resource intensive operation, cache the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPUserToken&lt;/span&gt; in memory so that the impersonation is only initially required within the process lifetime.&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:95%;'&gt;&lt;br /&gt;internal static SPUserToken SystemTokenOfSite(Guid siteId)&lt;br /&gt;{              &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string account, pw, domain;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RetrieveCredentialsFromSecureStore(&amp;lt;AppId&amp;gt;, out domain, out account, out pw);&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImpersonationHelper _impersonator = new ImpersonationHelper(account, domain, pw);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_impersonator.Impersonate();&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPSite initialAccessIntoSite = new SPSite(siteId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return initialAccessIntoSite.SystemAccount.UserToken;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} finally {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_impersonator.Undo();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;if (sysToken == null)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sysToken = SecurityUtils.SystemTokenOfSite(memberSitesToId[websiteIdent]);&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;SPSite site = new SPSite(memberSitesToId[websiteIdent], sysToken);&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;'&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear: both;'&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-2924465934474833719?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/2924465934474833719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/programatically-open-spsite-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2924465934474833719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2924465934474833719'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/11/programatically-open-spsite-using.html' title='Programatically open SPSite using Windows Credentials'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-8111450906006830983</id><published>2011-10-24T21:27:00.011+02:00</published><updated>2011-10-24T22:29:23.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='Information Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='BCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Data architecture considerations and guidelines for retrieving SAP data via Duet Enterprise into SharePoint</title><content type='html'>&lt;div style='font-style:italic;'&gt;In Duet Enterprise FP1 it is relatively easy to generate a Gateway Model, as long as your SAP data sources live up to the required constraints. The challenge and intellectual work transfers to the data architecture, for deciding on and defining the proper data service interfaces given the application context.&lt;/div&gt;&lt;div style='margin-top:5px;margin-bottom:20px;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/27042'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:15px;'&gt;&lt;h3&gt;Real-time retrieval versus Search indexing&lt;/h3&gt;Bringing SAP data into SharePoint based front-ends can take different forms. You can unlock the SAP data real-time via ExternalList, to display and even edit the SAP data via the familiar SharePoint List UI metaphor. If the row-based List format doesn’t fit, you can develop a custom SharePoint webpart. You can also access the SAP data via the extensive SharePoint Search architecture and capabilities. With the improved Enterprise Search in SharePoint 2010 [or FAST if also purchased by customer organization], more and more new applications will be architected as search-driven. In context of SAP data think of searching from SharePoint context for a certain Supplier administrated in PLM, a Customer in CRM, et cetera.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Duet Enterprise can facilitate all of the above scenarios, in combination with the strengths of the SAP and SharePoint landscapes. However, the different nature of these scenarios may well result into different approaches for the data integration architecture. In the case of real-time retrieval of SAP data to render into SharePoint, it is advisable to limit the amount of data retrieved per SharePoint - Gateway - SAP backend interoperability flow. Don’t put unnecessary SAP data on the line that is not being used in the front-end: only include the fields of the SAP data that will be displayed in the UI and are relevant in this application context for the end-user. Search however has a different context. It is feasible to search on any of the field data of the SAP entity. This requires that all that SAP field data must be indexed upon SharePoint Search crawling time. So here it is advisable to not limit the amount of SAP data retrieved, but instead retrieve as much of the SAP data that expresses some functional value.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;What if the same SAP data is to be unlocked both via SharePoint ExternalList, as via SharePoint Enterprise Search? The data integration architectures of these are thus contra dictionary: reduce the retrieved SAP data versus give me all. Well, nothing prohibits you from constructing multiple data integration pipelines, tuned for the different scenarios. For Search, it’s Gateway Model returns in the Query method all fields that contain functional value. And for the real-time ExternalList, that Gateway Model returns in the Query method only those fields that will be rendered as list columns.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt; In Duet Enterprise 1.0, constructing the Gateway Model takes considerable time. This is an obstacle for constructing multiple Gateway Models with different data representation / signature, as it can easily double your Gateway mapping effort and time. Luckily in Duet Enterprise FP1 it is relatively easy to generate a Gateway Model, as long as your SAP landscape data sources live up to the required constraints.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Complex SAP data source structure&lt;/h3&gt;If the SAP data is conceptually a flat structure, it is sufficient to have a single Gateway Model to retrieve the data into SharePoint context. However, we all know that SAP (or, business) data is typically of a more complex structure: hierarchical with multiple child entities. When you want to retrieve such a structure into SharePoint, you basically have 2 options.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;The first is to flatten the structure. This approach suffers from some disadvantages. In case of multiple occurrences of the same child type (e.g. Ordered Item); how many of them should you include in the flattened representation? All, or an arbitrary limited number? Also, for the end-user a flattened structure can be conceptually wrong and counter-intuitive: Ordered Item information is of different functional level as the Purchase Order information. &lt;/div&gt;&lt;div style='margin-top:5px;'&gt;The second option is to maintain the hierarchical SAP structure within the Gateway Model architecture. For this you need to generate a Gateway Model for the parent SAP data entity, as for each type of its child data entities. At SharePoint client-side you associate the 2 resulting External ContentTypes, to establish the parent-child relation. SharePoint BCS respects the association between the External ContentTypes when it operates on the data. In case of SharePoint search, the child-associations are crawled in the context of the parent data, and either the parent or child SAP data entity will appear in search results. The BCS Profile page of a parent data entity renders also the data of its child entities.&lt;/div&gt;&lt;img style="width: 309px; height: 229px;" src="http://4.bp.blogspot.com/-En8aRDbCyDo/TqXBn3Y1dPI/AAAAAAAAANI/hmfWhk3Qh80/s1600/Screen%2BShot%2B2011-10-23%2Bat%2B10.42.19%2BPM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5667148596742812914" /&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;In case of real-time retrieval, you can apply the BCS Business Data webparts: add to the SharePoint page both a Business Data WebPart for the parent entity and a Business Data Related List WebPart for the child data entities. The latter will display the child SAP data entities of the parent SAP data entity that is selected in the Business Data List web part.&lt;/div&gt;&lt;img style="width: 320px; height: 79px;" src="http://3.bp.blogspot.com/-sSWiT9YvDDE/TqXBoK5f7NI/AAAAAAAAANY/L1msqQ-_sv8/s1600/Screen%2BShot%2B2011-10-23%2Bat%2B10.42.59%2BPM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5667148601980087506" /&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;img style="width: 360px; height: 125px;" src="http://1.bp.blogspot.com/-d3_TcVrTL7k/TqXA4Qa8kkI/AAAAAAAAAM8/Z4I_IbArLes/s1600/Screen%2BShot%2B2011-10-23%2Bat%2B10.43.26%2BPM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5667147778828833346" /&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Mind you, the user experience of this setup is not always intuitive. In such case, it can prove better to build an own custom presentation. An example of this is outlined in &lt;a href='http://williamvanstrien.blogspot.com/2011/06/working-with-complex-sap-business.html'&gt;Working with complex SAP business entities in Duet Enterprise&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-8111450906006830983?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/8111450906006830983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/10/data-architecture-considerations-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8111450906006830983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8111450906006830983'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/10/data-architecture-considerations-and.html' title='Data architecture considerations and guidelines for retrieving SAP data via Duet Enterprise into SharePoint'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-En8aRDbCyDo/TqXBn3Y1dPI/AAAAAAAAANI/hmfWhk3Qh80/s72-c/Screen%2BShot%2B2011-10-23%2Bat%2B10.42.19%2BPM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-554155276152805827</id><published>2011-10-16T11:00:00.007+02:00</published><updated>2011-10-16T11:26:06.400+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver Gateway'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Unlocking SAP data via Duet Enterprise Feature Pack 1 in more agile approach</title><content type='html'>&lt;div style='margin-top:5px;margin-bottom:20px;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/26921'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:20px;'&gt;A major bottleneck in applying Duet Enterprise 1.0 is the time it takes the SAP + Microsoft development team to unlock SAP data via Gateway to SharePoint. You have to define the service interface in ES Builder, create a proxy in transaction SPROXY, and next via transaction SE38 realize the GenIL model. The latter requires a lot of handcrafting ABAP code to do the mapping from Gateway runtime context and data representation to SAP backend, and vice versa. Code that follows a pattern, so a good candidate for code generation. This was a major pain point experienced by us when initially applying Duet Enterprise 1.0 within the Ramp-Up in 2010, and with emphasis reported back to the Duet Enterprise product team.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;In the coming Feature Pack 1 version, the Duet Enterprise product team has evidently got the message. FP1 comes with multiple generator tools to ease and speed-up  the realization of the internal Gateway Model (new name for GenIL model) for your application scenarios. Handcrafting is largely eliminated and replaced by full-automatic generation of first the mapping code to unlock the SAP data via NetWeaver Gateway 2.0, and next the required SAP Gateway service proxy, plus the SharePoint BDC model. The latter can be handed over to SharePoint side to import the External ContentType definition into Business Connectivity Services. Something that took us with version 1.0 several days to set things up at both SAP as SharePoint side, now is done in matters of minutes. Very appreciated side-effect of this is that it enables agile development: if the initial Model does not fit the requested application context, just change the mapping in the tooling and regenerate. With handcrafting approach you would loose a lot of elapse time here rearranging and testing your own mapping code.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;img style="width:90%;" src="http://1.bp.blogspot.com/-zrIq2UR29cM/TpqeofXbPBI/AAAAAAAAAMw/3JQ2xDuNIv0/s1600/Screen%2BShot%2B2011-10-15%2Bat%2B4.48.49%2BPM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5664013899823528978" /&gt;&lt;/div&gt;&lt;div style='margin-top:10px;clear:both;'&gt;Of course not all now suddenly comes for free. Before you start the Gateway Model generation, you still first must think about the data integration architecture to achieve your application scenario. An action that involves and requires consensus of both the SharePoint and SAP backend architects plus developers. The usage of the FP1 / Gateway 2.0 generation tools itself put some constraints on the SAP backend data sources; BOR, RFC or Dynpro Screens. Basically it comes down to it that the backend data entities must provide at minimum both a ‘Query’ and ‘ReadItem’ operation, and also ‘Create/Update/Delete’ operations for update scenario via SharePoint. &lt;/div&gt;&lt;div style='margin-top:10px'&gt;What if the available SAP backend entities do not self satisfy the requested integration pattern and/or the generation constraints? Even then, it is far easier and better manageable to realize a custom wrapper RFC within the ERP level that does satisfy the pattern + constraints, than apply the manual Gateway Model code crafting. Spoken from own experiences…&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-554155276152805827?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/554155276152805827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/10/unlocking-sap-data-via-duet-enterprise.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/554155276152805827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/554155276152805827'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/10/unlocking-sap-data-via-duet-enterprise.html' title='Unlocking SAP data via Duet Enterprise Feature Pack 1 in more agile approach'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zrIq2UR29cM/TpqeofXbPBI/AAAAAAAAAMw/3JQ2xDuNIv0/s72-c/Screen%2BShot%2B2011-10-15%2Bat%2B4.48.49%2BPM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3542487073436328216</id><published>2011-10-07T22:29:00.010+02:00</published><updated>2011-10-07T23:26:17.720+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><title type='text'>Read content of uploaded file within ItemAdding method</title><content type='html'>&lt;div&gt;In an application it is required to validate the file content before allowing the upload into a document library. SharePoint 2010 enables this via the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ItemAdding&lt;/span&gt; synchronous &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPItemEventReceiver&lt;/span&gt; method. Problem is however that you cannot access the uploaded file through the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPItemEventProperties.ListItem&lt;/span&gt; object. The item is at runtime of &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ItemAdding&lt;/span&gt; not yet created in and thus not available via the list. Via blogpost &lt;a href='http://khdraft.blogspot.com/2011/04/getting-file-content-from-itemadding.html'&gt;Getting file content from the ItemAdding method of SPItemEventReceiver&lt;/a&gt; I found a code-snippet how to access the file. Last remaining issue was that I received empty result upon reading from the filestream. Debugging I discovered that the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;Stream&lt;/span&gt; position was set to the end of file. Which is logical since the file has been read in order to save it to the content database. By resetting the position I can read the file contents, validate it, and cancel the upload in case of invalid content&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;'&gt;public override void ItemAdding(SPItemEventProperties properties)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;string searchForFileName = Path.GetFileName(properties.BeforeUrl);&lt;br /&gt;&amp;nbsp;&amp;nbsp;HttpFileCollection collection = _context.Request.Files;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for (int i = 0; i &lt; collection.Count; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpPostedFile postedFile = collection[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (searchForFileName.Equals(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Path.GetFileName(postedFile.FileName), StringComparison.OrdinalIgnoreCase))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stream fileStream = postedFile.InputStream;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStream.Position = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] fileContents = new byte[postedFile.ContentLength];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileStream.Read(fileContents, 0, postedFile.ContentLength);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;'&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3542487073436328216?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3542487073436328216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/10/read-content-of-uploaded-file-within.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3542487073436328216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3542487073436328216'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/10/read-content-of-uploaded-file-within.html' title='Read content of uploaded file within ItemAdding method'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-4671307034253553349</id><published>2011-09-29T08:44:00.007+02:00</published><updated>2011-09-29T09:44:18.725+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Portal'/><title type='text'>VNSG event 'SAP en Microsoft - het beste van 2 werelden'</title><content type='html'>&lt;div&gt;De VNSG focusgroep User Experience organiseert op 13 oktober een bijeenkomst met als onderwerp SAP - Microsoft integratie/samenwerking. Bij veel bedrijven zijn zowel Microsoft als SAP belangrijke leveranciers van (bedrijfskritische) software en wordt er continue gezocht naar mogelijkheden om het beste uit beide werelden te halen. Waar SAP vooral bekend staat om haar solide bedrijfsproces ondersteuning, is Microsoft vooral sterk in de User Experience.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;De aard van het evenement is om SAP en Microsoft solution architecten van eindorganisaties met elkaar in gesprek te brengen, en te leren van elkaar. De sessies zijn hierop geselecteerd. Klantorganisaties die bereid zijn gevonden te vertellen over hun ervaringen, best practices en huidige status op SAP / Microsoft integratie vlak.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;De volgende klantorganisaties geven een presentatie:&lt;ul style='margin-top:2px'&gt;&lt;li&gt;Achmea - Remco Jorna: Enterprise Architectuur aanpak&lt;/li&gt;&lt;li&gt;Tata Steel - Hans Brouwer en Tamas Szirtes: An Enterprise Portal Journey...&lt;/li&gt;&lt;li&gt;Eneco - Kees Voeten: HR futureproof bij Eneco&lt;/li&gt;&lt;li&gt;Ziut - Frank Voortman: Duet Enterprise voor SAP/Microsoft integratielaag in aannemersportaal&lt;/li&gt;&lt;/ul&gt;&lt;a href='https://docs.google.com/viewer?a=v&amp;pid=explorer&amp;srcid=0B89AfTMhfP0ZNDEzNjkyYjMtNDUxOS00YWNmLTg0M2MtYWI4MzRmNjZjYWFl&amp;hl=nl'&gt;Volledige agenda&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:normal;'&gt;Event details&lt;/h3&gt;Datum: 13 oktober 2011&lt;br /&gt;Locatie: Microsoft, Schiphol-Rijk&lt;br /&gt;Eventduur: middag&lt;br /&gt;Doelgroep: Solution architecten van eindklanten (profit en non-profit)&lt;br /&gt; &lt;br /&gt;&lt;span style='font-weight:bolder;'&gt;Organisatie:&lt;/span&gt;&lt;br /&gt;Marcel Rabe, secretaris VNSG Focusgroep User Experience&lt;br /&gt;Pim de Wit, kernteam lid&lt;br /&gt;William van Strien, kernteam lid&lt;br /&gt;Gijs Leurs, kernteam lid&lt;br /&gt;&lt;br /&gt;Aanmelden voor dit event is ook open voor niet-VNSG leden: &lt;a href='http://www.surveymonkey.com/s/DR5S5NH '&gt;aanmeldingsformulier&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-4671307034253553349?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/4671307034253553349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/09/vnsg-event-sap-en-microsoft-het-beste.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4671307034253553349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4671307034253553349'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/09/vnsg-event-sap-en-microsoft-het-beste.html' title='VNSG event &apos;SAP en Microsoft - het beste van 2 werelden&apos;'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-4057043968206505052</id><published>2011-09-03T23:16:00.009+02:00</published><updated>2011-09-04T00:13:16.678+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebPart'/><category scheme='http://www.blogger.com/atom/ns#' term='Audience'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><title type='text'>On-the-fly content-targetting via custom AudienceManager</title><content type='html'>&lt;div&gt;In a SharePoint project, one of the requirements is to enable the end-user to set preferences, which are then immediately be applied in the portal. One of the settable preferences is the (non)interest in subjects/functions: if interested, webparts will be visible; if non-interest specified, the webpart will be invisible. Well, this kinda sounds like SharePoint &lt;span style='font-family:Syntax;font-size:9pt;'&gt;audiences&lt;/span&gt;. As this is out-of-the-box SharePoint functionality, it is applicable for both our own custom webparts as well as standard and third-party webparts. The only problem is the sub-requirement to have the preferences immediately applied in the portal. Standard SharePoint audiencing requires to compile the Audience before it takes effect, which either occurs on scheduled basis or on request. But never immediately.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The solution for this is to utilize a custom &lt;span style='font-family:Syntax;font-size:9pt;'&gt;PreferencesAudienceManager&lt;/span&gt;, with functionality to on-the-fly derive &lt;span style='font-family:Syntax;font-size:9pt;'&gt;Audience&lt;/span&gt; membership on basis of the selected settings.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:smaller;'&gt;System architecture&lt;/h3&gt;&lt;img src='http://2.bp.blogspot.com/-GSEzmRc1o84/TmKfNZTEjzI/AAAAAAAAAMc/aDb0PONtBb0/s1600/preferences_arch.jpg' style='width:90%;'&gt;&lt;/img&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style='margin-top:20px;'&gt;&lt;h3 style='font-size:smaller;'&gt;PreferencesAudienceManager code-extract&lt;/h3&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:10px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;height:300px;overflow:scroll;overflow-x:hidden;'&gt;&lt;br /&gt;public class PreferencesAudienceManager : IRuntimeFilter2&lt;br /&gt;{     &lt;br /&gt;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;public bool CheckRuntimeRender(string IsIncludedFilter)     &lt;br /&gt;&amp;nbsp;&amp;nbsp;{       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool render = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (SPContext.Current != null &amp;&amp; SPContext.Current.Web.CurrentUser != null)         &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Priority to OOTB SharePoint Audiencing.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;render = AudienceManager.IsCurrentUserInAudienceOf(IsIncludedFilter, true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!render)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] globalAudienceIDs = null;                     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] dlDistinguishedNames = null;                     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] sharePointGroupNames = null;        &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int num = AudienceManager.GetAudienceIDsFromText(IsIncludedFilter, out globalAudienceIDs, out dlDistinguishedNames, out sharePointGroupNames);                     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (num &gt; 0 &amp;&amp; globalAudienceIDs != null &amp;&amp; globalAudienceIDs.Length &gt; 0)                     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string userIdent = PersonalizationUtils.GetCurrentUserIdentifier;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UserPreferences userPreferences = PreferencesRepository.ReadUserPreferences(userIdent);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPServiceContext context = SPServiceContext.GetContext(SPContext.Current.Site);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AudienceManager am = new AudienceManager(context);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string audienceId in globalAudienceIDs)                         &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{                             &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid g = new Guid(audienceId);                             &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Audience a = am.Audiences[g];      &lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string preferenceAudienceName = a.AudienceName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UserPreferences preferenceAudience = (UserPreferences)Enum.Parse(typeof(UserPreferences), preferenceAudienceName );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((preferenceAudience &amp; userPreferences) == preferenceAudience)                             &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{                                 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;render = true;                                 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;             &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}                         &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}                     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}               &lt;br /&gt;&amp;nbsp;&amp;nbsp;}     &lt;br /&gt;&amp;nbsp;&amp;nbsp;return render;         &lt;br /&gt;}       &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;'&gt;There is on caveat you need to be aware of; the ability to even use Audiences functionality, requires that the User Profile Service Application is installed in the farm. Microsoft namely placed the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;Audience&lt;/span&gt; functionality within the context of User Profile; even though you can thus apply Audiencing without dependency of User Profile values.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-4057043968206505052?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/4057043968206505052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/09/on-fly-content-targetting-via-custom.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4057043968206505052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4057043968206505052'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/09/on-fly-content-targetting-via-custom.html' title='On-the-fly content-targetting via custom AudienceManager'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-GSEzmRc1o84/TmKfNZTEjzI/AAAAAAAAAMc/aDb0PONtBb0/s72-c/preferences_arch.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5203985640999594546</id><published>2011-08-23T20:01:00.006+02:00</published><updated>2011-08-23T20:26:04.808+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Sandbox solution'/><title type='text'>ListTemplate cached in Sandboxed process</title><content type='html'>&lt;div&gt;Sandboxed solution are a great addition to SharePoint 2010 capabilities whenever it is required to deploy own customizations. However, be aware of the restrictions, and some oddities. Today I encountered such an unexpected behaviour. &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ListTemplates&lt;/span&gt; are one of the SharePoint artefacts that allow themselves to be deployed via a Sandboxed solution. In the initial version of a custom &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ListTemplate&lt;/span&gt;, some errors and omissions were made with respect to &lt;span style='font-family:Syntax;font-size:9pt;'&gt;schema.xml&lt;/span&gt; and some &lt;span style='font-family:Syntax;font-size:9pt;'&gt;forms&lt;/span&gt;. I corrected these, and deployed (= uploaded + activated) the Sandboxed solution. To discover next that my changes were not present; not within the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;Feature&lt;/span&gt;-provisioned &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ListInstance&lt;/span&gt; based on the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ListTemplate&lt;/span&gt;, nor within a manually created &lt;span style='font-family:Syntax;font-size:9pt;'&gt;FormsLibrary&lt;/span&gt; instance based on the custom &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ListTemplate&lt;/span&gt;. It took an AppPool recycle to have the latest deployed &lt;span style='font-family:Syntax;font-size:9pt;'&gt;ListTemplate&lt;/span&gt; definition become effective in the sitecollection. Tip: always recycle the AppPool &lt;span style='font-weight:bolder;font-style:italic;'&gt;before&lt;/span&gt; re-deploying a Sandboxed solution.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5203985640999594546?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5203985640999594546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/listtemplate-cached-in-sandboxed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5203985640999594546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5203985640999594546'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/listtemplate-cached-in-sandboxed.html' title='ListTemplate cached in Sandboxed process'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-7007239694379801426</id><published>2011-08-17T21:50:00.015+02:00</published><updated>2011-08-18T22:18:38.402+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='WebSphere MQ'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>HowTo omit the standard xml-namespaces in WCF MQ requests</title><content type='html'>&lt;div&gt;&lt;a href='http://williamvanstrien.blogspot.com/2011/07/ibm-websphere-mq-wcf-channel-has.html'&gt;Earlier&lt;/a&gt; I reported that we encountered an issue with communication via IBM MQ WCF Channel over a clustered IBM WebSphere MQ-queue. The problem was already known within IBM and the fixed software ready on the shelves, and naturally we were very willing to be a first beta-tester. With this IBM fix, the EndPointNotFound problem was indeed solved. Sadly, we next ran into another issue. This time it manifested itself in our own service implementation at the receiving side. Upon receiving a MQ-request, the service responded with a technical error. Due the holiday season it took some elapse time before the right people were available and able to investigate the cause. The problem analyse led to the suspicion that the presence of xml-namespaces in the webrequest was unexpected, and therefore the service refused the request:&lt;br /&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;&lt;br /&gt;&amp;lt;ServiceRequestName &lt;span style='font-weight:bolder;'&gt;xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"      xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"&lt;/span&gt;&amp;gt;  ... &amp;lt;/ServiceRequestName&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;Both namespaces are default included when serializing a &lt;span style='font-family:Syntax;font-size:9pt;'&gt;System.ServiceModel.Channels.Message&lt;/span&gt; instance from inside WCF client processing. You can however prevent this by implementing an subclass of &lt;span style='font-family:Syntax;font-size:9pt;'&gt;System.ServiceModel.Channel.Body.Writer&lt;/span&gt;, and override the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;OnWriteBodyContents&lt;/span&gt; method. Next inject this method within the WCF Channel:&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.ServiceModel.Channels.Message message =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Message.CreateMessage(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageVersion.None,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string.Empty,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='font-weight:bolder;'&gt;new XmlBodyWriter&amp;lt;TRrequest&amp;gt;(request));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var responseMessage = webmqclient.Request(message);&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;public class XmlBodyWriter&amp;lt;TBody&amp;gt; : BodyWriter&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private readonly TBody request;&lt;br/&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public XmlBodyWriter(TBody request) : base(true)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.request = request;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected override void OnWriteBodyContents(XmlDictionaryWriter writer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteBodyContents(SerializeRequest(), writer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private static void WriteBodyContents(StringBuilder output, XmlWriter writer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (var reader = new StringReader(output.ToString()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (XmlReader xmlReader = XmlReader.Create(reader))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteNode(xmlReader, true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private StringBuilder SerializeRequest()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var output = new StringBuilder();&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (var xmlWriter = XmlWriter.Create(output, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = Encoding.UTF8 }))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var serializer = new XmlSerializer(typeof(TBody));&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Service does not expect xml-namespacing; including the standard &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// xmlns:xsd="http://www.w3.org/2001/XMLSchema"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Omit these from the serialized request&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='font-weight:bolder;'&gt;XmlSerializerNamespaces ns = new XmlSerializerNamespaces();&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='font-weight:bolder;'&gt;ns.Add("", "");&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style='font-weight:bolder;'&gt;serializer.Serialize(xmlWriter, request, ns);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;With this modification to the serialization processing of the WCF MQ request, the service at the receiving WebSphere MQ side now replies with a correct functional response.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-7007239694379801426?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/7007239694379801426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/howto-omit-standard-xml-namespaces-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7007239694379801426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7007239694379801426'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/howto-omit-standard-xml-namespaces-in.html' title='HowTo omit the standard xml-namespaces in WCF MQ requests'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-8734275211443371859</id><published>2011-08-15T20:27:00.010+02:00</published><updated>2011-08-15T23:12:19.049+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><category scheme='http://www.blogger.com/atom/ns#' term='Sandbox solution'/><title type='text'>Deleted SPWeb in RecycleBin can obstruct deactivation of Sandboxed Solution</title><content type='html'>&lt;div&gt;The other day, upon deactivating a Sandboxed Solution in our test farm, SharePoint aborted on it with the message:&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;Cannot access web-scoped feature {GUID} because it has references to a site with id {GUID}. &lt;br /&gt;System.ArgumentException: Value does not fall within the expected range. &lt;br /&gt;at Microsoft.SharePoint.SPWebCollection.get_Item(Guid id) &lt;br /&gt;at Microsoft.SharePoint.SPFeatureEnumeratorBase.GetCachedWeb(SPSite site, Guid webId, Guid featureId)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;We earlier encountered this problem in the development farm. Thorough investigation by SharePoint operations together with development led to the conclusion that the SharePoint content database had reached a corrupt state due deletion of a &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPWeb&lt;/span&gt;. On that &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPWeb&lt;/span&gt; a &lt;span style='font-family:Syntax;font-size:9pt;'&gt;Feature&lt;/span&gt; provisioned via the Sandboxed Solution had been activated. And now after deletion of that &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPWeb&lt;/span&gt;, apparently a lock internal in the SharePoint content database was present obstructing disablement of that &lt;span style='font-family:Syntax;font-size:9pt;'&gt;Feature&lt;/span&gt;. And since it is not recommended - and certainly unsupported - to manually alter a SharePoint content database, there seemed no other realistic approach to get out of this erroneous situation as by recreating and reprovisioning the entire sitecollection.&lt;/div&gt;&lt;div style='margin-top:10px'&gt;For the development instance, this was an acceptable pragmatic solution. However, in our test environment a lot of content is already created by end-users. Just throwing away the &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPSite&lt;/span&gt; and replacing it by a brand new, is not viable. The only remaining solution seemed to afterwards restore the backed-up content into the new &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPSite&lt;/span&gt;. Not undoable, but it will take time [to setup and execute the site content restore; and next to validate the correctness and completeness of it]. And moreover, it will result in a loss of trust by our end-users and customer on the robustness of SharePoint 2010 as application platform. If it happens once [actually twice], what guarantee is there it will not happen again?&lt;/div&gt;&lt;div style='margin-top:10px'&gt;Luckily, then I had a smart thought while discussing the problem symptons with a co-developer. If the problem appeared to be caused by the deletion of a SPWeb, would it then help to restore this &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPWeb&lt;/span&gt; instance from the RecycleBin? Worth a try. And guess what: it did!! After the earlier deleted &lt;span style='font-family:Syntax;font-size:9pt;'&gt;SPWeb&lt;/span&gt; had been restored from the recyclebin, the earlier activated Sandboxed Solution could next successfully be deactivated.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-8734275211443371859?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/8734275211443371859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/deleted-spweb-in-recyclebin-can.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8734275211443371859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8734275211443371859'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/deleted-spweb-in-recyclebin-can.html' title='Deleted SPWeb in RecycleBin can obstruct deactivation of Sandboxed Solution'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5248459323499551067</id><published>2011-08-12T22:26:00.010+02:00</published><updated>2011-08-12T23:34:04.507+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath Forms Server'/><title type='text'>Misleading SecureStore message with InfoPath Forms Services</title><content type='html'>&lt;div&gt;In current project we publish an InfoPath 2010 formtemplate to SharePoint 2010 sitecollection. In the formtemplate, multiple controls are populated with data retrieved from a single SharePoint list via &lt;a href='http://blogs.msdn.com/b/infopath/archive/2007/01/15/populating-form-data-from-sharepoint-list-views.aspx'&gt;application of owssvr.dll&lt;/a&gt; and filtering views on that list. The SharePoint WebApplication is set up as Claims-Based. A consequence is that from within InfoPath Forms Services context it is not possible to authenticate via owssvr.dll webservice to the SharePoint list. The proper &lt;a href='http://msdn.microsoft.com/en-us/library/ms771995.aspx'&gt;solution&lt;/a&gt; for this is to retrieve the data via Universal Data Connections, and let each UDCX authenticate itself to SharePoint. Either by explicit authentication; that is including the credentials in all UDCX files. But preferably by using the SecureStore; so that the credentials are maintained in a single location and not readable included in the UDCX files.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;So far for the theory. In real practice, we encountered a problem with this setup: our formtemplate failed to retrieve the filtered data. In the ULS following message was logged per owssvr.dll/XmlQuery data connection upon opening the formtemplate in browser:&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;InfoPath Forms Services        Maintenance                    82lm Information Delegation was attempted for Secure Store application APPL_InfoPathService. (User: 0#.w|domain\useraccount, IP: , Request: http://appl.dev.hosting.corp/Pages/orderform.aspx) &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;This seems to indicate as if the individual logged-in user has no permission to access/use the SecureStore ApplicationID. Inquiry with Operations refuted that suspicion: the SSS ApplicationID was configured for 'All Authenticated Users'. The actual cause appeared that the service account configured in the SSS ApplicationID no longer had permission/read access to the SharePoint site collection. Instead of above message, I would have preferred a direct 401 or AccessDenied cause-indication in the ULS...&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5248459323499551067?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5248459323499551067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/misleading-securestore-message-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5248459323499551067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5248459323499551067'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/misleading-securestore-message-with.html' title='Misleading SecureStore message with InfoPath Forms Services'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-8582942743831282301</id><published>2011-08-03T01:00:00.002+02:00</published><updated>2011-08-03T01:09:18.140+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Publication on 'Succesful disclosure of SAP data and processes in SharePoint'</title><content type='html'>&lt;div&gt;In the May-edition of the Dutch Software Development Network (SDN) magazine I published an article co-authored with Marcel Kempers on the why, and approach for how succesful disclose SAP data + processing within a SharePoint based solution. As of this month, the &lt;a href='http://www.sdn.nl/SDN/Artikelen/tabid/58/view/View/ArticleID/3173/Succesvol-ontsluiten-van-informatie-en-processen-uit-SAP-in-SharePoint.aspx'&gt;publication&lt;/a&gt; is also online available. &lt;i&gt;Mind you; it is in Dutch...&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-8582942743831282301?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/8582942743831282301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/publication-on-succesful-disclosure-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8582942743831282301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8582942743831282301'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/08/publication-on-succesful-disclosure-of.html' title='Publication on &apos;Succesful disclosure of SAP data and processes in SharePoint&apos;'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5872472394554253968</id><published>2011-07-26T10:09:00.001+02:00</published><updated>2011-07-26T10:09:00.882+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebPart'/><category scheme='http://www.blogger.com/atom/ns#' term='Audience'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>Personalization approach / settings administrated outside content database</title><content type='html'>&lt;div&gt;Personalization is an important functional aspect in my current SharePoint 2010 project. Personalization on itself is a phrase that can have multiple meanings and appearances. Examples:&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Customize a page for your own preferences; via personal settings of webpart properties&lt;/li&gt;&lt;li&gt;Content targeting; on basis of the visitors profile&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;SharePoint enables page personalization via the Provider model, inherited from ASP.net. Implication of the standard SharePoint personalization approach is that each authenticated user gets an own copy per personalized page in the content database. The personalized settings are thus administrated in the content database, similar as in case of shared webpart properties. A disadvantage of this approach is that this makes it very difficult to (web content) manage the page. A content manager can update the (template) page, but none of the content changes are automatically propagated to the individual personalization page copies in the content database.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;In our application scenario, we have the additional functional requirement that it must be viable to extract management information reports of the personalized settings: what type of user (profiles) typically select personalized setting X, choose to close webpart Y etcetera. Although not impossible, it is rather impractical to extract this management information when the personalized data is stored in the content database. The schema of the SharePoint content database must be treated as internal black box, and cannot be relied on. The schema also does not support ad-hoc querying for answering varying management info requests.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;We also have User Experience related requirements: the users must be able to personalize, without being aware or be directly confronted with SharePoint. It should be intuitive and natural, without explicit [noticable] personalization-setting modus. Examples of requested personalizations are tuning the webpart behavior via settings, and dynamically reposition the webparts in the page.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;These combined end-user and management requirements effectively rank out the utilization of standard SharePoint personalization. So what’s a viable alternative? The one we came up consists of the following elements:&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;[Standard] shared webpart properties for enabling the content managers to set the initial and default values for personalizable settings. The shared value is regularly stored in the SharePoint content database, and applied for each visitor which has not [yet] explicitly personalized the shared setting.&lt;/li&gt;&lt;li&gt;Storage of personalization settings in an own SQL Server database&lt;/li&gt;&lt;li&gt;The iGoogle-like reposition behavior via jQuery and webpart zones tagged as droppable zones&lt;/li&gt;&lt;li&gt;An abstract base PersonalizationWebPart; that handles both the server-side aspects of personalization (retrieving + applying personalization settings, as well as saving them), as the client-side (webpart movement); and that implements virtual methods for concrete subclasses to hook into.&lt;/li&gt;&lt;li&gt;Custom &lt;code&gt;AudienceProvider&lt;/code&gt; to derive on-the-fly whether visitor is within a certain audience by checking setting stored in the own SQL Server database [thus no need for User Profiles, nor compiling of Audiences]&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Extra and a major advantage of this personalization approach is that there no longer originates a copy of the page being personalized. If the content manager updates the page, by adding or removing a webpart, modifying content on a publishing page; these changes are automatic and immediate effective for all the visitors, whether one has personalized the page or not.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5872472394554253968?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5872472394554253968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/07/personalization-approach-settings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5872472394554253968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5872472394554253968'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/07/personalization-approach-settings.html' title='Personalization approach / settings administrated outside content database'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-2622679783571376779</id><published>2011-07-13T23:29:00.011+02:00</published><updated>2011-07-14T00:30:16.513+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web.config'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Audience'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><title type='text'>Make AudienceFilter webpart setting visible without User Profile Service Application started</title><content type='html'>&lt;div&gt;In current project we aim to apply SharePoint's audiencing mechanisme for content targetting. As audience filters we'll use SharePoint group membership, we will not derive the audience from User Profile properties. In our current state of SharePoint farm, the User Profile service application is even not available .&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;One of the advantages of SharePoint audiencing is that it is out-of-the-box available for every webpart; standard SharePoint and custom webparts. However, when we intended to apply an audience filter to a standard &lt;code&gt;ContentEditorWebPart&lt;/code&gt; in our test-environment, we were confronted with a missing Audiencing setting in the webpart toolpart. Search on the web points to prerequiste of the User Profile service application being activated. However, this is neither possible in our farm infrastructure planning, nor needed for the manner in which our application will use audiencing, that is on basis of SPGroup memberships.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Via reverse engineering SharePoint code [using .NET Reflector] I found out what directly determines the visiblity of the AudienceFilter webpart property. The responsible &lt;code&gt;AdvancedToolpart&lt;/code&gt; class does a check on the web.config for config property "SharePoint/RuntimeFilter": if the property is not present, or the referred assembly is not valid, none of the webparts in this SharePoint webapplication will display the AudienceFilter webpart property in their toolpart. I validated this by outcommenting in web.config the property; for instance the toolpart of a &lt;code&gt;ContentEditorWebPart&lt;/code&gt; then misses the AudienceFilter setting. After reinstating the web.config property, and reopening the toolpart; the webpart property is visible again. And thus available for usage for filters on basis of SharePoint groups, or a custom &lt;code&gt;AudienceProvider&lt;/code&gt;.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;img style='width:90%;' src="http://3.bp.blogspot.com/-zTVMSTtPRp4/Th4Xt5LryzI/AAAAAAAAAMU/mmcAQkcjWX8/s320/AudiencingPropertySetting.jpg" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-2622679783571376779?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/2622679783571376779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/07/make-audiencefilter-webpart-setting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2622679783571376779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2622679783571376779'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/07/make-audiencefilter-webpart-setting.html' title='Make AudienceFilter webpart setting visible without User Profile Service Application started'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-zTVMSTtPRp4/Th4Xt5LryzI/AAAAAAAAAMU/mmcAQkcjWX8/s72-c/AudiencingPropertySetting.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-1822534721163246606</id><published>2011-07-08T18:12:00.011+02:00</published><updated>2011-07-08T20:43:57.166+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebSphere MQ'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>IBM WebSphere MQ WCF Channel has problem with clustered Queues</title><content type='html'>&lt;div&gt;The Enterprise Architecture roadmap of customer aims at a SAP-unless policy, and SharePoint for all web-applications/front-ends. Currently there are still multiple applications in their IT landscape which do not obey do this future direction. For some of them, e.g. J2EE based service application, the enterprise architecture integration guidelines prescribes that the client-services communication occurs via IBM WebSphere MQ (&lt;span style='font-style:italic;'&gt;WMQ&lt;/span&gt;). From the .NET client perspective, WCF based communication is nowadays preferred and proven technology, and must be applied for any new web-applications that invoke other applications.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;For .NET client context there are in reality 2 viable WCF Channel options for putting requests as messages on an IBM WebSphere Queue (&lt;span style='font-style:italic;'&gt;WCF WMQ&lt;/span&gt;). One is part of Microsoft Host Integration Server, the other one is provided by IBM.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;For reasons explained else, the.NET and Integration architects decided to apply the IBM WebSphere MQ Channel for WCF. It is successful applied in several .NET applications to put messages on WMQ. In my current application project we also need to invoke services of a ‘legacy’ system, callable over WMQ. However, when this application puts a message on the assigned Queue via Request-Reply, we ran into the following exception:&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;width:90%;height:300px;overflow:scroll;overflow-x:hidden;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:10px;'&gt;System.ServiceModel.EndpointNotFoundException was unhandled by user code&lt;br /&gt;  Message=WCFCH0309E: An error occurred while attempting to open the channel for endpoint 'jms:/queue?destination=APPL.REQ.QUEUE@XXXX01&amp;connectionFactory=connectQueueManager(XXXX01)clientChannel(WMQ.Channel.TST)clientConnection(dev-xx.xxx.com(7201))&amp;initialContextFactory=com.ibm.mq.jms.Nojndi&amp;persistence=1&amp;replyDestination=APPL.RPL.QUEUE' The operation could not be completed. The endpoint may be down, unavailable, or unreachable, review the linked exception for further details.&lt;br /&gt;  Source=mscorlib&lt;br /&gt;  StackTrace:&lt;br /&gt;    Server stack trace: &lt;br /&gt;       at IBM.XMS.WCF.XmsChannelHelper.ThrowCommsException(OperationType op, Exception innerException, String endpointURI)&lt;br /&gt;       at IBM.XMS.WCF.XmsChannelHelper.CheckExceptionAndTimeout(OperationType op, Exception e, String timeout, String endpointURI)&lt;br /&gt;       at IBM.XMS.WCF.XmsRequestChannel.OnEndOpen(IAsyncResult result)&lt;br /&gt;       at IBM.XMS.WCF.XmsRequestChannel.OnOpen(TimeSpan timeout)&lt;br /&gt;       at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)&lt;br /&gt;       at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)&lt;br /&gt;       at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)&lt;br /&gt;       at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)&lt;br /&gt;       at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)&lt;br /&gt;       at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)&lt;br /&gt;       at System.ServiceModel.Channels.ServiceChannel.Request(Message message, TimeSpan timeout)&lt;br /&gt;    Exception rethrown at [0]: &lt;br /&gt;       at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)&lt;br /&gt;       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp; msgData, Int32 type)&lt;br /&gt;       at System.ServiceModel.Channels.IRequestChannel.Request(Message message)&lt;br /&gt;       at Application.&amp;lt;&lt;span style='font-style:italic;'&gt;CustomCode&lt;/span&gt;&amp;gt;.Client.&amp;lt;&lt;span style='font-style:italic;'&gt;InvocateAMethod&lt;/span&gt;&amp;gt;(MethodRequest_1_0 request)&lt;br /&gt;       at System.Web.UI.WebControls.Button.OnClick(EventArgs e)&lt;br /&gt;       at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)&lt;br /&gt;       at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)&lt;br /&gt;       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)&lt;br /&gt;  InnerException: IBM.XMS.IllegalStateException&lt;br /&gt;       Message=Failed to open MQ queue APPL.REQ.QUEUE. XMS attempted to perform an MQOPEN, but WebSphere MQ reported an error. Use the linked exception to determine the cause of this error. Check that the specified queue and queue manager are defined correctly.&lt;br /&gt;       Source=IBM.XMS.Client.WMQ&lt;br /&gt;       ErrorCode=XMSWMQ2008&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;'&gt;It took me several hours and diverse try-outs together with an MQ developer at the receiving WebSphere MQ side, to ultimately find out the following. The IBM WCF transport channel for WMQ (&lt;a href='http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.csqzav.doc/un12025_.htm'&gt;WebSphere MQ 7.0.1 installation&lt;/a&gt;) has a problem with clustered queues, and errors when attempting to open the queue. In case of putting messages to a non-clustered queue – the WMQ infrastructure of the other .NET applications -, the channel opens successfully and messages request + replies are delivered. The problem is reproduced outside the context of our SharePoint application, via a simple testprogram; thus appears to be structural. We are currently addressing IBM to analyze it, and come up with a structural solution. For now, the pragmatic solution appears to communicate via non-clustered Queue.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-1822534721163246606?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/1822534721163246606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/07/ibm-websphere-mq-wcf-channel-has.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1822534721163246606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1822534721163246606'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/07/ibm-websphere-mq-wcf-channel-has.html' title='IBM WebSphere MQ WCF Channel has problem with clustered Queues'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-914689422347945446</id><published>2011-07-05T21:20:00.025+02:00</published><updated>2011-07-05T22:20:12.598+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>Using ServiceLocator in Sandbox requires pre-generated xml-serialization</title><content type='html'>&lt;div&gt;The SharePoint Guidance [SPG] &lt;code&gt;ServiceLocator&lt;/code&gt; provides you with a ready-to-use implementation of a Dependency Injection container. However, be aware of the following restriction when applying the SPG &lt;code&gt;ServiceLocator&lt;/code&gt; in a constrained Sandbox context: it is not possible to compile on-the-fly generated xml-serialization classes, which are required for administrating the service interface and implementation within the servicelocator &lt;code&gt;typemappings&lt;/code&gt;.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The execution of code statement:&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;typeMappings.RegisterTypeMapping&amp;lt;IServiceContract, ServiceImplementation&amp;gt;();&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;resulted in the following exception inside ServiceLocator code:&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;Microsoft.Practices.SharePoint.Common.Configuration.&lt;br/&gt;ConfigurationException: Error on serializing configuration data ---&amp;gt; Microsoft.SharePoint.UserCode.SPUserCodeSolutionProxiedException: Error on serializing configuration data ---&amp;gt; Microsoft.SharePoint.UserCode.SPUserCodeSolutionProxiedException: Cannot execute a program. The command being executed was "C:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe" /noconfig /fullpaths @"C:\Users\SPadministrator\AppData\Local\Temp\OICE_925B8D58-F6D1-4BB3-9E01-FCBB9D816D0B.0\wkdrltlt.cmdline".&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-EZ8BJF3YZLU/ThNwlhxI8CI/AAAAAAAAAMM/CV1WD_YKswM/s1600/ConfigException.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width:90%;" src="http://4.bp.blogspot.com/-EZ8BJF3YZLU/ThNwlhxI8CI/AAAAAAAAAMM/CV1WD_YKswM/s1600/ConfigException.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;h3 style='font-size:smaller;'&gt;Explanation of this behavior:&lt;/h3&gt;SPG &lt;code&gt;ServiceLocator&lt;/code&gt; applies XML serialization to administer the &lt;code&gt;typemappings&lt;/code&gt; for the service interface and service implementation class. .NET XML serialization approach supports JIT compilation of the required xml-serialization classes. The benefit is that you do not need to generate and deploy these xml-serialization classes, the &lt;code&gt;XmlSerializer&lt;/code&gt; framework generates them on spot. However, to be able to do this assembly generation; the .NET compiler is needed. And when within the Sandboxed constraints, you are not allowed to use filesystem resources.&lt;br/&gt;By doing a little ‘digging’ in the SPG runtime pipeline, I discovered that not even my own custom classes caused the runtime serialization error; it actually could be derived back to the following serialization:&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;'&gt;new System.Xml.Serialization.XmlSerializer(typeof(&lt;br/&gt;Microsoft.Practices.SharePoint.Common.ServiceLocation.ServiceLocationConfigData))&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;The solution is to make sure that the required xml-serialization classes are already available: either in the GAC for generic use, or also deployed in the sandbox. I opted in this particular case to deploy &lt;code&gt;Microsoft.Practices.SharePoint.Common.XmlSerialization.dll&lt;/code&gt; in the Sandbox.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-914689422347945446?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/914689422347945446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/07/using-servicelocator-in-sandbox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/914689422347945446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/914689422347945446'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/07/using-servicelocator-in-sandbox.html' title='Using ServiceLocator in Sandbox requires pre-generated xml-serialization'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-EZ8BJF3YZLU/ThNwlhxI8CI/AAAAAAAAAMM/CV1WD_YKswM/s72-c/ConfigException.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-1804291780756384488</id><published>2011-06-19T11:44:00.039+02:00</published><updated>2011-10-16T11:15:10.919+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver Gateway'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Working with complex SAP business entities in Duet Enterprise</title><content type='html'>&lt;div&gt;&lt;span style='font-style:italic;'&gt;Duet Enterprise natively only supports flattened SAP data entities. Typically however business data exhibits a complex structure. Via custom programming against the SharePoint BCS ObjectModel it is possible to integrate complex SAP business entities via Duet Enterprise in SharePoint.&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:5px;margin-bottom:20px;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/25112'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;A sales talk of Duet Enterprise is that you can integrate with minimal effort SAP data and functionality in SharePoint UI. This however is only true if your SAP data complies to the following constraints: 1) the SAP data entities must at least be made accessible via a Query and ReadItem operation; 2) in case of full update context, also the Create, Update and Delete operations must be available in the SAP data entity; 3) the SAP data entity must exhibit a flat data structure.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Constraints 1 and 2 are imposed by the usage of SharePoint Business Connectivity Services (BCS) for working with SAP external data from within SharePoint context. As result of the central BCS role in the Duet Enterprise architecture, these constraints are inevitable. Constraint 3 is required to visualize the SAP data via SharePoint External List in the well-known UI List format. Aspect of the list UI metaphor is that it resembles a data table, with row-based data.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Problem however is that typically, enterprise data is non-flattened. Enterprise data often has an hierarchical structure: parent with multiple child data entities. E.g. an Order containing multiple Orderlines; an Expense form with multiple individual ExpenseDetails. As result of constraint 3, it follows that such complex data cannot be visualized in SharePoint UI via the out-of-the-box External List. Does this mean that SAP complex business entities thus cannot be integrated within SharePoint UI context via Duet Enterprise? The answer to that is negative. The applied Duet Enterprise architecture itself, with SharePoint BCS and the SAP Service Consumption Layer (SCL) in the middle, has neither restrictions nor problems with interoperating on and exchanging hierarchical SAP data. It is merely the External List concept that cannot visualize complex data (note: this limitation is generic, thus not only for SAP data structures, but also non-SAP business data structures; as Oracle, Microsoft Dynamics, SQL-based, WCF data objects, …). You can still apply Duet Enterprise as SAP / SharePoint integration foundation in case of complex SAP data structures, but it requires you to build a custom UI in SharePoint instead of the out-of-the-box External List concept. Nothing withholds you from constructing a custom SharePoint UI to display the hierarchical data, e.g. in a master-slave UI concept.&lt;/div&gt;&lt;div style='margin-top:5px'&gt;Well, not entirely true…; a noticeable problem with building a custom UI to interoperate Duet Enterprise, is that the custom UI must then program against the BCS ObjectModel API. And the BCS OM currently only provides a [very] weakly typed programming model, instead of the strong-types we are used to in a regular .NET context (e.g. WCF data objects plus WCF interfaces). The explanation for this is that BCS is a generic concept, intended to interoperate against arbitrary external data repositories and various and a priori unknown data structures. In its current stadium, the mapping at .NET client side to the concrete external data structures is enabled via a general purpose ‘BCS operation language’. The problem with that BCS language is that there is no compile-time checking nor support to prevent you from making typo or structure mistakes.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h2 style='font-size:110%;'&gt;An example interoperating complex SAP data into SharePoint&lt;/h2&gt;Via an example I will demonstrate in overview what it takes to interoperate complex SAP data via Duet Enterprise into a SharePoint front-end.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:smaller;'&gt;Example&lt;/h3&gt;Employee Self-Service process for expense handling. The process consists of multiple steps: it starts when an employee submits an expense form for receiving a refund; next the employee’s manager will review the form, and either approve, deny, or return it for further explanation. In case of approval, the finance department will refund the made expenses. In case of return, the employee can augment the expense form with additional remarks, and then resubmit. Or the employee can decide to withdraw the returned expense form. In case of denied expense, the process directly stops. Each process execution ends with archival of the submitted form and other documentation.&lt;/div&gt;&lt;div style='margin-top:5px'&gt;Current, this process is already implemented within the SAP environment. Employees can enter a form via a WebDynpro form; which kicks of a SAP workflow process. The manager receives the review task in this workflow within the SAP Universal Work List. Payment is done via the HR business package.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Although thus the expense process is already implemented in the IT landscape, management feels the need to improve on it. Employees are complaining about the WebDynpro UI, which looks and behaves different as the SharePoint based intranet in which they are performing their primary work activities. The managers on the other hand are perfectly satisfied to perform the review task within the SAP GUI, since this is for them also for most other tasks the familiar work environment. The financial handling is mostly automatic performed in the SAP backend, near to the other financial processes; so neither any reason to change on that. The management therefore decides to bring the employee’s involvement in the process into the context of the SharePoint based intranet, while leaving the rest of the process execution untouched (phase 1).&lt;/div&gt;&lt;br /&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:smaller;'&gt;Step 1: derive the requirements and the functional + process requirements&lt;/h3&gt;Since the process is already implemented; this step can largely reuse on what is already available qua system and process specifications.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:smaller;'&gt;Step 2: derive the integration and software architecture&lt;/h3&gt;The project goal is enabling employees to operate their steps in the expense handling process directly within the SharePoint intranet, with the same familiar UI look &amp; feel as other parts in that intranet. Implication of that is to interchange the WebDynpro front-end for a SharePoint front-end. Via well-derived integration points this new front-end must hook into the existing expense process.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:smaller;'&gt;Step 3: define the interoperability interface of the SAP backend&lt;/h3&gt;With the integration and software architecture in place, including the conceptual specifications of the integration interfaces SharePoint front-end &lt;– SAP process; the next step is to realize the process integration at SAP side. Following the Duet Enterprise Development Steps, this first means to map the conceptual interfaces onto SAP SCL Interfaces. That development activity is done in SAP Enterprise Service Builder (ES Builder). There, you specify the data types, message types, and method operations.&lt;/div&gt;&lt;div style='margin-top:5px;font-style:italic;'&gt;Screenshots of the specification at SAP side of a Query operation signature, with a complex hierarchical SAP data entity&lt;br /&gt;&lt;img style="width:90%;" src="http://4.bp.blogspot.com/-Ined6nfYZqs/Tf3ds_ZhOhI/AAAAAAAAAL0/5JPS_9Ijg1s/s1600/TravelExpenseFindRequest.png" border="0" alt="" /&gt;&lt;br /&gt;&lt;img style="width:90%;" src="http://3.bp.blogspot.com/-qQ_1KIQqkzw/Tf3JT85E84I/AAAAAAAAALs/NFK8ObTIc8Q/s1600/TravelExpenseFindResponse.png" border="0" alt="" /&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:smaller;'&gt;Step 4: Implement the SCL Interfaces&lt;/h3&gt;Actually, this is more than one single step. It involves Mapping, connecting to relevant parts in the SAP backend, routing, potentially composition of multiple SAP data entities, et al. Although all very interesting, this has no direct relation or influence on the way complex SAP data can be handled in the SharePoint front-end. Therefore these steps are not discussed here. See the &lt;a href='http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/302608bd-840e-2e10-c2ba-8480e0cf5da7'&gt;Duet Enterprise Development Guide&lt;/a&gt; for a proper explanation of the steps.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;h3 style='font-size:smaller;'&gt;Step 5: Generate the interoperability interface for the SharePoint front-end&lt;/h3&gt;A result of step 3 is the WSDL specification of the SAP SCL interface. With this WSDL, and a runtime SAP Proxy implementation, it is possible to generate an External Content Type. The tool used for this is SharePoint Designer 2010.&lt;/div&gt;&lt;div style='margin-top:10px;font-style:italic;'&gt;Screenshots of the generation at SharePoint side of an External Content Type to SAP backend, with a complex hierarchical SAP data entity exchanged&lt;br /&gt;&lt;img style="float:left;width:30%" src="http://1.bp.blogspot.com/-rkk3W7JbYxI/Tf3fXIDVC7I/AAAAAAAAAL8/GooYNhB39jk/s1600/ConnectSPDtoSAP.png" border="0" alt="" /&gt;&lt;br /&gt;&lt;img style="float:left;margin-left:20px;width: 60%;" src="http://4.bp.blogspot.com/-BHzfqGkJUpQ/Tf3fa4RxJ2I/AAAAAAAAAME/lLqhDTAsg2s/s1600/ComplexECTtoSAPentity.gif" border="0" alt="" /&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;'&gt;&lt;h3 style='font-size:smaller;'&gt;Step 6: Program to the interoperability interface for the SharePoint front-end&lt;/h3&gt;In case the SAP data entity had a flat representation, we would be nearly finished. Just generate an External List in SharePoint Designer or via the SharePoint UI, and connect to the generated External Content Type. However, the expense data entity at SAP side exhibits a complex structure: form with multiple detail lines. This cannot be reasonable visualized in the table-oriented format of External List (remember that the start of this project is to &lt;b&gt;improve&lt;/b&gt; on the user experience for the employee; so it must feel natural and intuitive). If the External List is not feasible, then it is required to build a custom UI in SharePoint context. The custom UI must interoperate against the BCS ObjectModel API, to query, retrieve, create and update the SAP expense data entities. In its current state, the BCS API can only be operated via a weakly-typed program model. The draw side is that programming at that low-level is both cumbersome as error prone. However, if done correctly and secure, it does the job. And enables you to interoperate complex SAP data entities via Duet Enterprise in a custom SharePoint / .Net context.&lt;/div&gt;&lt;div style='margin-top:10px;font-style:italic;'&gt;Example code of interoperating BCS to create a new expense entity within SAP backend&lt;/div&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;&lt;br /&gt;BdcService service = SPFarm.Local.Services.GetValue&lt;BdcService&gt;(String.Empty); &lt;br /&gt;IMetadataCatalog catalog = service.GetDatabaseBackedMetadataCatalog(SPServiceContext.Current);&lt;br /&gt;IEntity entity = catalog.GetEntity("TopForce.com", "Expense"); &lt;br /&gt;IView createView = entity.GetCreatorView("Create");&lt;br /&gt;IFieldValueDictionary methodFields = createView.GetDefaultValues();&lt;br /&gt;methodFields["EmployeeNumber"] = "1";&lt;br /&gt;methodFields["Status"] = "open";&lt;br /&gt;methodFields["EmployeeComment"] = "my comment";&lt;br /&gt;methodFields["Date"] = DateTime.Now;&lt;br /&gt;&lt;br /&gt;object tickets = methodFields.CreateCollectionInstance("Tickets", 2);&lt;br /&gt;methodFields["Tickets"] = tickets;&lt;br /&gt;methodFields["Tickets[0]"] = methodFields.CreateInstance("Tickets[0]");&lt;br /&gt;methodFields["Tickets[0].Date"] = DateTime.Now; &lt;br /&gt;methodFields["Tickets[0].Amount"] = "35.45"; &lt;br /&gt;methodFields["Tickets[0].Description"] = "Description 1";&lt;br /&gt;methodFields["Tickets[1]"] = methodFields.CreateInstance("Tickets[1]");&lt;br /&gt;methodFields["Tickets[1].Date"] = DateTime.Now; &lt;br /&gt;...&lt;br /&gt;Identity id = entity.Create(fieldValueDictionary, LobSysteminstance);&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;&lt;h3 style='font-size:smaller;'&gt;Step 7: Build an UX custom SharePoint front-end&lt;/h3&gt;With the integration layer SharePoint/BCS - Duet Enterprise - SAP ready, it is now rather standard ASP.NET programming to build the custom UI. In the custom UI you can utilize the full toolbox of ASP.NET webcontrols, jQuery, and even Silverlight. Another viable option in SharePoint 2010 is InfoPath based forms.&lt;/div&gt;&lt;div style='margin-top:10px;font-style:italic;'&gt;Some custom UI forms for the expense handling: overview, details and submit new expense&lt;br /&gt;&lt;img style="float:left; margin:0 10px 10px 0;width: 320px; height: 207px;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/SkkrRqS2ZhI/AAAAAAAAACA/mcYQLi72LAE/s320/ExpenseHandling_Overview.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;img style="float:left; margin:0 10px 10px 0;width: 320px; height: 207px;" src="http://2.bp.blogspot.com/_77IVwtGj8s0/SkkrbusIcVI/AAAAAAAAACI/LSAHvJGkN2Y/s320/ExpenseHandling_ExpenseDetails.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;img style="float:left; margin:0 10px 10px 0;width: 320px; height: 207px;" src="http://2.bp.blogspot.com/_77IVwtGj8s0/SkkrhpVEvbI/AAAAAAAAACQ/e9NDrGK1Ajw/s320/ExpenseHandling_NewExpense.jpg" border="0" alt="" /&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px;'&gt;&lt;h2 style='font-size:110%;'&gt;Final note&lt;/h2&gt;Thus although it requires more work – at the SharePoint side; it is possible to apply Duet Enterprise for SAP / Microsoft interoperability even when dealing with complex  SAP data entities. The extra work is restricted to the SharePoint front-end part; the other parts of the Duet Enterprise pipeline are not influenced. Duet Enterprise on itself does not limit the usage of complex SAP data entities; this restriction is merely within the current out-of-the-box capabilities of SharePoint BCS and External List.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-1804291780756384488?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/1804291780756384488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/06/working-with-complex-sap-business.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1804291780756384488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1804291780756384488'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/06/working-with-complex-sap-business.html' title='Working with complex SAP business entities in Duet Enterprise'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Ined6nfYZqs/Tf3ds_ZhOhI/AAAAAAAAAL0/5JPS_9Ijg1s/s72-c/TravelExpenseFindRequest.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-4969867439849926278</id><published>2011-06-11T17:04:00.023+02:00</published><updated>2011-06-11T23:24:12.943+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web.config'/><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><title type='text'>SPWebConfigModification playing tricks in farm</title><content type='html'>&lt;div&gt;At customer premisses we apply a.o. the following deployment guidelines:&lt;ol style='margin-top:3px;margin-bottom:3px;'&gt;&lt;li&gt;In case of Farm-based deployment, then deploy to virtual bin (WebApplication), unless...&lt;/li&gt;&lt;li&gt;Apply SharePoint support for all required web.config modifications; instead of manual action (which is error prone in the farm).&lt;/li&gt;&lt;/ol&gt;Both guidelines are valid from SharePoint operations AND development perspective, to ensure a consistent and controlled SharePoint farm situation.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The SharePoint platform provides multiple deployment functionalities to comply with the 2nd guideline. Via the SharePoint solution manifest, you can specify modifications that typically have effect on the runtime operation of an assembly: SafeControls, CodeAccessSecurity. And via the &lt;code&gt;SPWebConfigModification&lt;/code&gt; class you can modify in a controlled manner the web.config for other changes; e.g. for custom application settings, navigation providers. As from SharePoint 2007, I'm a big fan of applying &lt;code&gt;SPWebConfigModification&lt;/code&gt; - it gives you as developer full control to have the needed web.config modifications executed upon application deployment and/or provision time. And to make it even better: the same set of changes are applied to all the individual web.config files of the SharePoint webapplication in the total farm; accross zones and accross servers. Even when at a later time another server is added to the farm, the same set of web.config modifications are applied (rather, repeated) also on that new server.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;However, the &lt;code&gt;SPWebConfigModification&lt;/code&gt; functionality does have it's peculiarities. Lately we encountered one I was not yet aware of, and which caused us both some headaches as well as cost some elapsed time.&lt;br/&gt;The situation is as follows: SharePoint assembly that uses EntLib 5.0 for accessing an external SQL database. Comform the guidelines, this custom assembly is deployed to the virtual bin; and it is therefore required to set custom CAS-policies for this assembly. One of the required permission is the &lt;code&gt;SqlClientPermission&lt;/code&gt;. That permissions is not present in the default &lt;code&gt;WSS_Minimal&lt;/code&gt; trustlevel, but it is within &lt;code&gt;WSS_Medium&lt;/code&gt;. To have the total set of custom CAS-policies based on the Medium trustlevel, a 2-steps approach is applied:&lt;ol style='margin-top:5px;'&gt;&lt;li&gt;First change the trustlevel in the web.config from &lt;code&gt;WSS_Minimal&lt;/code&gt; to &lt;code&gt;WSS_Medium&lt;/code&gt;; a task performed via &lt;code&gt;SPWebConfigModification&lt;/code&gt; class&lt;/li&gt;&lt;li&gt;Next, deploy the SharePoint solution with in its manifest the &lt;code&gt;CodeAccessSecurity&lt;/code&gt; element for the assembly. The resulting custom CAS-policy file is now based on the Medium trust level, thus inheriting a.o. the &lt;code&gt;SqlClientPermission SecurityClass&lt;/code&gt; setting. The SharePoint solution framework takes care of the required modifications in the web.config: link to the generated custom policy file, and set the trustlevel to &lt;code&gt;WSS_Custom&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;The setup worked perfectly, both local as in the shared test-farm.&lt;/div&gt;&lt;div&gt;That is, initially. From time to time our application appeared broken. Root cause analysis exhibited that in those situations our web.config was modified; but without any deployment activity on our own webapplication (???)  However, another SharePoint webapplication in the same farm had been redeployed. Each time that application was redeployed, our web.config was modified; and the trustlevel reset from &lt;code&gt;WSS_Custom&lt;/code&gt; to &lt;code&gt;WSS_Medium&lt;/code&gt;.&lt;/div&gt;&lt;div style='margin-top;'&gt;It appears that this is standard behaviour of the &lt;code&gt;SPWebConfigModification&lt;/code&gt; class: each time that it is requested to apply administrated &lt;code&gt;SPWebConfigModifications&lt;/code&gt; entries in the context of a single &lt;code&gt;SPWebApplication&lt;/code&gt;, it effectively re-applies the administrated &lt;code&gt;SPWebConfigModifications&lt;/code&gt; of ALL the SharePoint web-applications in the farm. At minimal, the result of this is that all the web.config files in the farm are touched; and have their timestamp updated. But in our case, the administrated &lt;code&gt;SPWebConfigModification&lt;/code&gt; for setting the trustlevel to &lt;code&gt;WSS_Medium&lt;/code&gt; was reapplied; which broke our application!&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;So I learned 2 things here:&lt;ol style='margin-top:3px;'&gt;&lt;li&gt;&lt;code&gt;SPWebConfigModification&lt;/code&gt; is not a 'decent' SharePoint citizen; I regard it as ultimately incorrect that the intented application of &lt;code&gt;SPWebConfigModification&lt;/code&gt; administrated entries on 1 SharePoint web-application, also effects all other SharePoint web-applications web.configs.&lt;/li&gt;&lt;li&gt;That as result of this behaviour the considered 2-steps approach for setting the correct medium level of a.o. &lt;code&gt;SQLClientPermission&lt;/code&gt; cannot be maintained; due the inherent risk that the administrated &lt;code&gt;SPWebConfigModification&lt;/code&gt; can be re-applied at any moment; out of the control and knowledge of the administrators of our webapplication. So I modified this to set the CAS-policies in a single step; directly steered via the Solution manifest file.&lt;br /&gt;&lt;div style='margin-top:1px;'&gt;&lt;br /&gt;Thus instead of the below CodeAccessSecurity specification, which is relative and relies on the presence of a.o. SqlClientPermission SecurityClass in the base trust-level (&lt;code&gt;WSS_Medium&lt;/code&gt;):&lt;br /&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;&lt;br /&gt;&amp;lt;PermissionSet class="NamedPermissionSet" version="1"&amp;gt;       &lt;br /&gt;&amp;lt;IPermission class="SecurityPermission" version="1" Flags="Execution" /&amp;gt;       &lt;br /&gt;&amp;lt;IPermission class="AspNetHostingPermission" version="1" Level="Medium" /&amp;gt;&lt;br /&gt;&amp;lt;IPermission class="SqlClientPermissionversion" version="1" Unrestricted="true" /&amp;gt;&lt;br /&gt;&amp;lt;IPermission class="SqlClientPermission" version="1" Unrestricted="true" /&amp;gt;&lt;br /&gt;&amp;lt;IPermission class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=14.0.0.0, Culture=neutral, &lt;br /&gt;PublicKeyToken=71e9bce111e9429c" version="1" ObjectModel="True" /&amp;gt;  &lt;br /&gt;&amp;lt;IPermission class="Microsoft.Office.SecureStoreService.Server.Security.SecureStorePermission, Microsoft.Office.SecureStoreService.Server.Security, &lt;br /&gt;Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" Unrestricted="true" /&amp;gt;        &lt;br /&gt;&amp;lt;IPermission class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" &lt;br /&gt;Unrestricted="true" /&amp;gt;     &lt;br /&gt;&amp;lt;IPermission class="System.Diagnostics.EventLogPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"  version="1" &lt;br /&gt;Unrestricted="true" /&amp;gt; &lt;br /&gt;&amp;lt;IPermission class="WebPartPermission" version="1" Connections="True" /&amp;gt;&lt;br /&gt;&amp;lt;/PermissionSet&amp;gt;    &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;margin-top:1px;'&gt;specify all the required permissions explicit:&lt;br /&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:80%;overflow:auto;'&gt;&lt;br /&gt;&amp;lt;PermissionSet class="NamedPermissionSet" version="1"&amp;gt;       &lt;br /&gt;&amp;lt;IPermission class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" ObjectModel="true" Unrestricted="true" /&amp;gt;     &lt;br /&gt;&amp;lt;IPermission class="SecurityPermission" version="1" Flags="Execution" Unrestricted="true" /&amp;gt;&lt;br /&gt;&amp;lt;IPermission class="System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Level="Medium"/&amp;gt;&lt;br /&gt;&amp;lt;IPermission class="System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/&amp;gt;&lt;br /&gt;&amp;lt;IPermission class="Microsoft.Office.SecureStoreService.Server.Security.SecureStorePermission, Microsoft.Office.SecureStoreService.Server.Security, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" Unrestricted="true" /&amp;gt;        &lt;br /&gt;&amp;lt;IPermission class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /&amp;gt;     &lt;br /&gt;&amp;lt;IPermission class="System.Diagnostics.EventLogPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"  version="1" Unrestricted="true" /&amp;gt; &lt;br /&gt;&amp;lt;IPermission class="Microsoft.SharePoint.Security.WebPartPermission, Microsoft.SharePoint.Security, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" Connections="True"/&amp;gt;&lt;br /&gt;&amp;lt;/PermissionSet&amp;gt;     &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-4969867439849926278?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/4969867439849926278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/06/spwebconfigmodification-playing-tricks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4969867439849926278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4969867439849926278'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/06/spwebconfigmodification-playing-tricks.html' title='SPWebConfigModification playing tricks in farm'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5495334670332505662</id><published>2011-06-03T22:24:00.023+02:00</published><updated>2011-06-04T20:49:37.969+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebPart'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Utilizing Maps services for runtime determining nearest relations</title><content type='html'>&lt;div&gt;In a former SharePoint project – an external facing public website -, a required functionality was to display the nearest X insurance advisors given the submitted postal code of user. We weighed several alternatives to realize this:&lt;ol style='margin-top:4px;'&gt;&lt;li&gt;Re-use the distance-calculation algorithm used by the predecessor of the website (&lt;span style='font-style:italic;'&gt;note: the essence of the project was a technical migration from a non-strategic proprietary WCM platform to the enterprise architecture target platform: SharePoint&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Utilize service of postal company: a data repository of all postal code tuple combinations, with the distance between them administrated.&lt;/li&gt;&lt;li&gt;Utilize Geo-coordinates to runtime calculate the distance between 2 locations, via the &lt;a href='http://en.wikipedia.org/wiki/Haversine_formula'&gt;Haversine formula&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The first would have the disadvantage to still depend on the non-strategic platform and supplier. Also it had a rather complex programming API, without documentation and support.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The second would require us to host an external database besides the SharePoint content database in which to administrate the millions of postal code / distance records. This database would have to be updated each year with the management update from the postal company. Also, security constraints would not allow to directly access from the SharePoint WFE in the DMZ, the external database hosted in the internal network. The access should be regulated from DMZ to inner network via a secure webservice interface; which of course implies extra work and additional hosting costs.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;So, the third alternative appeared the best fitted. Issue here is how to translate the postal code (submitted by the website user) into geo-coordinates (required for the Haversine formula). Luckily, both GoogleMaps and BingMaps provide services for this. Rough outline of the applied approach:&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;ol&gt;&lt;b&gt;Preparation&lt;/b&gt;&lt;li&gt;Store in a SharePoint List the relations (less than 5000) data, including their geo-coordinates&lt;/li&gt;&lt;br/&gt;&lt;b&gt;Runtime&lt;/b&gt;&lt;li&gt;Invoke Maps service to derive the geo-coordinates (Latitude + Longitude) given the postal code submitted by user&lt;/li&gt;&lt;li&gt;Calculate the distance to each applicable relation via the Haversine formula&lt;/li&gt;&lt;li&gt;Ascending sort on calculated distance&lt;/li&gt;&lt;li&gt;Display the X nearest advisors&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;An hosting constraint for step 2 is that it is not allowed to directly invoke from the SharePoint farm, external webservices. To circumvent that restriction we decided to call the Maps service in the security context of the browser, via jQuery/JSON. The returned geo-coordinated are next via a postback with arguments transmitted to the server side; where then the distance calculations are done.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;b&gt;Architecture sketch:&lt;/b&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;img style="width: 90%;" src="http://4.bp.blogspot.com/-JzFxHI5Diy0/TelKhc-_PoI/AAAAAAAAALY/neLMLP_2-E0/s1600/Clipboard02.jpg" border="0" id="BLOGGER_PHOTO_ID_5614100349070556802" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5495334670332505662?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5495334670332505662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/06/utilizing-maps-services-for-runtime.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5495334670332505662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5495334670332505662'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/06/utilizing-maps-services-for-runtime.html' title='Utilizing Maps services for runtime determining nearest relations'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-JzFxHI5Diy0/TelKhc-_PoI/AAAAAAAAALY/neLMLP_2-E0/s72-c/Clipboard02.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5521177175145456323</id><published>2011-05-13T20:00:00.031+02:00</published><updated>2011-05-14T13:14:24.846+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><category scheme='http://www.blogger.com/atom/ns#' term='Sandbox solution'/><title type='text'>Automatically publishing multiple files fails with error '0x81020015'</title><content type='html'>&lt;div&gt;In my &lt;a href='http://williamvanstrien.blogspot.com/2011/04/error-unable-to-load-assembly-group.html'&gt;previous post&lt;/a&gt; I wrote about the well-known artefact of sandbox solutions that provisioned files are by default still checked-out. This can be fixed via a &lt;span style='font-family:Courier'&gt;FeatureReceiver&lt;/span&gt; that checks-in all files and approves the ones that require moderation, so that all provisioned SharePoint artefacts are direct available for the end user.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Initially this worked like a charm, and the problem seemed resolved. However when our project progressed and the number of provisioned files increased, we structurally encountered the following error upon feature activation:&lt;/div&gt;&lt;div style='margin-top:1px;'&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;Microsoft.SharePoint.SPException occurred&lt;br/&gt;&amp;nbsp;&amp;nbsp;Message=The file _catalogs/masterpage/ApplicationX/ApplXPageLayoutXX.aspx&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is modified by domain\WvStrien on May 11 2011 17:06:12 +0200.&lt;br/&gt;&amp;nbsp;&amp;nbsp;Source=Microsoft.SharePoint&lt;br/&gt;&amp;nbsp;&amp;nbsp;ErrorCode=-2130575305&lt;br/&gt;&amp;nbsp;&amp;nbsp;NativeErrorMessage=FAILED hr detected (hr = 0x81020015)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px'&gt;In the root cause analysis of the problem I discovered that the problem only manifests itself when more than 1 file requires approval. This also explained why initially we did not encounter the problem: we started out with only a single &lt;span style='font-family:Courier'&gt;PageLayout&lt;/span&gt;. With this insight I did an internet search for '0x81020015'. Although no direct related pointers to our situation, this led me in the direction of the problem cause. Apparently it is a race condition within SharePoint internally when first checking in a file and immediately approving it in the same execution context. The internal SharePoint administration is typically not ready yet to handle the second state change on the file.&lt;/div&gt;&lt;div style='margin-top:10px'&gt;If this is the cause, then the solution is to break up the execution context: first do the checkin(), and in another execution context the approve() invocation. Normally you would do this by delegating it to a background thread. However, this is not possible in a Sandbox context: the SharePoint ObjectModel is only supported on the main thread of the SPUserWorker process. The best next and pragmatic approach is then to break the execution flow by introducing a delay between the invocation of the 2 &lt;span style='font-family:Courier'&gt;SPFile&lt;/span&gt; methods:&lt;/div&gt;&lt;div style='margin-top:1px;width:90%;'&gt;&lt;div style='width:100%;float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;private static void PublishFile(SPFile checkedOutFile,&amp;nbsp;bool approvalNeeded)&lt;br/&gt;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;checkedOutFile.CheckIn(String.Empty,&amp;nbsp;SPCheckinType.MajorCheckIn);&lt;br/&gt;&amp;nbsp;&amp;nbsp;if (approvalNeeded)&lt;br/&gt;&amp;nbsp;&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int nrOfWaits = 0;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (!checkedOutFile.Exists &amp;amp;&amp;amp; nrOfWaits++ &amp;lt; 5)Thread.Sleep(1000);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (checkedOutFile.Exists)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkedOutFile.Web.GetFile(checkedOutFile.UniqueId).Approve(COMMENT);&lt;br/&gt;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px'&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5521177175145456323?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5521177175145456323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/05/automatically-publishing-multiple-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5521177175145456323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5521177175145456323'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/05/automatically-publishing-multiple-files.html' title='Automatically publishing multiple files fails with error &apos;0x81020015&apos;'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-7459088570875532452</id><published>2011-04-27T23:49:00.015+02:00</published><updated>2011-08-18T19:38:01.804+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><category scheme='http://www.blogger.com/atom/ns#' term='Sandbox solution'/><title type='text'>Error “Unable to load assembly group” upon redeploying a sandbox solution with a feature receiver</title><content type='html'>&lt;div&gt;IT operations set up a fresh new SharePoint webapplication for my current project on the development farm, and provisioned it with a root site collection based on the publishing template. Next I took over the deployment control by following the sandbox route; in this preliminary phase merely to provision the first version of the branding: master page, CSS files, images and page layouts. A known artifact of sandbox solutions is that the provisioned files are by default still checked-out in the content database by the person who activated the solution, and thus not visible for anyone else. [&lt;span style='font-style:italic;'&gt;It is a mysterie to me why Microsoft implemented it such; and moreover why they didn’t delivered us a setting to configure this provisioning behavior to automatic checkin and publish/activate the provisioned SharePoint artifacts.&lt;/span&gt;] Instead of manually via the browser or SharePoint Designer having to lookup in the site collection all the provisioned SharePoint artifacts to check them in and publish them, I more favor the approach to have this done automatically in the context of the feature activation. This can be easily accomplished via a feature receiver (Waldek Mastykarz has a good start/example for this in his blogpost &lt;a href='http://blog.mastykarz.nl/automatically-publishing-files-provisioned-sandboxed-solutions/'&gt;Automatically publishing files provisioned with Sandboxed Solutions&lt;/a&gt;). So I added a feature receiver to the provisioning feature in the sandboxed solution, and in the FeatureActivated event let all the provisioned SharePoint artifacts be located in the content database and automatically checked in + published if applicable. Tested it locally, works like a charm. Deactivated and deleted the previous uploaded version of the sandboxed solution, and uploaded the new version with the feature receiver inside. However, upon activating this sandbox solution version, I consistently got the following error:&lt;/div&gt;&lt;div style='margin-top:1px;'&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;Error occurred in deployment step 'Add Solution': Unable to load assembly group. The user assembly group provider threw an exception while trying to provide user assemblies for the specified assembly group.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:5px;'&gt;And in the ULS logging the following detail info:&lt;/div&gt;&lt;div style='margin-top:1px;'&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;Unable to load assembly group. The user assembly group provider threw an exception &lt;br /&gt;Assembly Group Id: GroupId = "7C00665459714EEC9BDA8727AD711EC7-FES7hxwCdYldvtgExF/L+b259Rh3T1thWDeijNWTrSU="" - Inner Exception: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.&lt;br /&gt;at Microsoft.SharePoint.SPListItemCollection.get_Item(Int32 iIndex)&lt;br /&gt;at Microsoft.SharePoint.Administration.SPSolutionLanguagePack.&lt;br /&gt;    GetSolutionInfoFromGallery(Guid siteId, Guid solutionId, String solutionHash, String&amp; fileName, String&amp; hash, Byte[]&amp; fileBytes)&lt;br /&gt;at Microsoft.SharePoint.UserCode.SPUserCodeLightweightSolutionAssemblyGroupProvider.&lt;br /&gt;    GetAssembliesInGroup(Guid siteId, String assemblyGroupId)&lt;br /&gt;at Microsoft.SharePoint.UserCode.SPUserCodeAssemblyCacheManager.&lt;br /&gt;    EnsureUserCodeAssemblyGroupIsCached(Guid siteId, SPUserCodeAssemblyGroupId userCodeAssemblyGroupId)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;margin-top:10px'&gt;An internet search did not give many nor useful hits; and neither could the SharePoint development gurus in my neighborhood help me. So it left me rather puzzled at first how to analyze and solve this. A good clue however was that a sandboxed solution from another SharePoint (web)application with also a feature receiver inside, had the same problem trying to activate it in our site collection, while it successfully activated in the own site collection. So it must be something at SharePoint infra level, not caused by code development. With this insight I went back to my operations companion, and provided him with a sandboxed solution to monitor what events occurred at system level upon trying to activate the solution. This quickly let to a conclusive result: somehow the permission state of the User Code service account on the C:\ProgramData\Microsoft\SharePoint\UCCache subfolder got compromized, which disallowed it to re-copy the new version of the sandboxed solution with code inside to the UCCache subfolder. The problem was not even resolved by restarting the User Code service; instead it was needed to manually reset the User Code service account, so that upon the next invocation the ACL on the UCCache subfolder was again built up.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Our operations guy was very thoughful to make a note of this behavior in the internal SharePoint operations Knowledge Base, and document it in a work instruction.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-7459088570875532452?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/7459088570875532452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/04/error-unable-to-load-assembly-group.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7459088570875532452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7459088570875532452'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/04/error-unable-to-load-assembly-group.html' title='Error “Unable to load assembly group” upon redeploying a sandbox solution with a feature receiver'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3722114699888821172</id><published>2011-03-28T22:16:00.006+02:00</published><updated>2011-10-16T11:18:09.744+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver Gateway'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Duet Enterprise lessons learned for custom application scenario</title><content type='html'>&lt;div&gt;The Duet Enterprise proposition is multi-faceted. It is a product with ready-to-use functionalities. It is a composition environment for constructing your own solution by composing delivered functional and technical building blocks, e.g. SharePoint Site templates for SAP business objects, SAP reports scheduling and publication into SharePoint, expose SAP workflow decision points as SharePoint tasks. And it is an Integration Foundation for building your own custom application scenario.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;In case of that last context, a Duet Enterprise project is a software development project. However, it is not just like any other development project. The application of the Duet Enterprise Integration Foundation in custom SAP / SharePoint application scenarios imposes specific prerequisites to be successful. From experiences with applying Duet Enterprise in custom application scenario, we have learned several lessons.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Starting with Duet Enterprise&lt;/h3&gt;Before you are ready to apply Duet Enterprise in a custom application scenario, the project team needs to invest time to get familiar with the product. Get acquainted with the Duet Enterprise concepts, architecture, capabilities, configuration, development approach, constraints and its restrictions. It proofs a steep learning curve to become familiarized with Duet Enterprise and the diverse aspects. This learning experience is made more difficult by the lack yet of concise study material and available reference cases in the open to learn from.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Also you need to install Duet Enterprise in your combined SAP and Microsoft IT landscape. It’s common that this task is performed by the IT operations in your company. Be aware that installation and configuration of Duet Enterprise is more than a simple ‘next-next-OK’ click exercise. Especially on the SAP side, the installation of the Duet Enterprise SAP Add-on consists of configuration steps in diverse parts of the SAP landscape (e.g. SE80, IMG, SOA Manager, …). The total elapse time for installing and configuring Duet Enterprise can easily extend to 5 or more workdays. For the major part the SAP and SharePoint installation and configuration can be done isolated and in parallel. However, there are also multiple moments where it is essential to work together, and exchange system information. From SAP imported into the SharePoint farm, and later on SharePoint security settings required at the SAP NetWeaver / Service Consumption Layer (SCL) side.&lt;/div&gt;&lt;div style='margn-top:10px;'&gt;&lt;h3&gt;Starting within a custom SAP / Microsoft application scenario&lt;/h3&gt;This is no different from any SAP / MS integration scenario. Don’t start with the tool, start with the business question! Make sure you understand which problem(s) you are trying to solve. Invest proper time for performing the business and information analysis. Agree with the customer what kind of user experience is asked for. With these demand aspects sufficiently clear, continue with deriving the integration and the software architecture design. In this process both SAP and Microsoft solution architects should be involved. They bring in the insights, knowledge of best and bad practices from the experiences on their own turf. When sketching the integration architecture, continually evaluate whether and where Duet Enterprise can add value, given the Foundation capabilities and the imposed constraints. Don’t make the application of Duet Enterprise your goal; but determine for the application context if and where Duet Enterprise adds value.&lt;/div&gt;&lt;div style='margin-top:10px'&gt;&lt;h3&gt;Functional system architecture&lt;/h3&gt;Input here are the business process, the requested functionalities, the end-user audience, and the workplace characteristics. Decompose the system functionality in use cases. Often not all of the system use cases have the same set of actors. The functional and process architect(s) must carefully decide for which of the use cases there is a business case to expose outside of the SAP boundaries, and for which not. Example of the last is an approval task by a manager or the HR department. They are SAP power users, spending a large part of the day within the SAP GUI. The GUI has no secrets for them, it’s their familiar workplace. The larger workforce in the company is instead a non-casual user of the SAP environment. They are not used to the SAP GUI, and loose valuable time finding out how to operate within the GUI. The financial business case here is reducing the amount of required SAP licenses, and reducing the time spend by this larger set of employees due the unfamiliarity with the SAP UI. A soft business case is that the employee satisfaction is improved by integrating the SAP related work within their common and familiar workplace.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Starting with Development approach&lt;/h3&gt;Again, this is no different from other enterprise application integration scenarios. A proven best practice is to start with establishing and defining the contracts via which the application counterparts will communicate. Initially these contracts are defined in abstract format, focusing on the identification and separation of system responsibilities. Microsoft architects recognize this as applying the ‘Contract-First’ approach; SAP architects are more familiar with the term ‘Outside-In’. Do a design time validation on paper or whiteboard that all of the identified functional use cases can be realized by the set of identified interfaces. Augment and tune the interfaces until this design check leaves no more gaps.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Next, model the identified abstract service interfaces in the Duet Enterprise SAP Add-on. The tool for this is the ES Builder, a Java-based modeling environment delivered either as part of SAP PI, or of SAP NetWeaver Composite Environment (CE). In this development step the technology-agnostic service interfaces must be translated into specific SAP service-technology format: data structures, message types, interface operations. Here you also augment the abstract service interfaces with the specific Duet Enterprise requisites: Correlation ID and Business Object Instance Key . These 2 specific parameters are required to enable the Duet Enterprise system monitoring and routing capabilities. Also add here SOAP standards-based fault handling to each service operation. The ES Builder directly supports this via the SAP ESA SOAPFaultException datatype. The SharePoint consumer of the Duet Enterprise service interface can handle the received SOAP Faults in a standard manner through WCF, transparent to any SAP specifics in the fault notification. When all the identified service interfaces are modeled in ES Builder, generate in the ESB the WSDL service description. This W3* standards-based and platform independent service description is utilized and needed on both the SAP service provider and the SharePoint service consumer sides for building the integrated application.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Building the SAP / SharePoint integrated application&lt;/h3&gt;With the WSDL service description available, the SAP and SharePoint development teams can each go ahead with the realization of their respective application responsibilities.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;At the SAP side the identified service interfaces must be implemented by concrete service realizations. In a Duet Enterprise landscape the term Service Provider refers to the SCL system, and SAP Backend refers to the system that hosts the Business Functionality. SAP Duet Enterprise service implementations are thus positioned in the SCL. The SCL services connect to the SAP Backend to consume the business functionalities and data. Since this SCL-SAP Backend connection is strictly within the SAP environment, it is possible to rely on SAP proprietary connection technology. In fact, between the SCL and the SAP backend it does not add anything additional to connect via web services (BAPI or Enterprise Services). Using web services to connect to the Backend brings some additional performance overhead so RFC-based connection is faster. The development work inside the SCL further consists of mapping the external faced service signatures to the internal SAP processing and data structures. This involves the technical mapping from the W3* standards-based integration handling to the SAP internal invocation model and data structures. And potentially at business process level the composition of multiple SAP actions in the scope of a single Duet Enterprise service operation.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The required work at the SharePoint Duet Enterprise consumption side is largely dependent on the operation and data signature of the provided SCL services. At SharePoint side, Duet Enterprise builds on Business Connectivity Services. Implication of this is that the SCL services must exhibit a CRUD+Q operation signature. If not, consumption via BCS is not even possible. If BCS-based consumption of the external SCL services is possible, another aspect is the data structure. SharePoint 2010 out-of-the-box delivers the concept of the External List UI to interoperate with external data. A practical limitation of the External List UI metaphor is that it requires a flat data structure. If not flat, it is not possible to display the external data in a row-based manner. Non-flattened / hierarchical data can still be consumed via BCS in SharePoint, however not via the External List concept. The project will have to build a custom UI to interoperate with hierarchical SAP data structures. The custom UI must connect to the BCS Object Model to interoperate with the external SCL services. Current drawback is that the BCS API only supports a weakly-typed programming model. You have to program per exchanged hierarchical SAP data structure an ORM-based mapping from strong-typed data representation at the SharePoint front-end to the BCS weakly-typed representation.&lt;/div&gt;&lt;div style='margin-top:10px'&gt;&lt;h3&gt;Debugging Duet Enterprise connection problems&lt;/h3&gt;Here is where the application of Duet Enterprise clearly adds additional value. If you obey to the Duet Enterprise constraints; that is if you have per service operation included the Correlation ID parameter; the Duet Enterprise landscape supports the problem analysis via an integral audit trail through the combined SharePoint + SAP systems chain. You look up the Correlation ID value in the SharePoint ULS logs for where the BCS-based connection starts, and follow it through the SCL layer via the SAP system monitoring. Problems can be of infrastructure nature, e.g. SSL certificate at SAP and SharePoint not in sync; SharePoint BCS-SCL service connection level as result of a wrongly chosen SAP proxy endpoint; SAP authentication and/or authorization due incomplete Duet Enterprise user mapping. The Correlation ID based audit trails proofs a big help in tracing where in the integrated SharePoint / SCL / SAP Backend landscape the actual problem cause manifests itself.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3722114699888821172?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3722114699888821172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/03/duet-enterprise-lessons-learned-for.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3722114699888821172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3722114699888821172'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/03/duet-enterprise-lessons-learned-for.html' title='Duet Enterprise lessons learned for custom application scenario'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3663850151763235746</id><published>2011-03-19T22:12:00.008+01:00</published><updated>2011-10-16T11:16:31.615+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver Gateway'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Duet Enterprise development work plus applicability</title><content type='html'>&lt;p&gt;At the global level, following development activity is involved in building a custom Duet Enterprise scenario.&lt;/p&gt;&lt;p&gt;&lt;h3&gt;SAP side&lt;/h3&gt;Plain and simple: Provide SCL-ready services, that are SharePoint BCS consumable.&lt;br/&gt;There is no other option here, this work is required to deliver SAP data + processing services that are enabled for SCL-publishing. At minimum this involves ABAP custom development for mapping the W3*-standards based SCL data representation onto the native SAP data representation, and vice versa; and invoking from within the SCL runtime context the inner SAP processing at either RFC, BAPI web services or SAP Enterprise Services level.&lt;/p&gt;&lt;p&gt;&lt;h3&gt;SharePoint 2010 side&lt;/h3&gt;Here the amount of development work depends, namely on the signature of the SCL-published services. Ideally the services provide a CRUD+Q signature (required) + a flattened data structure (optional). If both aspects are present in the SCL-services, these can be directly consumed and displayed in SharePoint External List. Then there is no development work required at SharePoint side, it is all configuration done in SharePoint Designer. You get the maximum added Duet Enterprise value in case of flattened data: SAP/SharePoint connection, authorization, system monitoring; and out-of-the-box presentation of the SAP data.&lt;/p&gt;&lt;p&gt;In case of non-flattened, complex/hierarchical data structures, the External List UI metaphor is not viable. Duet Enterprise can still have its value, on the connection, authorization + system monitor aspects (plumping). What you loose here is the out-of-the-box UI presentation. You will have to build a custom UI instead, and program directly against the BCS Object Model. Thus more work, but Duet Enterprise still has standards-based value and role for SAP/SharePoint interoperability.&lt;/p&gt;&lt;p&gt;&lt;h3&gt;Connection requirements / BCS implication for Duet Enterprise&lt;/h3&gt;The Duet Enterprise SharePoint Add-on builds and relies upon BCS. Consequence is that BCS prerequisites are imposed on the SAP / SharePoint service connection, provided by the SCL-publishing and BCS-consumption. The SCL provided SAP-services must expose a CRUD+Q interface, with at minimal a ‘ReadList’ (= Query) and ‘ReadItem’ (= Read) type of operation. If the SAP processing behavior cannot be mapped on the CRUD+Q signature, you cannot reasonable apply Duet Enterprise. Point. The SAP .NET Connector 3.0 may be a alternative for such connections.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Schematic overview of the Duet Enterprise applicability&lt;/b&gt;&lt;img style="width:95%;" src="http://4.bp.blogspot.com/-9RXPRZGj5VA/TYUw0esr5QI/AAAAAAAAALI/lwwsVE6922M/s1600/DuetEntApplicability.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5585924590974788866" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3663850151763235746?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3663850151763235746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/03/duet-enterprise-development-work-plus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3663850151763235746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3663850151763235746'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/03/duet-enterprise-development-work-plus.html' title='Duet Enterprise development work plus applicability'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-9RXPRZGj5VA/TYUw0esr5QI/AAAAAAAAALI/lwwsVE6922M/s72-c/DuetEntApplicability.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-4687790031404587682</id><published>2011-02-10T23:32:00.014+01:00</published><updated>2011-02-11T06:22:25.565+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Positioning of .NET Connector 3.0 versus Duet Enterprise</title><content type='html'>&lt;div&gt;In a timeframe of a couple of weeks, SAP independently released 2 products for .NET interoperability: first &lt;span style='font-style:italic;'&gt;[December 2010]&lt;/span&gt; the next version of the .NET Connector – NCo 3.0; followed a few weeks &lt;span style='font-style:italic;'&gt;[Februari 2011]&lt;/span&gt; later by the public launch of Duet Enterprise – a combined effort of SAP and Microsoft. These near overlapping release moments may raise questions and uncertainty on the positioning of the 2 .NET interoperability products. Are they competing? Are the successive release moments a symptom of independent products groups within SAP, and will market acceptance determine which one will ‘win’? And what about the SAP ES Explorer? Earlier, SAP spokesman &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/14331'&gt;declared&lt;/a&gt; the .NET connector outdated in favor of the ES Explorer.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;In my thoughts and analysis, the story is differently. NCo3.0 and ES Explorer on one side, and Duet Enterprise all have a distinct positioning. The 3 products are neither competing nor exclusive for .NET interoperability. Each serves a specific and dedicated purpose.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;NCo3.0 and ES Explorer&lt;/h3&gt;Both NCo3.0 and ES Explorer are in essence .NET Interoperability &lt;span style='font-style:italic'&gt;technologies&lt;/span&gt;. Neither of them is positioned as a &lt;span style='font-weight:bold;'&gt;product&lt;/span&gt;. You can not purchase or license it, but instead can download them from SAP Marketplace if you have a valid S-User ID that acknowledges you as a SAP developer. The release of .NET Connector 3.0 passed rather silently, with only an announcement on SDN. It has not received attention from any of the influencing  IT business magazines, nor IT Research Analysts. There was a Ramp-Up with selected beta-testers, but with minimal noise ahead and attention during.&lt;ul&gt;&lt;li&gt;NCO 3.0 is intended as a general purpose technology tool for low level integration plumping. Basically it enables bi-directional interoperability between .NET &lt;span style='font-style:italic;'&gt;custom code&lt;/span&gt; and SAP RFCs and BAPI Function Modules. Nothing more, nothing less.&lt;/li&gt;&lt;li&gt;The role of SAP ES Explorer is in essence the same. In the earlier SAP statement, Rima Rudnik-Sirich characterized it as '&lt;span style='font-style:italic;'&gt;It succeeds SAP .NET Connector 2.0 for .NET&lt;/span&gt;'. The difference is within the interoperability manner. SAP ES Explorer works at the level of SAP Enterprise Services, W3*-compliant. You apply it as Visual Studio Add-In, to search through all the SAP Enterprise Services available in your landscape; standards ones from SAP, from third parties deployed in your landscape, and your customer-build Enterprise Services. Runtime invocation of the selected Enterprise Services occurs via a generated WCF service proxy.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Duet Enterprise&lt;/h3&gt;Duet Enterprise is a whole other story. Both SAP and Microsoft position it as a &lt;span style='font-weight:bold;'&gt;product&lt;/span&gt; that will directly provide business value. The Duet Enterprise release was done at large: a Virtual Launch Event, press releases and articles within the important IT business magazines, analysis reports by Forrester and CITO Research. Application of Duet Enterprise requires a license, the product can be purchased via SAP and Microsoft. &lt;span style='font-style:italic;'&gt;(Note: at moment of writing there is no information disclosed on pricing and licensing model)&lt;/span&gt;. Before reaching General Availability, Duet Enterprise has been evaluated in a combined Ramp-Up / Rapid Deployment Program hosted by SAP and Microsoft together. Participating in the RDP was given substantial noise ahead, and intensive attention during the program course self. &lt;span style='font-style:italic;'&gt;(Note: TopForce participated together with a large Dutch insurance company in this RDP)&lt;/span&gt;.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;The role of Duet Enterprise is twofold. It comes out of the box with direct usable functionalities, and capabilities to compose customer-specific solutions. Its second face is what distinguished Duet Enterprise from the previous Duet versions: integration Foundation to build integration + interoperability that is specific for your situation. Also, SAP and Microsoft believe and want ISVs (the ecosystem) to deliver add-ons on the Duet Enterprise products, e.g. for specific vertical markets. To stimulate this, SAP and Microsoft also launched a partner program: &lt;span style='font-weight:bold;'&gt;Unite Partner Connection Program&lt;/span&gt;.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;The Duet Enterprise Foundation is also interoperability plumping, but of higher level as NCo 3.0 and ES Explorer. SAP / .NET interoperability occurs via standard W3* services; there is out-of-the-box support for SSO, Authorization, landscape monitoring. All aspects that earlier you typically had to handcraft yourself, and thus also maintain.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Duet Enterprise is bounded to usage from within a SharePoint 2010 context, and via SharePoint 2010 as intermediary layer in Office 2010 clients. Duet Enterprise has no role in other .NET contexts, e.g. SharePoint 2007 or 2003, Silverlight, WinForms or WPF apps, WCF handling, BizTalk.&lt;/div&gt;&lt;div style='margin-top:10px'&gt;&lt;h3&gt;Implications&lt;/h3&gt;The added value of Duet Enterprise [product, foundation] wrt NCo 3.0 and SAP Explorer [basic interoperability technologies] is that it raises the level of SAP - .NET interoperability. In addition to the bi-directional SAP - .NET runtime communication, it also provides interoperability concepts as SSO, Authorization, System Monitoring. And on top, it comes with direct usable functionalities, and capabilities to compose solutions [building blocks].&lt;/div&gt;&lt;div style='margin-top:5px'&gt;The limitation is that it only works from a SharePoint 2010 context (and via SharePoint in Office 2010 clients). If you need .NET interoperability from different .NET context, you have to resort to another approach. SAP provides for this both the NCo 3.0 and SAP ES Explorer; which one is usable is dependent on the level of SAP back-end consumption. If SAP Enterprise Services are available; apply SAP ES Explorer; for RFCs and FMs you can use NCo 3.0.&lt;/div&gt;&lt;div style='margin-top:10xpx'&gt;&lt;span style='font-style:italic;'&gt;Note: there are also several technologies and products delivered outside SAP to enable .NET interoperability. For instance Microsoft provides the BizTalk WCF LOB Adapter SDK, BizTalk itself; third parties provide product like Sitrion, Ometa, ERP Connect. For the scope of this article they are however not considered.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-4687790031404587682?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/4687790031404587682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/02/positioning-of-net-connector-30-versus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4687790031404587682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4687790031404587682'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/02/positioning-of-net-connector-30-versus.html' title='Positioning of .NET Connector 3.0 versus Duet Enterprise'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-8505918986484466023</id><published>2011-01-19T19:42:00.005+01:00</published><updated>2011-01-26T22:09:04.891+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Development Approach with Duet Enterprise</title><content type='html'>&lt;div style='border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:95%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is, with some minor changes, earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/23067'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='margin-top:10px;'&gt;TopForce participated in the 2nd half of 2010 within the Duet Enterprise Rapid Deployment Program. Together with our RDP partner, we followed a well-chosen approach to evaluate this SAP – SharePoint integration product on it’s capabilities and potential.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;In the Ramp-Up / RDP I was involved in plotting the Duet Enterprise prerequisites in the company IT infrastructure, selecting the PoC scenario, architecting the integration approach, and configuration + realization of the Duet Enterprise services for the PoC scenario. In this article I highlight the main points of our journey.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Product evaluation via a custom Proof-of-Concept&lt;/h3&gt;Both partners in the RDP regarded it as essential to evaluate Duet Enterprise as interoperability product via a custom Proof-of-Concept. Only such we are confronted wih actual experiences and issues in the application and potential of the Duet Enterprise capabilities. We do not suffice with merely a rather simple out-of-the-box scenario provided by Duet Enterprise.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Selection criteria for the PoC scenario&lt;/h3&gt;For us the main reason to consider Duet Enterprise is as integration foundation for company-specific SAP / Microsoft interoperability. To best evaluate the product capabilities on this aspect, we defined the selection criteria for the PoC scenario. We weighted the possible scenarios on the following aspects:&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;A real application context, with current and/or future purpose&lt;/li&gt;&lt;li&gt;Give input to SAP / Microsoft integration design guidelines&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Validation approach&lt;/h3&gt;The PoC is intentionally approached as a regular development project. Thus functional specification, architectural and technical design, realization and testing, with ultimate ending in product implementation. In these Agile times, the phases are not necessarily in linear order; especially the integration architecture and realization have had some iterations as results of lessons learned.&lt;p&gt;&lt;h3 style='font-size:110%;'&gt;Functional specification&lt;/h3&gt;In this phase, the application functionality is clearly defined, and agreed plus functional validated with the customer + end-users. Noticeable is that in this phase special attention is / should be given to the UX-factor: the User Experience of the application. This is because  the most heard compliant against SAP is typically the lesser user friendliness. And also because nowadays information workers expect no less than a pleasant and familiar workspace, in which one is facilitated and helped to do your daily and also occasional work activities.&lt;/p&gt;&lt;p&gt;&lt;h3 style='font-size:110%;'&gt;Integration and Software Architecture Design&lt;/h3&gt;Essential in this phase is close cooperation between the SAP and Microsoft solution architects. Both typically come from different backgrounds (‘different worlds’, almost like Mars versus Venus), yet it is required that they have a sufficient common understanding to architect a proper and future-proof design.&lt;/p&gt;&lt;p&gt;In the architecture itself, a best practice is to apply a layered service integration architecture. Each layer has its own responsibilities. In a nutshell, SharePoint sits at the front-end / presentation layer, SAP at the back-end layer; and Duet Enterprise is the glue as integration layer.&lt;/p&gt;&lt;p&gt;The integration layer is derived from the [use cases of the] functional specification. One of the design principles applied is that the SAP backend is and remains ultimate responsible for correctness of the data. This also implies that business rules are enforced and remain the responsibility of the SAP backend.&lt;/p&gt;&lt;p&gt;Duet Enterprise also imposes some constraints on the service interfaces. At conceptual level this means that Duet Enterprise [currently] only supports data oriented interfaces, operating via CRUD behavior. The explanation is that Duet Enterprise utilizes Business Connectivity Services to exchange data from SAP to and from SharePoint. BCS is a strict data oriented capability, it is not usable for [SAP] process oriented control.&lt;/p&gt;&lt;h3 style='font-size:110%;'&gt;Development Process&lt;/h3&gt;Once the service interfaces are derived and defined, the development team can go ahead with implementing the SAP-SharePoint integration via Duet Enterprise. The outline of this development process is  as follows:&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;Configure / define the derived interfaces as SAP Enterprise Services in the ESR, using the SAP ES Builder. Hereby you must augment the interfaces as defined with 2 additional parameters required for proper Duet Enterprise handling, namely:&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Correlation ID; this is used for the end-2-end monitoring of entire runtime flow through the SAP and Microsoft landscapes&lt;/li&gt;&lt;li&gt;Business Object Instance Key; this is used as generic identifier in all SCL framework components at runtime and at designtime. It consists of 3 components, Data Value Identier, SCL Business Object Name and the System Alias of the Backend. The key is to be generated in the SCL processing of each SCL service response, in the following structure: &amp;lt;data_value_identifier&amp;gt;_&amp;lt;Business Object Name&amp;gt;_&amp;lt;System Alias Of Backend&amp;gt;. The usage of this key is enable the SCL in subsequent handling to transparently identify the correct backend in a SAP landscape with possible multiple system instances. Notice the implication that if your SAP landscape consists of only a single backend, there is no concrete runtime usage of this field; all your SCL requests will be routed to the single backend. In that case you can simplify the key structure.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Export the defined SAP Enterprise Services in WSDL format&lt;/li&gt;&lt;li&gt;Hand over the WSDL file to both your SAP developer(s) as SharePoint developer(s). From here, both can in parallel configure and/or build their own side.&lt;/li&gt;&lt;/ol&gt;&lt;span style='font-weight:bolder;'&gt;SAP NetWeaver 7.02 / Service Consumption Layer&lt;/span&gt;&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;In the SCL system, using ABAP Workbench / transaction SPROXY, create service proxy. This generates the skeleton of the provider class that includes the methods specified in the service interface. Later on you will implement the operations which involves some ABAP programming. The explanation of this break-up is that in the construction of the operations you need the GenIL model; and that you do not have yet generated in this stadium.&lt;/li&gt;&lt;li&gt;In the SCL system, in  transaction se38 create the GenIL model based on the request and response structure of the service proxy. This generates a generic SCL Business Object Model. The reason that it is named ‘generic’ is because it is an intermediate mapping layer between the consumer (SharePoint BCS) specific data structures and the backend (e.g. SAP ECC 6.0) specific part. This enables that the consumer can transparently communicate with different backend systems/versions. That can be simultaneous in case of a distributed SAP landscape, consisting of a multitude of variant backends (e.g. ECC 6.0 for North America, while ECC 4.26 for the Dutch company division). But it is also beneficial when you upgrade your single system SAP environment – the GenIL model shields the client side from such backend environment change. And this also holds in the other direction – via the same GenIL model other clients as SharePoint can in theory also consume the exposed SAP data and functionality. An example is Alloy for IBM WebSphere.&lt;div style='border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;The GenIL model is actually to be more regarded as a generic &lt;b&gt;&lt;i&gt;Gateway&lt;/i&gt;&lt;/b&gt; derivative than strict &lt;b&gt;&lt;i&gt;Duet Enterprise&lt;/i&gt;&lt;/b&gt; specific&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;In the SCL via transaction SIMGH, create per service operation a Backend Operation Proxy that invokes the SAP Backend capability: either a SAP Enterprise Service, BAPI WebService or RFC / Function Module.&lt;/li&gt;&lt;li&gt;In the SCL, via transaction se80 create per service operation a Mapper object that implements 2 methods with predefined signatures for inbound and outbond mapping. This involves ABAP code to do the mapping from the GenIL model to the backend specific data format, and vice versa.&lt;/li&gt;&lt;li&gt;In the SCL / ABAP Workbench, return to the generated Service Proxy and fill in each of its generated operations. This also involves ABAP code to do the mapping from the received input to the GenIL model, and from the GenIL model to Duet Enterprise service output.&lt;/li&gt;&lt;li&gt;In the SCL via transaction SOAMANAGER, create the endpoint for the service proxy.&lt;/li&gt;&lt;/ol&gt;&lt;span style='font-weight:bolder;'&gt;SharePoint 2010&lt;/span&gt;&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;Start SharePoint Designer to generate External ContentType(s) on basis of the imported WSDL from the SAP Enterprise Services.&lt;/li&gt;&lt;li&gt;If applicable, generate SharePoint External List as User Interface metaphore. Whether applicable is determined by a) the data structure; External List requires a flat structure (thus no hierarchical / parent-child relationships); b) the User Experience desired by the end-user.&lt;/li&gt;&lt;li&gt;if the External List is not applicable, realize in Visual Studio a custom build SharePoint webpart. Hereby you can use the whole richness of available ASP.Net and SharePoint webcontrols – datagrids, calendar, richtextbox, dropdownlist, …  Also, SharePoint 2010 allows InfoPath forms for custom UI.&lt;/li&gt;&lt;li&gt;Configure the BCS model to connect for this External ContentType to the endpoint in the SCL of the Duet Enterprise specific service.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;Introduction and application of Duet Enterprise is not a free ride. It takes time to get familiar with its concepts, and the development approach + tooling add-ons in the ABAP Workbench and SharePoint in the form of BCS Model Generator. It also requires preparation time at front in defining and architecting an application design. But that’s no different from any other software development project. Given that, Duet Enterprise is a noteworthy addition to the SAP / Microsoft interoperability toolbox; and I recommend to consider it for applicability in your specific SAP/MS integration scenario.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-8505918986484466023?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/8505918986484466023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/01/development-approach-with-duet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8505918986484466023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8505918986484466023'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/01/development-approach-with-duet.html' title='Development Approach with Duet Enterprise'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-1157160532906866182</id><published>2011-01-07T20:05:00.018+01:00</published><updated>2011-01-08T22:50:54.755+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>CQWP, CSS and jQuery applied to rearrange groups of overview links</title><content type='html'>&lt;div&gt;A customer requirement for their SharePoint intranet is a reusable 'Overview-of-Handy-Links' capability, with the following specification:&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;Contributors must have a means to manage the overview links. The functional mananagment must be easy, without the need to maintain HTML.&lt;/li&gt;&lt;li&gt;The links must be grouped&lt;/li&gt;&lt;li&gt;The display-order of the overview groups must be controllable&lt;/li&gt;&lt;li&gt;The display-order of the links in a group must be controllable&lt;/li&gt;&lt;li&gt;The display space must be optimable used, white-spacing must be minimized&lt;/li&gt;&lt;li&gt;The overview backgroundcolor, links color and links hover color must be settable&lt;/li&gt;&lt;li&gt;The number of columns must be settable&lt;/li&gt;&lt;li&gt;Minimize the amount of custom code, favour the usage of standard SharePoint capabilities&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;As consequence of the first requirement, application of the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentEditorWebPart&lt;/span&gt; is not an option. That would mean that the contributors are directly confronted with the html-specification of the overview. Utilization of the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentQueryWebPart&lt;/span&gt; appears more promising. The rough solution design is then to 1) maintain the groupheaders in 1 SharePoint &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPList&lt;/span&gt;; 2) maintain the overview links in another SharePoint &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPList&lt;/span&gt;, with a Lookup to the GroupHeaders &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPList&lt;/span&gt;; 3) Connect a &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentQueryWebPart&lt;/span&gt; to the OverviewLinks &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPList&lt;/span&gt;; 4) Group on the GroupHeader Lookup field/column; 5) Codify in the &lt;span style='font-family:Courier;font-size:smaller;'&gt;CQWP&lt;/span&gt; Main, Group and Item xslt-files the templates to deliver the appropriate html.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The requirement to optimal use the display space can for a large extend be achieved via &lt;span style='font-family:Courier;font-size:smaller;'&gt;CSS float&lt;/span&gt;-functionality: automatically 'glue' the individual Group &lt;span style='font-family:Courier;font-size:smaller;'&gt;DIV&lt;/span&gt;'s next to each other. In the horizontal direction there is then no lost white-spacing. However, in the vertical direction that cannot be achieved with &lt;span style='font-family:Courier;font-size:smaller;'&gt;CSS-float&lt;/span&gt; alone. Float flows in horizontal direction, not vertical.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;But there is jQuery to the rescue. The basic idea is to first let the CSS-floating capability align the set of &lt;span style='font-family:Courier;font-size:smaller;'&gt;DIV&lt;/span&gt;'s in as much as possible optimal usage of the display space. And afterwards, perform some minor rearrangement to also reduce the lost of white-spacing in vertical direction.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;table &gt;&lt;tr&gt;&lt;td&gt;Via CQWP&lt;/td&gt;&lt;td&gt;After jQuery&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='vertical-align:top;'&gt;&lt;img style="width: 250px; height: 180px;" src="http://1.bp.blogspot.com/_77IVwtGj8s0/TSjWaljwanI/AAAAAAAAAK0/kLzRf_VP38A/s320/ToRearrangeOverview.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5559929492235905650" /&gt;&lt;/td&gt;&lt;td style='vertical-align:top;'&gt;&lt;img style="width: 250px; height: 136px;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/TSjWgyr-U6I/AAAAAAAAAK8/cUNGrE9hX2M/s320/RearrangedOverview.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5559929598839247778" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='margin-top:10px;'&gt;Reusability of the OverviewLinks-functionality is achieved by applying the Feature capability. The &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; provisions the required SharePoint artifacts: the SharePoint &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPList&lt;/span&gt;s - including the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Lookup&lt;/span&gt; relation between them, a preconfigured &lt;span style='font-family:Courier;font-size:smaller;'&gt;CQWP&lt;/span&gt;, the &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSLt&lt;/span&gt;-files.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-1157160532906866182?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/1157160532906866182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/01/cqwp-css-and-jquery-applied-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1157160532906866182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1157160532906866182'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/01/cqwp-css-and-jquery-applied-to.html' title='CQWP, CSS and jQuery applied to rearrange groups of overview links'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_77IVwtGj8s0/TSjWaljwanI/AAAAAAAAAK0/kLzRf_VP38A/s72-c/ToRearrangeOverview.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5128729887974941461</id><published>2011-01-04T20:51:00.008+01:00</published><updated>2011-01-04T22:09:25.996+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Installation'/><title type='text'>Solution partitioning and dependencies with mixed scopes causes farm-deployment trouble</title><content type='html'>&lt;div&gt;We probably all agree that it is wise to partition your SharePoint application deliverables and deployment into multiple packages. Typical examples are a Base assembly, deployed via a base wsp, providing a general foundation layer with diverse technical and functional building blocks. And then 1 or more functional packages, that provision the SharePoint artifacts and code for a specific application functionality; in which the functional building blocks may use and rely on parts provided via the Base assembly.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;However, sometimes this architectural sane decision to partition your application deployment, can result in unforeseen effect. Let me demonstrate via a real-life example, that I encountered today:&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Application deployment deliverable&lt;ol&gt;&lt;li&gt;includes a Base assembly, deployed via solution package Base.wsp. In this wsp package included the Base code, some basic Features, JobDefinitions, generic webparts. In the Base code / assembly there are FeatureReceivers, WebParts. As result of this, SharePoint solution generation (WSPBuilder or VS2010) puts SafeControl settings per contained WebPart in the Solution manifest; which again results in it that the scope of the Solution package is WebApplication.&lt;/li&gt;&lt;li&gt;and also contains a pure functional package; with some Features, SiteTemplates. This functional package does not contain an assembly itself, but instead relies on the assembly of the Base.wsp for reused FeatureReceivers. As result this solution package does not contain any artifacts with are scoped at WebApplication level, and SharePoint solution framework requires to deploy it global in the farm. (nb: the further described situation can even occur in situation were the package does contain managed code, as long as the assembly does not contain SharePoint coded artifacts which transition the scope of the Solution package to WebApplication; e.g. no WebParts, Resources).&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;The order of Solution package deployment is to first install the Base.wsp, and then the Functional.wsp. Then you would expect that the deployment dependency of Functional.wsp on Base.wsp is ascertained. However, in this scenario I discover in the SharePoint Solution store an error with the deployment of Functional.wsp. Error details:&lt;div style='margin-top:1px;'&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;&amp;lt;server 1&amp;gt; : The solution was successfully deployed. &lt;br /&gt;&amp;lt;server 2&amp;gt; : The solution was successfully deployed. &lt;br /&gt;&amp;lt;server 3&amp;gt; : Feature '&amp;lt;GUID&amp;gt;' could not be installed because the loading of event receiver assembly "Base, Version=1.0.0.0, Culture=neutral, PublicKeyToken=13a12821e9f69237" failed: System.IO.FileNotFoundException: Could not load file or assembly 'Base, Version=1.0.0.0, Culture=neutral, PublicKeyToken=13a12821e9f69237' or one of its dependencies. The system cannot find the file specified.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;At first, I thought this to be a timing issue. The Solution Framework uses timer jobs to deploy solutions throughout the farm, and it looked as if the Functional.wsp was tried to be already deployed on &amp;lt;server 3&amp;gt; while the deployment job for Base.wsp was not yet executed for &amp;lt;server 3&amp;gt;. However, also upon re-deployment of Functional.wsp - while making sure at forehand that the deployment of Base.wsp was now fully completed in the farm - , it resulted in the same error on &amp;lt;server 3&amp;gt;. So it must instead be directly related to the installation on &amp;lt;server 3&amp;gt; apparently the Base.dll was not installed in the GAC on that server; while the Features within Functional.wsp were to be installed on &amp;lt;server 3&amp;gt;. Why is this?&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Well, the explanation is twofold. It relates to the SharePoint Farm infrastructure, as well as the scopes of the SharePoint packages. &amp;lt;server 1&amp;gt; and &amp;lt;server 2&amp;gt; have the SharePoint webapplication role in our load-balanced farm; and each contain the SharePoint webapplications. &amp;lt;server 3&amp;gt; however is dedicated as Search Index server; and does not host any SharePoint web applications. The SharePoint  solution framework deploys WebApplication scoped packages only to the servers on which SharePoint web applications are hosted (Base.wsp: &amp;lt;server 1&amp;gt; + &amp;lt;server 2&amp;gt;). But it deploys Global scoped packages to ALL the servers in the farmer (Functional.wsp: &amp;lt;server 1&amp;gt;, &amp;lt;server 2&amp;gt; AND &amp;lt;server 3&amp;gt;).&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Given this insight, a proper SharePoint Solution Deployment approach is to deploy the Global scoped Package with Force-flag, thus suppressing the error signalment. This worked sufficient in our case. However, it leaves you with the somewhat unwanted situation that via the Force-flag you suppress all error notifications; thus may be too brute. A better approach is to circumvent that Solution Framework deploys your Application package also to the servers on which the web application is not hosted. This can thus be achieved by making sure that each of your Application package as WebApplication scope. Either because it inherently contains such entities (e.g. WebParts), or artificially by including a dummy artifact directed at WebApplication level (e.g. an empty virtual bin file).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5128729887974941461?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5128729887974941461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2011/01/solution-partitioning-and-dependencies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5128729887974941461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5128729887974941461'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2011/01/solution-partitioning-and-dependencies.html' title='Solution partitioning and dependencies with mixed scopes causes farm-deployment trouble'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-2058461959278447002</id><published>2010-12-30T17:22:00.003+01:00</published><updated>2010-12-30T17:28:32.461+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Emphasis on Office 2010 hindering Duet Enterprise implementations?</title><content type='html'>&lt;div&gt;In a &lt;a href='http://www.ventanaresearch.com/blog/commentblog.aspx?id=4072'&gt;blog&lt;/a&gt; of Venture Research I read the following rumor: &lt;span style='font-style:italic;'&gt;"…about the partnership with Microsoft in Duet Enterprise, which my sources say is not advancing as fast as desired because many organizations are not anxious to upgrade to the latest release of Microsoft Office, which is necessary to derive the true value of Duet. This caution by organizations to update their underlying platform has good reasons in terms of cost and resource constraints, and SAP is not able to do anything about that."&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;If true, I find this a misconception and incorrect positioning of the Duet Enterprise potential. Surely, it &lt;span style='font-style:italic;'&gt;also&lt;/span&gt; provides a Microsoft Office 2010 clients connection. But the true strength and potential of Duet Enterprise is that of a standards-based SAP / Microsoft interoperability foundation. It comes out-of-the-box with multiple integration plumping capabilities which you otherwise need(ed) to implement yourself. And being a commercial product, Duet Enterprise is backed-up by both SAP AG and Microsoft Corp as strong and future-proof IT suppliers.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;That said, the implementation of Duet Enterprise puts its demands on the software server infrastructure in your company: SharePoint 2010 Enterprise Edition at the Microsoft stack, and NetWeaver 7.02 at the SAP stack. These are minimal necessities, without the availability of the both of them Duet Enterprise is not an option. But Microsoft Office 2010 at the client side is merely a bonus, not a prerequisite.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-2058461959278447002?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/2058461959278447002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/12/emphasis-on-office-2010-hindering-duet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2058461959278447002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2058461959278447002'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/12/emphasis-on-office-2010-hindering-duet.html' title='Emphasis on Office 2010 hindering Duet Enterprise implementations?'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-7334168588227111008</id><published>2010-12-23T19:06:00.011+01:00</published><updated>2010-12-23T21:04:23.440+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Connector'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>SAP Connector for Microsoft .NET 3.0 released</title><content type='html'>&lt;div&gt;Yesterday SAP made the renewed version 3.0 of the SAP Connector for Microsoft .NET (NCo) officially available. This version is the long awaited successor of NCo 2.0 - which still had a design-time and runtime dependency on .NET Framework 1.x and Visual Studio 2003.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;With the NCo, it is possible to directly interoperate from a .NET consumer context with SAP RFC's. It is thus a different approach as with Duet Enterprise - in which the SAP/SharePoint interoperability is achieved via standards-based webservices. The Duet Enterprise services are provided by the SCL, which transparently encapsulates and shields the specifics of the SAP backend towards the SharePoint consuming side.&lt;/div&gt;&lt;div style='margin-top:10px';&gt;In the earlier versions the NCo used the SAP librfc32.dll to achieve the SAP/.NET binary interoperability. In NCo 3.0 the RFC protocol is fully re-implemented in the NCo itself. Main advantage is that there is no longer the dependency on the librfc32.dll being available on each .NET consuming system. Also this should result in better performance as there is no more marshalling required in .NET client runtime context from the managed .NET code to the unmanaged librfc32 invocation.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;In the previous NCo versions the programming model was to generate at design-time .NET-based proxies in Visual Studio 2003 &lt;span style='font-style:italic;'&gt;per SAP RFC&lt;/span&gt; that you intend to call. This involved a proxy method for the ABAP Function Module, and an individual proxy class for each structure or data table used in the RFC signature. In case of a change in the SAP backend, the implication is that it is required to regenarate the proxies, and rebuild plus deploy a new assembly for the re-generated code. In NCo 3.0, the RFC call pipeline is dynamically constructed. Whenever there is a change in the enclosed SAP back-end, the NCo on-the-fly adapts the internal RFC invocation. NCo 3.0 transparently shields the .NET consumer from modifications and upgrades in the SAP backend. However, this approach also has its downside. You are in effect developing against a weakly-typed integration API, much resembling the .NET reflection pattern. There is no compile-time validation nor protection for incorrect RFC invocations.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The NCo 3.0 can be downloaded from &lt;a href='https://websmp209.sap-ag.de/~form/sapnet?_SHORTKEY=01100035870000719347&amp;'&gt;SAP Service Marketplace&lt;/a&gt;, including accompanying documentation.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-7334168588227111008?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/7334168588227111008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/12/sap-connector-for-microsoft-net-30.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7334168588227111008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7334168588227111008'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/12/sap-connector-for-microsoft-net-30.html' title='SAP Connector for Microsoft .NET 3.0 released'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3405695925632997835</id><published>2010-11-30T14:34:00.000+01:00</published><updated>2010-11-30T14:34:00.639+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Consulting'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Participating in Duet Enterprise Ramp-Up / Rapid Deployment Program</title><content type='html'>&lt;div style='border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/22288'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:20px;'&gt;In May this year, TopForce applied as IT partner together with an end-user organization for participating in the Duet Enterprise Ramp-Up. Rationale for both organizations to participate in this Rapid Deployment Program is to gain in an early stadium insights and practical experience on the potential and added value of Duet Enterprise.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Our mutual application was accepted by the RDP Program in June. As one of the first activities, both organizations each sent 2 to 3 employees for Duet Enterprise training. Actually this was a requisite for RDP participation. The 5-days training addressed both the infra/operations aspects of Duet Enterprise in the SAP and Microsoft landscapes [3 days], and the development approach in the SAP and Microsoft development suites [2 days].&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;After this first introduction to the Duet Enterprise product, we received access to the software bits and accompanying documentation. The last mostly in draft versions, understandable as the product is still in Ramp-Up.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Reasons for participating&lt;/h3&gt;The mission of TopForce is to deliver the concept of High Performance Workplace for our customers. In essence this means that we aim for ease of use in the daily workspace of the employees, thereby abstracting the nifty details of the total backbone IT landscape. As our background comes from SAP consultancy, at a lot of our customers SAP is [part of] the business back-end. In our HPW vision, one of the means to achieve a pleasant employee workplace is operating the SAP back-end via a SharePoint based front-end (&lt;span style='font-style:italic;'&gt;&lt;a href='http://williamvanstrien.blogspot.com/2009/11/our-proposition-on-sap-sharepoint.html'&gt;Unlock the value of SAP business processes within a SharePoint based HPW&lt;/a&gt;&lt;/span&gt;). We defined a conceptual integration architecture for this SAP-backend / MS-frontend interoperability. The architecture is validated via multiple interoperability technologies and products; e.g. WCF to BAPI WebServices, WCF LOB Adapter, Sitrion. Drawback in all was that we still had to develop a lot of the interoperability plumbing ourselves, most noticeable the support for Single Sign-On. Duet Enterprise now promises to be a good (best?) additional alternative for enabling SAP / MS interoperability.&lt;/div&gt;&lt;div style='margin-top:5px'&gt;Our partner shares this same goal, but also has a clear additional target. In the recent history several projects have emerged in which SAP / Microsoft integration might be subject for business and IT architectural decision making, and/or in which SAP / Microsoft integration is concrete realized in some aspects. As the role of both SAP as Microsoft server landscapes is gaining importance at this end-user organization, they have the need for consistent design guidance on when and how to achieve SAP / Microsoft interoperability. Duet Enterprise is participated in this context as an important integration technology to consider.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Project team&lt;/h3&gt;Our RDP project team consists of the following roles / persons:&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;span style='font-weight:bolder'&gt;From the end-user organization&lt;/span&gt;&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;Project lead&lt;/li&gt;&lt;li&gt;SAP solution architect&lt;/li&gt;&lt;li&gt;Microsoft solution architect&lt;/li&gt;&lt;li&gt;SAP business analyst&lt;/li&gt;&lt;li&gt;SAP infra/operations&lt;/li&gt;&lt;li&gt;SharePoint infra/operations&lt;/li&gt;&lt;li&gt;SharePoint developer&lt;/li&gt;&lt;li&gt;SAP NetWeaver solution architect / consultant&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;span style='font-weight:bolder'&gt;From TopForce as IT partner&lt;/span&gt;&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;SAP / SharePoint interoperability consultant (&lt;span style='font-style:italic;'&gt;my participation in this Ramp-Up&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ABAP developer [only temporarily required]&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;span style='font-weight:bolder'&gt;From the combined SAP / Microsoft RDP support team&lt;/span&gt;&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;SAP NetWeaver consultant [from SAP AG]&lt;/li&gt;&lt;li&gt;SharePoint consultant [from Microsoft Services]&lt;/li&gt;&lt;li&gt;Whenever applicable, supplemented with SAP and Microsoft consultants with varying expertise’s; dependent on nature of discussions and encountered issues&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Validation approach and activities&lt;/h3&gt;The potential of Duet Enterprise is twofold. On one side it delivers directly usable out-of-the-box functionalities, customizable in some degrees to your situation. Second to that, and this is where it strongly differentiates from the original DUET proposition, it provides a SAP / SharePoint interoperability foundation. Although the first is certainly interesting, our main combined focus for now is evaluating Duet Enterprise for the added value on interoperability plumping aspects. This validation is done by means of a real-life custom-developed application. The following activities are executed by the RDP team:&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Attend the Duet Enterprise training to get acquainted with the infra and development aspects&lt;/li&gt;&lt;li&gt;Install and configure Duet Enterprise in the SAP NetWeaver 7.02 and SharePoint 2010 landscape&lt;/li&gt;&lt;li&gt;Derive and define the Software Architecture Design for the selected real-life application&lt;/li&gt;&lt;li&gt;Discuss the Software Architecture Design with RDP consultants, from SAP AG and Microsoft Corp.&lt;/li&gt;&lt;li&gt;Model, compose and [only] where required custom-develop  the interoperability + integration between SAP backend environment, and SharePoint 2010 based front-end&lt;/li&gt;&lt;li&gt;Derive and define the Design Guide for SAP / Microsoft integration decision making at business and IT architecture level&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3&gt;Where do we stand / Results so far&lt;/h3&gt;In this near-end phase of the Ramp-Up program, approaching the General Availability of Duet Enterprise, it is not viable to go into product details. This will be addressed later, after the successful conclusion of our Ramp-Up participation.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Results and findings that I can share now are:&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Getting acquainted with the design and development approach for Duet Enterprise application has an initial steep learning curve. Mind you, this will be less after General Availability when the accompanying documentation will be more complete and mature.&lt;/li&gt;&lt;li&gt;Installation and configuration of Duet Enterprise takes its time. This is mainly due the complexity of any typical SAP landscape anno 2010 (aka ECC, NetWeaver, Solution Manager, SLD, ESS and MSS, …), and not so much to direct back to Duet Enterprise specifically. On SharePoint 2010 side the work is much less, although also here it depends on the characteristics (complexities) of the SharePoint farm.&lt;/li&gt;&lt;li&gt;This RDP project is an evidence for the added value of a mixed SAP / Microsoft development team (&lt;span style='font-style:italic;'&gt;Build Your Interoperability Team as 1 of the &lt;a href='http://williamvanstrien.blogspot.com/2010/10/steps-howto-begin-with-sap-ms.html'&gt;Steps HowTo begin with SAP / MS interoperability&lt;/a&gt;&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;It pays out if the SAP and Microsoft solution architects are on a general level familiar with the ‘opposite’ platform stack. E.g. what’s the positioning of SAP PI versus Microsoft BizTalk; what is the concept and support of SAP Enterprise Services;&lt;/li&gt;&lt;li&gt;It pays out to have at least one team member aboard that has knowledge and practical experience on the SAP / MS interoperability area; knowledge of both technology stacks, interoperability technologies and approaches.&lt;/li&gt;&lt;li&gt;And final remark: SAP / MS interoperability is and remains interesting stuff; from business and IT architectural point of views…&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;Duet Enterprise is approaching the General Availability date. If you are considering its application for SAP / Microsoft interoperability, I like to share ideas and actions.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3405695925632997835?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3405695925632997835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/11/participating-in-duet-enterprise-ramp.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3405695925632997835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3405695925632997835'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/11/participating-in-duet-enterprise-ramp.html' title='Participating in Duet Enterprise Ramp-Up / Rapid Deployment Program'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3508952379704919601</id><published>2010-11-04T21:25:00.013+01:00</published><updated>2010-11-04T22:34:44.008+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>2 approaches to architecting SAP / SharePoint interoperability</title><content type='html'>&lt;div style='border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin-top:10px;margin-bottom:10px;width:90%'&gt;&lt;span style='font-style:italic;padding:10px;'&gt;This blog is earlier published on &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/21921%3Futm_source%3Dfeedburner%26utm_medium%3Demail%26utm_campaign%3DFeed%253A+SDNWeblogs_Interoperabilitynet+%2528SAP+Network+Weblogs%253A+Interoperability+.NET%2529'&gt;SAP Community Network Blogs&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:20px;'&gt;In today’s market the interest is growing to integrate the structural business processing of SAP within the familiar workplace environment of the Information Worker. These enterprise workplaces are in more and more companies provided by means of SharePoint 2007/2010. To achieve the SAP / SharePoint integration on structural and future-proof manner, requires investigation at forehand to come up with a solid interoperability architecture.&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Main steps to define a solid SAP / Microsoft.NET interoperability architecture&lt;/h3&gt;&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;Derive and define guiding principles; originating as first from the business perspective, and next from IT. Typically the latter are more of constrictive nature; e.g. required to apply a service architecture, required to conform to W3*-standards, ...&lt;/li&gt;&lt;li&gt;Analyze the current state of the IT landscapes (‘IST’) within the company:  SAP and Microsoft environments and server products.&lt;/li&gt;&lt;li&gt;Define and describe the interoperability architecture&lt;span&gt;&lt;ul&gt;&lt;li&gt;Conceptual level; on purpose technology and product agnostic, to make it more timeless and future-proof&lt;/li&gt;&lt;li&gt;Concrete level; with a choice for interoperability technologies and products that are nowadays available&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Validate the interoperability architecture by means of either a Proof-of-Concept, or via a small launching interoperability project.&lt;/li&gt;&lt;li&gt;Adjust the defined interoperability architecture on the lessons learned.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Guiding architecture principles&lt;/h3&gt;&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;Layered architecture, with separation of concerns. A typical layer architecture is:&lt;/li&gt;&lt;span&gt;&lt;ul&gt;&lt;li&gt;Presentation&lt;/li&gt;&lt;li&gt;Integration&lt;/li&gt;&lt;li&gt;Application&lt;/li&gt;&lt;li&gt;Data&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Service architecture&lt;/li&gt;&lt;li&gt;Loosely coupled&lt;/li&gt;&lt;li&gt;SAP business backend is and remains responsible for the correctness of business process&lt;/li&gt;&lt;li&gt;Responsibility of business data consistency within the SAP backend layer&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Approaches to derive the interoperability architecture for a concrete case&lt;/h3&gt;&lt;div style='margin-top:2px;'&gt;When in context of a concrete application, there are basically 2 approaches you can apply to derive the layered interoperability architecture:&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;Inside-Out&lt;/li&gt;&lt;li&gt;Outside-In (nb: in Microsoft terminology, this approach is also referred to with the phrase ‘Contract-First’)&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='border-width:1px;border-style:solid;border-color:#C0C0C0;padding:5px 5px 5px 5px;'&gt;&lt;h3 style='font-size:110%;'&gt;Inside-Out&lt;/h3&gt;&lt;div&gt;As the name already suggests, the starting point here is your current SAP landscape state. Start with identifying the available functional building blocks in the SAP environment – existing BAPI Function Modules, RFC’s, SAP workflow business objects, and already available SAP webservices. And expose these to outside world, to have the related SAP data and functionality consumed by a non-SAP front-end.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Biggest advantage of this approach is that you have a faster time2market. You can base your SAP / Microsoft.NET interoperability on already existing, and thus also tested, SAP building blocks. The only thing that needs to be done is to put a (web)service interface on them, and then you can integrate with the Microsoft based presentation layer.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;div&gt;This can be summarized with the phrase ‘Garbage In – Garbage Out’. If you base your interoperability architecture on the current state of your SAP environment, there is a large likelihood that SAP-proprietary concepts will be visible on the integration surface level. In general, an architecture that originates via this approach will be less pure and transparent. And thus less future-proof.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='margin-top:10px;border-width:1px;border-style:solid;border-color:#C0C0C0;padding:5px 5px 5px 5px;'&gt;&lt;h3 style='font-size:110%;'&gt;Outside-In&lt;/h3&gt;&lt;div&gt;The essence of the Outside-In approach is to first agree on and define the conceptual contract [interface] between the service provider side [SAP], and the service consumer side [SharePoint]. The idea is to start from the requested application functionalities. Derive and define at a conceptual level the services you require from the SAP backend to deliver the application and system functionalities. Describe the service interfaces in W3*-standards based notation and data structures. From here on, map onto required SAP building blocks: existing if available, new ones otherwise. At SharePoint / presentation side, you can build the consumption layer for the defined service interfaces via wsdl.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Thus start at ‘outside’ with the conceptual, externally visible service interfaces; and continue then for both provider and consumer / SAP and Microsoft sides to the inside with their respective technologies.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;div&gt;Because you start in this approach with a green field, the resulting interoperability architecture typical has a cleaner interface, which inherently conforms to interoperability standards. And because you start from the required business services, it also has a better chance on being conceptual correct, and future-proof.&lt;/div&gt;&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;div&gt;Biggest disadvantage is that this approach requires more investment and time at front in deriving and describing the service interface layer. Also it requires to get both SAP and Microsoft departments representatives on par, to have a common understanding of the applied service concepts. And in case of existing SAP building blocks, a transformation can be required to map the standards-based service interface to the SAP-specifics Function Modules, RFC’s, workflow business objects.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3508952379704919601?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3508952379704919601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/11/2-approaches-to-architecting-sap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3508952379704919601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3508952379704919601'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/11/2-approaches-to-architecting-sap.html' title='2 approaches to architecting SAP / SharePoint interoperability'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-604683759638609434</id><published>2010-10-28T22:47:00.010+02:00</published><updated>2011-10-16T11:19:23.176+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver Gateway'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Conference'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>SAP project "Gateway" and Duet Enterprise</title><content type='html'>&lt;div&gt;Project "Gateway" was prominent on the agenda of this years SAP TechEd. In an &lt;a href='http://searchsap.techtarget.com/news/2240024024/TechEd-2010-SAP-CTO-Vishal-Sikka-sheds-more-light-on-River-Gateway'&gt;interview with SearchSAP.com&lt;/a&gt;, SAP’s Chief Technology Officer Vishal Sikka got into more detail on the role and proposition of Gateway, and the relation it has with the Duet Enterprise product.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Some remarkable statements, and messages derived from this interview:&lt;div style='margin-top:1px;'&gt;&lt;div style='border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;span style='font-style:italic;'&gt;&lt;ul&gt;&lt;li&gt;Gateway is the bridge from the existing system, e.g. [SAP ERP] 4.6c application with all customizations, to the new world – SharePoint, Facebook, Twitter; without requiring your SAP customers to upgrade to a new version which is inherently service enabled.&lt;/li&gt;&lt;li&gt;Gateway is a mechanism to enable an existing SAP system that is dark to the outside world, and to put windows on it.&lt;/li&gt;&lt;li&gt;SAP Enterprise Services are usually large, and they are designed for process consumption, not for UIs.&lt;/li&gt;&lt;li&gt;The Gateway, think of it as a protocol adapter, that you can attach to a legacy SAP system and have it speak to the world outside.&lt;/li&gt;&lt;li&gt;Duet Enterprise is a product we have built with Microsoft that has the Gateway inside it that has the abilities to connect the world of SharePoint.&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-604683759638609434?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/604683759638609434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/10/sap-project-gateway-and-duet-enterprise.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/604683759638609434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/604683759638609434'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/10/sap-project-gateway-and-duet-enterprise.html' title='SAP project &quot;Gateway&quot; and Duet Enterprise'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-1566782738912414020</id><published>2010-10-24T13:05:00.024+02:00</published><updated>2011-10-16T11:19:44.491+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver Gateway'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Service'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Conference'/><category scheme='http://www.blogger.com/atom/ns#' term='SSO'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Duet Enterprise Overview presentation at SAP TechEd 2010</title><content type='html'>&lt;div&gt;&lt;a href='http://www.virtualsapteched.com/index.aspx#RAhrTfs6u3So1msdA0RDwoQ4QDH4/Is/oZgcbsstyNE='&gt;Virtual SAP TechEd 2010&lt;/a&gt; presents the recorded 1-hour session &lt;a href='http://www.virtualsapteched.com/index.aspx?url=yLfKBTlG6R15FvoTzNB/XeKpM/bcfM5arAjKaTRi3d3RRHeMUAgXeDErv46xzn1dHsRdS+n2Q1DY*~*J3Ry2h/k6nt4piKECfk+MdTGhPoxGtI=#Kmlcgh2EVgoUtR2SUKpfdFZyUIq/zsreTG8hPbeR8qw='&gt;&lt;span style='font-style:italic;font-weight:bolder;'&gt;CD109 - Duet Enterprise Overview: Consume and Extend SAP Applications Through Microsoft SharePoint and Office&lt;/span&gt;&lt;/a&gt;. The presenters were from SAP AG, Microsoft Corp and CapGemini. In this session the business goals of Duet Enterprise are outlined, at high-level the advantages it brings for companies doing or considering SAP / Microsoft interoperability, discussion of the architecture and runtime flow, and the development toolset + process. Accompanied by (life and pre-recorded) demo's.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Some of the take-aways of this presentation:&lt;ul style='margin-top:2px;'&gt;&lt;li&gt;Duet [Enterprise] Service Consumption Layer is the first version of SAP's project "Gateway", embedded in Duet. The aim of project "Gateway" is provide simplified access to SAP:&lt;div style='margin-top:1px;'&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:10pt;padding:20px;width:80%;overflow:auto;'&gt;&lt;div style='font-style:italic;font-weight:bolder;margin-bottom:3px;'&gt;SCL, internally referred to as 'Gateway Layer'&lt;/div&gt;&lt;br/&gt;Framework built as an &lt;span style='font-weight:bolder;'&gt;NetWeaver ABAP add-on&lt;/span&gt;, enabling simplified access to SAP software from any device or environment using standard market protocols&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Primarily, Duet Enterprise is working as an Add-On on both sides; NetWeaver stack and SharePoint stack&lt;/li&gt;&lt;li&gt;[SAP service-enabling] Business entities from SAP available as Web Services; [SAP consumption] Discover SAP information as External Content Types in BCS, and connect to SharePoint/Office.&lt;/li&gt;&lt;li&gt;The ready to use Duet Enterprise capabilities, are also building blocks that you can use and even build upon in your custom solutions&lt;/li&gt;&lt;li&gt;SharePoint Duet Enterprise front-end development distincts 3 Solution Types:&lt;ol&gt;&lt;li&gt;Simple - by end-user; within the SharePoint GUI&lt;/li&gt;&lt;li&gt;Intermediate - by Power User; via SharePoint designer&lt;/li&gt;&lt;li&gt;Advanced - by a .NET developer; via Visual Studio&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Study on the effort it takes to develop SAP/SharePoint integration learns that without Duet Enterprise it costs 6 times&lt;/li&gt;&lt;li&gt;Create solutions very fast to address business (needs) very quickly. Not create very big applications, but small ones and do it fast&lt;/li&gt;&lt;li&gt;SAP services are fairly complicated, with nested and complex structures. SAP WSDL's kinda have their own definition, slightly away from the WS*-standards&lt;/li&gt;&lt;li&gt;Duet Enterprise can either map SharePoint users to SAP users through the Duet Enterprise User Mapping component, or connect to a LDAP that this mapping.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;See also slides of the presenation&lt;div&gt;&lt;a href="http://www.sapevents.edgesuite.net/TechEd/TechEd_Vegas2010/Collateral/CD109.pdf"&gt;&lt;img style="cursor:pointer; cursor:hand;width:80%;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/TMQ_eLNtZNI/AAAAAAAAAKk/g0WvJlOBARs/s320/CD109-slides.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5531616029956728018" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-1566782738912414020?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/1566782738912414020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/10/duet-enterprise-overview-presentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1566782738912414020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1566782738912414020'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/10/duet-enterprise-overview-presentation.html' title='Duet Enterprise Overview presentation at SAP TechEd 2010'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_77IVwtGj8s0/TMQ_eLNtZNI/AAAAAAAAAKk/g0WvJlOBARs/s72-c/CD109-slides.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5572671667846112887</id><published>2010-10-02T20:07:00.011+02:00</published><updated>2010-10-04T19:27:07.393+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Steps HowTo begin with SAP / MS interoperability</title><content type='html'>&lt;div&gt;Important aspect of applying SAP-Microsoft interoperability within a company IT landscape, is &lt;span style='font-style:italic;'&gt;how to start&lt;/span&gt;. Almost always the Microsoft and SAP departments form their own community in the company, with only limited contacts and co-operation between them, and no clear understanding of each others platforms, technologies and capabilities. See also earlier posts of Kristian Kalsing [&lt;a href='http://kalsing.blogspot.com/2009/06/interview-with-mike-fitzmaurice-on.html'&gt;1&lt;/a&gt;] and of myself [&lt;a href='http://williamvanstrien.blogspot.com/2009/06/shared-thought-achieving-successfully.html'&gt;2&lt;/a&gt;] addressing this issue.&lt;br /&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Raymond Smith [Microsoft Corporation] published an interesting article on this: &lt;a href='http://blogs.technet.com/b/lobapps/archive/2010/09/18/building-an-sap-microsoft-interoperability-practice.aspx'&gt;Building an SAP/Microsoft Interoperability Team&lt;/a&gt;. In his article he distinguishes and details on the following aspects:&lt;/div&gt;&lt;div style='margin-top:1px;'&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:10pt;padding:20px;width:90%;overflow:auto;'&gt;&lt;br /&gt;&lt;h3&gt;Aspects of Building an SAP/Microsoft Interoperability Team&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Build a SAP Interoperability Lab&lt;/li&gt;&lt;li&gt;Determine a Proof of Concept Business Process&lt;/li&gt;&lt;li&gt;Build Your Interoperability Team&lt;/li&gt;&lt;li&gt;Cross Train Developers&lt;/li&gt;&lt;li&gt;SAP Interoperability Training&lt;/li&gt;&lt;li&gt;Determine Architecture&lt;ul&gt;&lt;li&gt;Security&lt;/li&gt;&lt;li&gt;SAP Architecture&lt;/li&gt;&lt;li&gt;SharePoint/.NET Architecture&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;POC Development&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style='clear:both;float:left;margin-top:10px;'&gt;I recognize [most of] these steps from own experiences with SAP / MS interoperability implementations. For the details, I strongly advice to read &lt;a href='http://blogs.technet.com/b/lobapps/archive/2010/09/18/building-an-sap-microsoft-interoperability-practice.aspx'&gt;Raymond's article&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5572671667846112887?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5572671667846112887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/10/steps-howto-begin-with-sap-ms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5572671667846112887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5572671667846112887'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/10/steps-howto-begin-with-sap-ms.html' title='Steps HowTo begin with SAP / MS interoperability'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-7267943223234249688</id><published>2010-09-25T16:52:00.007+02:00</published><updated>2010-09-25T17:13:48.452+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Administration'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>Debugging Error upon creating MySite</title><content type='html'>&lt;div&gt;In a SharePoint intranet, feature stapling is applied to the standard MySite site definition to customize and extend the newly created employee’s MySite’s. After making some requested changes to the custom MySite masterpage, I deployed the SharePoint solution to the development farm. When validating that upon first visit an employee’s MySite is still successful and correct created, I got a runtime error. The display error message gave no details on the problem cause, and in the 12hive log no related information was found. Due a lack of rights to open the EventLog on the remote development server, I could not [myself] check whether in there useful  logging was available.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;So, what to do? Due the nature of my changes I was pretty sure that the malfunction could not be related back to them. But pretty sure is not good enough, when the ultimate deployment target is the company production intranet. I needed to exactly pinpoint the problem cause, and proof that it was not related to my deployment.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The SharePoint standard MySite creation handling hides the details of the thrown and catched exceptions. To detect what exception was thrown, I therefore created my own DebugMySite.aspx, and filled it with the basics of the standard MySite creation handling – with the noticeable difference to expose the exception details within the browser. Via this debugging approach I learned that the internal error message reported the following:&lt;/div&gt;&lt;div style='margin-top:1px;'&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;My Site creation failure for user '&amp;lt;domain&amp;gt;\&amp;lt;username&amp;gt;' for site url 'https://SharePointServer/personal/&amp;lt;username&amp;gt;'. The exception was: &lt;br /&gt;Microsoft.Office.Server.UserProfiles.PersonalSiteCreateException: There has been an error creating the personal site ---&amp;gt; System.ArgumentException: Value does not fall within the expected range.&lt;br /&gt;   at Microsoft.SharePoint.Library.SPRequestInternalClass.SscCreateSite(Guid gApplicationId, String bstrUrl, String bstrServerRelativeUrl, Int32 lZone, Guid gSiteId, Guid gDatabaseId, String bstrDatabaseServer, String bstrDatabaseName, String bstrDatabaseUsername, String bstrDatabasePassword, String bstrTitle, String bstrDescription, UInt32 nLCID, String bstrWebTemplate, String bstrOwnerLogin, String bstrOwnerUserKey, String bstrOwnerName, String bstrOwnerEmail, String bstrSecondaryContactLogin, String bstrSecondaryContactUserKey, String bstrSecondaryContactName, String bstrSecondaryContactEmail, Boolean bADAccountMode)&lt;br /&gt;at Microsoft.SharePoint.Library.SPRequest.SscCreateSite(Guid gApplicationId, String bstrUrl, String bstrServerRelativeUrl, Int32 lZone, Guid gSiteId, Guid gDatabaseId, String bstrDatabaseServer, String bstrDatabaseName, String bstrDatabaseUsername, String bstrDatabasePassword, String bstrTitle, String bstrDescription, UInt32 nLCID, String bstrWebTemplate, String bstrOwnerLogin, String bstrOwnerUserKey, String bstrOwnerName, String bstrOwnerEmail, String bstrSecondaryContactLogin, String bstrSecondaryContactUserKey, String bstrSecondaryContactName, String bstrSecondaryContactEmail, Boolean bADAccountMode)&lt;br /&gt;   at Microsoft.SharePoint.Administration.SPSiteCollection.Add(SPContentDatabase database, String siteUrl, String title, String description, UInt32 nLCID, String webTemplate, String ownerLogin, String ownerName, String ownerEmail, String secondaryContactLogin, String secondaryContactName, String secondaryContactEmail, String quotaTemplate, String sscRootWebUrl, Boolean useHostHeaderAsSiteName)&lt;br /&gt;   at Microsoft.SharePoint.SPSite.SelfServiceCreateSite(String siteUrl, String title, String description, UInt32 nLCID, String webTemplate, String ownerLogin, String ownerName, String ownerEmail, String contactLogin, String contactName, String contactEmail, String quotaTemplate)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style='float:left;margin-top:10px;'&gt;With these error details, I could do a focussed search on the internet. And found this related forum-entry &lt;a href='http://social.technet.microsoft.com/Forums/en-US/sharepointsocialcomputing/thread/c731ce02-f219-4356-985b-baf83a475c28'&gt;Error creating MySite: There has been an error creating the personal site&lt;/a&gt;, which had the answer: "&lt;span style='font-style:italic;'&gt;add the account configured as the Application Pool Identity for the web site to the "Farm Administrators" group through the Central Administration pages&lt;/span&gt;". This was the situation earlier for the intranet webapplication on our development farm, but somehow this got broken. With this knowledge I went to our IT pro, and asked them to restate the AppPool identity as a farm admin, followed by an IISReset. After that, the MySite creation problem was solved.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-7267943223234249688?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/7267943223234249688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/09/debugging-error-upon-creating-mysite.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7267943223234249688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7267943223234249688'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/09/debugging-error-upon-creating-mysite.html' title='Debugging Error upon creating MySite'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-8643717844816233116</id><published>2010-09-04T21:59:00.008+02:00</published><updated>2010-09-25T17:25:03.138+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><title type='text'>Duet Enterprise - Technical Overview presentation</title><content type='html'>&lt;div&gt;Upon searching on 'Duet Enterprise', I came accross this posted &lt;a href='http://cid-06239ca14286fbb9.office.live.com/self.aspx/.Public/Duet%20Enterprise%20-%20TDM%5E_200%5E_level.pptx'&gt;presentation with technical overview&lt;/a&gt;. Next to the expected high-level on the Duet Enterprise proposition, this powerpoint also contains some more in-depth explanatory visualizations of the technical and system flow in capabilities like authorization and single sign-on, SAP role based authorization, workflow, monitoring.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Note, the presentation is [declared] prelimary; in awaiting of RTM.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-8643717844816233116?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/8643717844816233116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/09/duet-enterprise-technical-overview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8643717844816233116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/8643717844816233116'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/09/duet-enterprise-technical-overview.html' title='Duet Enterprise - Technical Overview presentation'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-1487265139835217235</id><published>2010-08-26T09:11:00.030+02:00</published><updated>2010-08-30T23:38:58.135+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Content Type'/><category scheme='http://www.blogger.com/atom/ns#' term='MasterPage'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='SiteColumn'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='Information Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath Forms Server'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>More [functional] robustness issues with OOTB InfoPath Forms Services</title><content type='html'>&lt;div&gt;&lt;a href="http://williamvanstrien.blogspot.com/2010/01/infopath-embedded-via-xmlformview.html"&gt;Earlier &lt;/a&gt;I blogged about some robustness issues I encountered with the application of InfoPath Forms Services in an external facing SharePoint site. The basis of the framework developed in that project is re-used in context of the company's intranet. Hereby I ran into some new robustness issues. I'll describe them here, and also the outline of the applied solutions.&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Placing &lt;span style='font-family:Courier;font-size:smaller;'&gt;XmlFormView&lt;/span&gt; webpart on a SharePoint page conflicts with inline server codeblocks in MasterPage&lt;/b&gt;&lt;div style='width:95%;'&gt;&lt;div style='float:left;margin-top:4px;'&gt;Immediately upon adding the out-of-the-box &lt;span style='font-family:Courier;font-size:smaller;'&gt;Microsoft.Office.InfoPath.Server.Controls.XmlFormView&lt;/span&gt; webpart on a publishing page in the company's intranet, SharePoint throwed an exception:&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;&lt;b&gt;Source:&lt;/b&gt; System.Web&lt;br /&gt;&lt;b&gt;Message&lt;/b&gt;: The Controls collection cannot be modified because the control contains code blocks (i.e. ).&lt;br /&gt;&lt;b&gt;Stacktrace:&lt;/b&gt;&lt;br /&gt;at System.Web.UI.ControlCollection.Add(Control child)&lt;br /&gt;at Microsoft.Office.InfoPath.Server.SolutionLifetime.ScriptIncludes.AddCssLinkToHeader(HtmlHead head, String href)&lt;br /&gt;at Microsoft.Office.InfoPath.Server.Controls.XmlFormView.TryToAddCssLinksToHeader()&lt;br /&gt;at Microsoft.Office.InfoPath.Server.Controls.XmlFormView.OnDataBindHelper()&lt;br /&gt;at Microsoft.Office.InfoPath.Server.Controls.XmlFormView.OnPreRender(EventArgs e)&lt;br /&gt;at System.Web.UI.Control.PreRenderRecursiveInternal()&lt;br /&gt;at System.Web.UI.WebControls.WebParts.WebPart.PreRenderRecursiveInternal()&lt;br /&gt;at System.Web.UI.Control.PreRenderRecursiveInternal()&lt;br /&gt;at System.Web.UI.Control.PreRenderRecursiveInternal()&lt;br /&gt;at System.Web.UI.Control.PreRenderRecursiveInternal()&lt;br /&gt;at System.Web.UI.Control.PreRenderRecursiveInternal()&lt;br /&gt;at System.Web.UI.Control.PreRenderRecursiveInternal()&lt;br /&gt;at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='float:left;margin-top:5px;'&gt;First analysis learned that the problem was related to the applied SharePoint MasterPage: it manifested itself with 2 of our custom MasterPages, but not on other custom nor the standard (Publishing) Masterpages. Inspection of the particular custom MasterPages disclosed the following server-side code:&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;&amp;lt;% Response.Write("&amp;lt;script&amp;gt;var Collaboration_SiteRelativeUrl='" + SPContext.Current.Site.Url + "';&amp;lt;/script&amp;gt;"); %&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='float:left;'&gt;The inclusion of this inline server codeblocks resulted in the conflict with the server-side operation of the &lt;span style='font-family:Courier;font-size:smaller;'&gt;XmlFormView&lt;/span&gt; webpart. &lt;b&gt;The solution&lt;/b&gt; was to replace the inline server codeblocks-tags '&amp;lt;%' and '%&amp;gt;' approach by a &lt;span style='font-family:Courier;font-size:smaller;'&gt;HtmlHead&lt;/span&gt; (which is a webcontrol) databinding approach:&lt;/div&gt; &lt;br /&gt;&lt;div style='float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;&amp;lt;script&amp;gt;var Collaboration_SiteRelativeUrl="&amp;lt;%# SPContext.Current.Site.Url %&amp;gt;";&amp;lt;/script&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;float:left;margin-top:5px;'&gt;And in the MasterPage codebehind:&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;float:left;border-width:1px;border-style:solid;border-color:#C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;div style='font-family:Syntax;font-size:8pt;padding:20px;width:90%;overflow:auto;'&gt;protected override void OnLoad (EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.OnLoad(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Page.Header.DataBind();&lt;br /&gt;}&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;'&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;IE 6 gives a runtime Javascript error in case of RichTextBox control on the form&lt;/b&gt;&lt;div style='width:95%;'&gt;&lt;div style='float:left;margin-top:4px;'&gt;While demonstrating the potential of the self-service WebForms functionality to internal stakeholders, I was asked to modify an earlier published InfoPath form with the placement of a RichTextBox control. After re-publishing the InfoPath form to the SharePoint target site, the form still correctly displayed in the content page; including the added RichTextBox control. However, when positioning the mouse in the RichTextBox control, the IE6 browser (&lt;span style='font-style:italic'&gt;Red: still the company's standard&lt;/span&gt;) reported a runtime Javascript error. Also the RichTextBox toolbox was not displayed, leaving the control pretty useless wrt a plain TextBox control.&lt;br /&gt;&lt;br /&gt;With these problem symptons, I kinda got a 'Deja-Vu' feeling. It looked very much like the problem &lt;a href="http://williamvanstrien.blogspot.com/2010/01/infopath-embedded-via-xmlformview.html"&gt;earlier&lt;/a&gt; encountered with displaying InfoPath forms in IE 6. And indeed: via Javascript debugging I detected that the client-side runtime error manifested itself in the same OOTB InfoPath &lt;span style='font-family:Courier;font-size:smaller;'&gt;Inc/Core.js&lt;/span&gt; method as before: &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization.ComputeAbsoluteTop()&lt;/span&gt;. Was then the problem caused by the usage of relative CSS-positioning applied in the custom branding, this time it proved completely InfoPath related. I could easily reproduce the same problem within a standard SharePoint WebPart page, with a standard MasterPage. The explanation of the IE 6 Javascript problem is in the HTML that InfoPath Forms Services renders for a RichTextBox control: an embedded iframe element within the DOM document. Due to the fault behaviour of the IE 6 &lt;span style='font-family:Courier;font-size:smaller;'&gt;offsetParent&lt;/span&gt; method implementation in combination with the non-robust/error-prone implementation of the OOTB InfoPath method, this results in the runtime Javascript error.&lt;b&gt;The solution&lt;/b&gt; was to runtime at browser/client-side expand that OOTB InfoPath method to make it robust for the IE 6 faulty CSS &lt;span style='font-family:Courier;font-size:smaller;'&gt;offsetParent&lt;/span&gt; implementation.&lt;br /&gt;&lt;div style='float:left;background:lightyellow;margin:20px;width:90%;'&gt;&lt;span style='font-family:Courier;font-size:8pt;padding:20px;'&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_77IVwtGj8s0/TGRsdw8pI2I/AAAAAAAAAKM/fFTBJuEJiAs/s1600/FixRichTextBoxIssue.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 95%;" src="http://3.bp.blogspot.com/_77IVwtGj8s0/TGRsdw8pI2I/AAAAAAAAAKM/fFTBJuEJiAs/s320/FixRichTextBoxIssue.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5504643903164851042" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style='clear:both;margin-top:5px;'/&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;InfoPath re-publishing adds duplicate site columns to the ContentType&lt;/b&gt;&lt;div style='width:95%;'&gt;&lt;div style='float:left;margin-top:4px;'&gt;&lt;br /&gt;Upon re-publishing an InfoPath formtemplate during the demonstration, I noticed another issue. It looked as if all promoted fields in the ContentType were now duplicate present. A quick internet search learned that this is a known InfoPath feature/behaviour, just something I myself was not aware of upto now. And neither something I was particular happy with. I think it is pretty ridiculous to add a complete other set of fields to the InfoPath ContentType each time you re-publish the associated formtemplate. You have some control-options in the InfoPath publishing wizard to prevent the creation of another set of promoted fields, but this is manual-dependent and thus error-prone; let alone it is also very cumbersone and clumsy for the functional managers (&lt;span style='font-style:italic;'&gt;the first-class users of the self-service WebForms functionality in the company portal&lt;/span&gt;). Therefore I sought for a manner to &lt;b&gt;afterwards&lt;/b&gt; correct the modified &lt;span style='font-family:Courier;font-size:smaller'&gt;ContentType&lt;/span&gt;, by removing all duplicate &lt;span style='font-family:Courier;font-size:smaller;'&gt;FieldLinks&lt;/span&gt;. Ideally did would be done fully automatic in the scope of the InfoPath publishing, and thus transparent and invisible to the WebForms functional managers. Sadly, SharePoint does not have an &lt;span style='font-family:Courier;font-size:smaller;'&gt;EventReceiver&lt;/span&gt; signalling the creation or update of a &lt;span style='font-family:Courier;font-size:smaller'&gt;ContentType&lt;/span&gt;. &lt;b&gt;The solution&lt;/b&gt; is therefore to deliver a &lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/TGRor7TmYFI/AAAAAAAAAJ0/AkPElTQOZwk/s1600/FixDuplicateSitecolumsPage.jpg"&gt;custom SharePoint application page&lt;/a&gt; via which the WebForms functional manager can afterwards fix the InfoPath modified &lt;span style='font-family:Courier;font-size:smaller'&gt;ContentType&lt;/span&gt;. He/she selects in the dropdown the &lt;span style='font-family:Courier;font-size:smaller'&gt;ContentType&lt;/span&gt; that [potentially] needs a cleanup. The custom application page then &lt;a href="http://3.bp.blogspot.com/_77IVwtGj8s0/TGRq87SdonI/AAAAAAAAAJ8/ToYXVZL9mzE/s1600/DetermineDuplicateColumns.jpg"&gt;inspects&lt;/a&gt;&lt;br /&gt; the &lt;span style='font-family:Courier;font-size:smaller'&gt;FieldLinks&lt;/span&gt; in the &lt;span style='font-family:Courier;font-size:smaller'&gt;ContentType&lt;/span&gt; for duplicate occurences, and removes each one found. The changes (deletions) in the SiteCollection &lt;span style='font-family:Courier;font-size:smaller'&gt;ContentType&lt;/span&gt; are propagated to all childs. Also each duplicate detected &lt;span style='font-family:Courier;font-size:smaller'&gt;FieldLink&lt;/span&gt; is removed from the &lt;span style='font-family:Courier;font-size:smaller'&gt;Fields&lt;/span&gt; collection of each &lt;span style='font-family:Courier;font-size:smaller'&gt;SPDocumentLibrary&lt;/span&gt; that is associated with the selected InfoPath &lt;span style='font-family:Courier;font-size:smaller'&gt;ContentType&lt;/span&gt; (&lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/TGRrai8jEoI/AAAAAAAAAKE/KxapzAAYbfQ/s1600/DeleteDuplicateSiteColumns.jpg"&gt;code snippet&lt;/a&gt;).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-1487265139835217235?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/1487265139835217235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/08/more-functional-robustness-issues-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1487265139835217235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1487265139835217235'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/08/more-functional-robustness-issues-with.html' title='More [functional] robustness issues with OOTB InfoPath Forms Services'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_77IVwtGj8s0/TGRsdw8pI2I/AAAAAAAAAKM/fFTBJuEJiAs/s72-c/FixRichTextBoxIssue.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-7167025791126269649</id><published>2010-08-12T07:11:00.013+02:00</published><updated>2010-08-13T20:34:55.700+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Provision'/><category scheme='http://www.blogger.com/atom/ns#' term='ObjectModel'/><category scheme='http://www.blogger.com/atom/ns#' term='Content Type'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='Information Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath Forms Server'/><title type='text'>Handling save conflict within SPList EventReceiver</title><content type='html'>&lt;div&gt;&lt;h3 style='font-size:110%;'&gt;Background&lt;/h3&gt;Publishing an InfoPath form to a SharePoint site creates a new contenttype in the site. Via the InfoPath publishing wizard you have some control over the structure of the created contenttype. But in essence the control is very limited when compared with explicitly provision a contenttype yourself [&lt;span style='font-style:italic;'&gt;see also previous post &lt;a href='http://williamvanstrien.blogspot.com/2010/01/administrate-data-from-infopath-form-in.html'&gt;Administrate data from InfoPath form in a self-provisioned ContentType&lt;/a&gt; for further explanation why I prefer this above the automatic created information architecture entities&lt;/span&gt;]. However, it is not always possible or viable to explicit provision the InfoPath utilized IA entities. The big selling point of InfoPath is that it enables self-service (web)form-definition by functional management. A key cornerstone in this self-services proces is the InfoPath publishing functionality to allow functional managers to themselves distribute the InfoPath forms to a SharePoint site.&lt;br /&gt;One of the aspects missing with the InfoPath publishing managed contenttypes is including the InfoPath promoted fields in the display form. Displaying all InfoPath form fields is in particular handy when quickly browsing the data submitted to a SharePoint forms library.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Solution approach&lt;/h3&gt;To fix the functional shortcoming requires to afterwards make the promoted fields displayed. This is not something you want to burden the functional managers with. The aim is therefore to execute it automatically in the context of the target SharePoint site. The ideal moment would be when the InfoPath managed contenttype is created or updated. SharePoint however does not provide an eventreceiver for these events. The next best moment is when the contenttype is associated with the forms library to which the InfoPath form data is submitted. Here you neither have a direct event notifying the contentype association. But you can receive indirect notification via &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPListEventReceiver::FieldAdded&lt;/span&gt;. The idea is then to check each added field whether it is an InfoPath promoted field, and if so to alter its definition so that the field will appear in the standard SharePoint display form.&lt;br /&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Issues encountered&lt;/h3&gt;So, easily said and done. Associate the custom &lt;span style='font-family:Courier;font-size:smaller;'&gt;ListTemplate&lt;/span&gt; with a &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPListEventReceiver&lt;/span&gt;, and fill in the &lt;span style='font-family:Courier;font-size:smaller;'&gt;FieldAdded&lt;/span&gt; method. In my local development image it worked like a charm: after you associate via the SharePoint GUI a document library with an InfoPath contenttype, all promoted fields of that contenttype appear in the document library display form. But after deploying to the central SharePoint development farm, I ran into the first issue. Upon associating a library with a contenttype, SharePoint faulted with a weird message: &lt;span style='color:red;'&gt;The specified program requires a newer version of Windows&lt;/span&gt;.&lt;a href="http://3.bp.blogspot.com/_77IVwtGj8s0/TGGs5PvLK2I/AAAAAAAAAJU/nqvP1n-H1u4/s1600/WeirdWindowsVersionError.jpg"&gt;&lt;img style="float:left; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 95%;" src="http://3.bp.blogspot.com/_77IVwtGj8s0/TGGs5PvLK2I/AAAAAAAAAJU/nqvP1n-H1u4/s1600/WeirdWindowsVersionError.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5503870319100373858" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:3px;clear:both;'&gt;Despite this misleading error message, it was immediate clear that the issue was caused by the custom FieldAdded eventhandler: &lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/TGG2LhbyohI/AAAAAAAAAJc/UH_Bsnxm9d8/s1600/EventHandlerWithDirectUpdateConflict.jpg"&gt;&lt;img style="float:left; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 95%" src="http://4.bp.blogspot.com/_77IVwtGj8s0/TGG2LhbyohI/AAAAAAAAAJc/UH_Bsnxm9d8/s1600/EventHandlerWithDirectUpdateConflict.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5503880528693207570" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:3px;clear:both;'&gt;Apparently, SharePoint does not allow to update a list field in the runtime context of that field being added to a list.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Solution outline&lt;/h3&gt;Solution is to isolate the execution of the field-update from the field-addition runtime context. Instead of direct updating the field, schedule this work via a worker thread. One extra aspect to take into account is that the scheduled worker threads can still run into a parallel update conflict:&lt;br /&gt;&lt;div style='float:left;border:2px solid C0C0C0;background:lightyellow;margin:20px;'&gt;&lt;span style='padding:10px;'&gt;&lt;br /&gt;&lt;span style='font-family:Courier;font-size:8pt;color:red;'&gt;Save Conflict&lt;br /&gt;&lt;br /&gt;Your changes conflict with those made concurrently by another user. If you want your changes to be applied, click Back in your Web browser, refresh the page, and resubmit your changes.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;at Microsoft.SharePoint.Library.SPRequest.UpdateField(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String bstrUrl,String bstrListName, String bstrXML)&lt;br /&gt;&amp;nbsp;&amp;nbsp;at Microsoft.SharePoint.SPField.UpdateCore(Boolean bToggleSealed)&lt;br /&gt;&amp;nbsp;&amp;nbsp;at Microsoft.SharePoint.SPField.Update()&lt;br /&gt;&amp;nbsp;&amp;nbsp;at WebformulierFieldsHandler.Worker.&lt;Run&gt;b__1()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;The likelihood of these save conflicts increases with the number of promoted fields in the contenttype, and can already manifest itself when that number is 4 to 5. It can be made functional robust by implementing a retry mechanism in the worker thread.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_77IVwtGj8s0/TGG3ug_PWSI/AAAAAAAAAJk/XW7gPJwZKRk/s1600/EventHandlerWithDecoupledUpdateController.jpg"&gt;&lt;img style="float:left; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 95%" src="http://1.bp.blogspot.com/_77IVwtGj8s0/TGG3ug_PWSI/AAAAAAAAAJk/XW7gPJwZKRk/s1600/EventHandlerWithDecoupledUpdateController.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5503882229380503842" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_77IVwtGj8s0/TGG4Bn45uiI/AAAAAAAAAJs/60-MohpVuQ4/s1600/EventHandlerWithDecoupledUpdateWorker.jpg"&gt;&lt;img style="float:left; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 95%; " src="http://3.bp.blogspot.com/_77IVwtGj8s0/TGG4Bn45uiI/AAAAAAAAAJs/60-MohpVuQ4/s1600/EventHandlerWithDecoupledUpdateWorker.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5503882557650483746" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-7167025791126269649?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/7167025791126269649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/08/handling-save-conflict-within-splist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7167025791126269649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7167025791126269649'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/08/handling-save-conflict-within-splist.html' title='Handling save conflict within SPList EventReceiver'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_77IVwtGj8s0/TGGs5PvLK2I/AAAAAAAAAJU/nqvP1n-H1u4/s72-c/WeirdWindowsVersionError.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-6112177945393917233</id><published>2010-08-04T22:52:00.012+02:00</published><updated>2010-08-04T23:44:43.528+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Portal'/><title type='text'>What about the competition - new roadmap for SAP NetWeaver Portal</title><content type='html'>&lt;div&gt;As a SharePoint adept, I don't really consider the SAP Enterprise Portal as competition. Let's face it, the typical UI is horrible, and it lacks many of the capabilities the SharePoint platform brings. But moreover, the impression [within the market] is that SAP has stopped with actual new major developments in this product (Web2.0, content management, social media). SAP is putting it's intellectual resources and budget mainly on the business capabilities, and less on fancy user interaction. Fair enough, as it leaves room for integration and interoperability via foreign UIs, as SharePoint.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Contradicting the above, it's knownable that at SAPPHIRE some new additions for SAP NetWeaver Portal were announced. Most notable the concept of 'Enterprise Workspaces'. Read and see more of this in &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/19520'&gt;SAP NetWeaver Portal – SAPPHIRE NOW Summary&lt;/a&gt;.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;span style='font-style:italic;'&gt;It aims to provide SAP users with an iGoogle- or myYahoo-type experience within SAP, allowing them to build their own pages with structured and unstructured assets -- reports, RSS feeds and so on. It applies a self-service approach within defined roles and security.&lt;/span&gt; [&lt;a href='http://searchsap.techtarget.com/news/2240020489/SAP-NetWeaver-Portal-roadmap-includes-Workspaces-easier-third-party-integration?'&gt;SAP NetWeaver Portal roadmap includes 'Workspaces,' easier third-party integration&lt;/a&gt;]&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;img src='http://media.techtarget.com/rms/misc/WorkSpace.JPG' width='250px' align='left'/&gt;Well, the UI impressions and the self-service concepts are rather impressive and promising. I do hold on to my opinion that SharePoint is a better overall portal platform. But it looks as if SAP could be making a new step forward in its own portal product.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-6112177945393917233?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/6112177945393917233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/08/what-about-competition-new-roadmap-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6112177945393917233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6112177945393917233'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/08/what-about-competition-new-roadmap-for.html' title='What about the competition - new roadmap for SAP NetWeaver Portal'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-4701574769319799934</id><published>2010-07-29T23:04:00.007+02:00</published><updated>2010-07-31T21:57:57.178+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Service'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Standards-Based Interoperability between SAP NetWeaver 7.0 and Microsoft .NET 3.5/4.0</title><content type='html'>&lt;div&gt;Microsoft opened a new &lt;a href="http://msdn.microsoft.com/en-us/netframework/webservicesinterop.aspx#grid"&gt;interoperability area&lt;/a&gt; within MSDN on Web Service Interoperability between the major web services vendors. Amongst these naturally also SAP. The site contains an extensive (75 pages) &lt;a href="http://msdn.microsoft.com/en-us/library/ff709807.aspx"&gt;Demonstration Scenario&lt;/a&gt; of the Collaboration Technology Support Center addressing &lt;span style='font-style:italic;'&gt;information about how to set up standards-based Web services communication between Microsoft .NET Framework applications and SAP Application Server ABAP-based consumers and providers&lt;/span&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-4701574769319799934?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/4701574769319799934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/07/standards-based-interoperability.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4701574769319799934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4701574769319799934'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/07/standards-based-interoperability.html' title='Standards-Based Interoperability between SAP NetWeaver 7.0 and Microsoft .NET 3.5/4.0'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5702956388936110718</id><published>2010-07-28T17:11:00.002+02:00</published><updated>2010-07-28T23:34:57.147+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HPW'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Portal'/><title type='text'>Portal Embedding of SAP UWL into SharePoint</title><content type='html'>&lt;div&gt;There are multiple alternatives for utilizing SharePoint as presentation layer to SAP functionality. The most basic is portal launch, next comes portal embedding. Portal embedding has some advantages (mainly being rapidly to achieve: you only visually integrate the 2 [SAP, Microsoft] environments, without any direct systems/applications integration and interoperability), but remains a rather poor man's approach to portal integration. The typical SAP UI / Look and Feel is very different from the SharePoint UI (standard or company-customized), and the SAP Portal pages exhibit themselves browser navigation in addition to the SharePoint navigation.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Andre Fischer a.o. from SAP recently published the whitepaper &lt;a href="http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/40dbb54f-5c28-2d10-ad94-f812a548dc07?QuickLink=index&amp;overridelayout=true"&gt;Integration of SAP Universal Worklist into Microsoft Office SharePoint&lt;/a&gt;. This paper contains an example of the portal embedding approach, while also addressing the double navigation issue. In particular it describes an approach to integrating the SAP Universal Worklist into SharePoint context. Basically it comes down at making sure at the SAP Portal side that the portal pages are rendered headerless, without the portal navigation. The elegance of the sketched approach is that it is limited to SAP Portal configuration and customization work, there is no custom development required at either SAP nor SharePoint side.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5702956388936110718?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5702956388936110718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/portal-embedding-of-sap-uwl-into.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5702956388936110718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5702956388936110718'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/portal-embedding-of-sap-uwl-into.html' title='Portal Embedding of SAP UWL into SharePoint'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5391374335739509761</id><published>2010-07-22T21:20:00.011+02:00</published><updated>2010-07-22T23:31:25.298+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Connector'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><category scheme='http://www.blogger.com/atom/ns#' term='Content Management'/><title type='text'>SharePoint 2010 CMIS Connector</title><content type='html'>&lt;div&gt;To enable content management interoperability between different CMS repositories, the OASIS organization defined the &lt;a href='http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=cmis'&gt;Content Management Interoperability Standard&lt;/a&gt; specification. Although a.o. Microsoft played a major role in the OASIS working group defining this proposed standard, up to now it did not provide a concrete and product-ready implementation of the CMIS specification for SharePoint 2007. There is only a reference/example implementation available on &lt;a href='http://msdn.microsoft.com/en-us/library/dd440954.aspx'&gt;MSDN&lt;/a&gt;, with &lt;a href='http://code.msdn.microsoft.com/spextcontent'&gt;code download&lt;/a&gt;.&lt;/div&gt;&lt;div style='margin-top:5px;'&gt;Apparently Microsoft decided to wait with active support of the CMIS specification for the next SharePoint version. For SharePoint Server 2010 Microsoft now packages a CMIS connector as part of the &lt;a href='http://www.microsoft.com/downloads/details.aspx?FamilyId=718447d8-0814-427a-81c3-c9c3d84c456e&amp;displaylang=en'&gt;Administration Toolkit v1.0&lt;/a&gt;. &lt;span style='font-style:italic;'&gt;The CMIS Connector for SharePoint provides a CMIS (Content Management Interoperability Services) interface over the top of SharePoint as well as a CMIS consumer Web Part that can be used to display content from other CMIS enabled repositories. [source: &lt;a href='http://blogs.msdn.com/b/sharepoint/archive/2010/04/21/announcing-the-cmis-connector-for-sharepoint.aspx'&gt;Microsoft SharePoint Teamblog&lt;/a&gt;]&lt;/span&gt; Or stated otherwise: via this CMIS Connector, SharePoint Server 2010 can both function as &lt;u&gt;&lt;span style='font-style:italic;'&gt;CMIS consumer&lt;/span&gt;&lt;/u&gt; of content stored in external repositories, and as &lt;u&gt;&lt;span style='font-style:italic;'&gt;CMIS producer&lt;/span&gt;&lt;/u&gt; of content stored within SharePoint lists and libraries.&lt;/div&gt;&lt;div style='margin-top:10px'&gt;&lt;span style='font-weight=bold;font-style:italic;'&gt;Mind you...&lt;/span&gt;&lt;ul style='margin-top:1px;'&gt;&lt;li&gt;the CMIS Connector is not supported for SharePoint Foundation 2010&lt;/li&gt;&lt;li&gt;and there is still only &lt;a href='http://www.cmis.biz/2010/01/15/implementation/cmis-server/overview-of-ecm-vendors-that-support-cmis-ibm-emc-microsoft-alfresco-sap-opentext-etc/comment-page-1/#comment-1203'&gt;limited support of the CMIS standard by other CMS vendors&lt;/a&gt;; the real value of CMIS requires [at least] 2 to tango...&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5391374335739509761?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5391374335739509761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/07/sharepoint-2010-cmis-connector.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5391374335739509761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5391374335739509761'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/07/sharepoint-2010-cmis-connector.html' title='SharePoint 2010 CMIS Connector'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-6541670825785152198</id><published>2010-07-12T07:00:00.000+02:00</published><updated>2010-07-12T21:45:04.683+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><title type='text'>Beware: timerjob processes invoked via Central Admin deploy solution do not reload FeatureReceiver assembly</title><content type='html'>&lt;div&gt;Recent we ran into an exception when deploying an external facing website to the production SharePoint farm. The problem originated in the &lt;span style='font-family:Courier;font-size:smaller;'&gt;FeatureInstalled()&lt;/span&gt; method of a custom &lt;span style='font-family:Courier;font-size:smaller;'&gt;FeatureReceiver&lt;/span&gt; class. We did not encounter this particular deployment problem in the integration nor QA environment. Since on a production environment it is not viable to debug, we had to resort to inserting logging statements in the code, and then redeploy the assembly. But strangely, no logging was written leaving us still blank with respect to the exact code location and cause of the deployment problem.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;After several deployment attempts together with operations, we came up with the explanation &lt;span style='font-style:italic;'&gt;why&lt;/span&gt; the logging was not done. The timerjob process that executes the &lt;span style='font-family:Courier;font-size:smaller;'&gt;FeatureReceiver FeatureInstalled()&lt;/span&gt; method still has the old code loaded!! To force that the assembly is reloaded from either GAC or virtual bin &lt;span style='font-style:italic;'&gt;after&lt;/span&gt; deploySolution and &lt;span style='font-style:italic;'&gt;before&lt;/span&gt; execution of &lt;span style='font-family:Courier;font-size:smaller;'&gt;FeatureInstalled&lt;/span&gt;, you need to recycle the timerjobs processes. The right time for this is after the retractSolution of the previous version of the deployed SharePoint solution package.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;NB: we didn't notice this 'faulty' deploy/timerjobs behaviour before because it's not very common to actually utilize the &lt;span style='font-family:Courier;font-size:smaller;'&gt;FeatureInstalled()&lt;/span&gt; method. In this particular case it was necessary to timely correct something before the SharePoint feature framework performs the OOTB feature activation work.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-6541670825785152198?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/6541670825785152198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/07/beware-timerjob-processes-invoked-via.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6541670825785152198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6541670825785152198'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/07/beware-timerjob-processes-invoked-via.html' title='Beware: timerjob processes invoked via Central Admin deploy solution do not reload FeatureReceiver assembly'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-4497234317415703384</id><published>2010-07-09T22:55:00.009+02:00</published><updated>2010-07-10T11:21:29.155+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='SSO'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Duet® Enterprise on stage at SAPPHIRE 2010</title><content type='html'>&lt;div&gt;Duet® Enterprise is now clearly gaining momentum in the marketspace. It was also on the agenda of the SAPPHIRE 2010 Conference. Watch the session presented by Pascal Gilbert (Microsoft). In this &lt;a href='http://www.microsoft.com/showcase/en/us/details/43340072-c5aa-4f20-b8fa-85a6b59857af'&gt;presentation&lt;/a&gt; Pascal discusses at a conceptual level the business proposition of Duet® Enterprise, enlists in what aspects it is an improvement of the previous Duet versions, and gives a real life example of how Duet Enterprise can be put in sensible action applying strictly the OOTB provided capabilities.&lt;/div&gt;&lt;br /&gt;&lt;OBJECT width="0" height="0"&gt;&lt;EMBED height=0 type=application/x-shockwave-flash width=0 src=http://www.youtube.com/v/tEWj0i8GGPg&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;&gt;&lt;/EMBED&gt;&lt;br /&gt;&lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="560" height="315"&gt;&lt;br /&gt;&lt;param name="source" value="http://www.microsoft.com/showcase/silverlight/player/1/player-en.xap"/&gt;&lt;br /&gt;&lt;param name="enableHtmlAccess" value="true" /&gt;     &lt;br /&gt;&lt;param name="background" value="black" /&gt;&lt;br /&gt;&lt;param name="minRuntimeVersion" value="3.0.40624.0" /&gt;&lt;br /&gt;&lt;param name="autoUpgrade" value="true" /&gt;&lt;br /&gt;&lt;param name="initParams" value="Culture=en-US,Uuid=43340072-c5aa-4f20-b8fa-85a6b59857af,Autoplay=false,MarketingOverlayText=Visit this video's Web site,ShowMarketingOverlay=true,ShowMenu=True,Tabs=Embed;Email;Share;Info" /&gt;&lt;br /&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=3.0.40624.0" onmousedown="javascript:new Image().src = 'http://m.webtrends.com/dcsygm2gb10000kf9xm7kfvub_9p1t/dcs.gif?dcsdat=' + new Date().getTime() + '&amp;dcssip=www.microsoft.com&amp;dcsuri=' + window.location.href + '&amp;WT.tz=-8&amp;WT.bh=16&amp;WT.ul=en-US&amp;WT.cd=32&amp;WT.jo=Yes&amp;WT.ti=&amp;WT.js=Yes&amp;WT.jv=1.5&amp;WT.fi=Yes&amp;WT.fv=10.0&amp;WT.sli=Not%20Installed&amp;WT.slv=Version%20Unavailable&amp;WT.dl=1&amp;WT.seg_1=Not%20Logged%20In&amp;WT.vt_f_a=2&amp;WT.vt_f=2&amp;WT.vt_nvr1=2&amp;WT.vt_nvr2=2&amp;WT.vt_nvr3=2&amp;WT.vt_nvr4=2&amp;vp_site=Embedded&amp;wtEvtSrc=' + window.location.href + '&amp;vp_sli=Embedded'" border="0"&gt;&lt;br /&gt;&lt;img src="http://img.microsoft.com/showcase/Content/img/resx/en-US/installSL.gif" alt="Get Microsoft Silverlight" style="border-style: none"/&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;noscript&gt;&lt;div&gt;&lt;img alt="DCSIMG" id="DCSIMG" width="1" height="1" src="http://m.webtrends.com/dcsygm2gb10000kf9xm7kfvub_9p1t/njs.gif?dcsuri=/nojavascript&amp;WT.js=No"/&gt;&lt;/div&gt;&lt;/noscript&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Another short demo of what can be achieved with Duet® Enterprise for business collaboration in a mixed SAP (business processing platform) and Microsoft (Information Worker environment) landscape is given by &lt;a href='http://www.youtube.com/watch?v=tEWj0i8GGPg&amp;feature=player_embedded'&gt;Howard Beader&lt;/a&gt;:&lt;br/&gt;&lt;br /&gt;&lt;!--[if !IE]&gt;--&gt;&lt;object style='height: 344px; width: 425px;'&gt;&lt;param name='movie' value='http://www.youtube.com/v/tEWj0i8GGPg&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;'&gt;&lt;param name='allowFullScreen' value='true'&gt;&lt;param name='allowScriptAccess' value='always'&gt;&lt;embed src='http://www.youtube.com/v/tEWj0i8GGPg&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;' type='application/x-shockwave-flash' allowfullscreen='true' allowScriptAccess='always' width='425' height='344'&gt;&lt;/embed&gt;&lt;/object&gt;&lt;!--&lt;![endif]--&gt;&lt;br /&gt;&lt;!--[if IE]&gt;&lt;OBJECT id=movie_player classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=640 height=385&gt;&lt;PARAM NAME="_cx" VALUE="16933"&gt;&lt;PARAM NAME="_cy" VALUE="10186"&gt;&lt;PARAM NAME="FlashVars" VALUE=""&gt;&lt;PARAM NAME="Movie" VALUE="http://www.youtube.com/v/tEWj0i8GGPg&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp"&gt;&lt;PARAM NAME="Src" VALUE="http://www.youtube.com/v/tEWj0i8GGPg&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp"&gt;&lt;PARAM NAME="WMode" VALUE="Opaque"&gt;&lt;PARAM NAME="Play" VALUE="0"&gt;&lt;PARAM NAME="Loop" VALUE="-1"&gt;&lt;PARAM NAME="Quality" VALUE="High"&gt;&lt;PARAM NAME="SAlign" VALUE="LT"&gt;&lt;PARAM NAME="Menu" VALUE="-1"&gt;&lt;PARAM NAME="Base" VALUE=""&gt;&lt;PARAM NAME="AllowScriptAccess" VALUE="always"&gt;&lt;PARAM NAME="Scale" VALUE="NoScale"&gt;&lt;PARAM NAME="DeviceFont" VALUE="0"&gt;&lt;PARAM NAME="EmbedMovie" VALUE="0"&gt;&lt;PARAM NAME="BGColor" VALUE="000000"&gt;&lt;PARAM NAME="SWRemote" VALUE=""&gt;&lt;PARAM NAME="MovieData" VALUE=""&gt;&lt;PARAM NAME="SeamlessTabbing" VALUE="1"&gt;&lt;PARAM NAME="Profile" VALUE="0"&gt;&lt;PARAM NAME="ProfileAddress" VALUE=""&gt;&lt;PARAM NAME="ProfilePort" VALUE="0"&gt;&lt;PARAM NAME="AllowNetworking" VALUE="all"&gt;&lt;PARAM NAME="AllowFullScreen" VALUE="true"&gt;&lt;/OBJECT&gt;&lt;![endif]--&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-4497234317415703384?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/4497234317415703384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/07/duet-enterprise-on-stage-at-sapphire.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4497234317415703384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/4497234317415703384'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/07/duet-enterprise-on-stage-at-sapphire.html' title='Duet® Enterprise on stage at SAPPHIRE 2010'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5590538455691246289</id><published>2010-06-30T17:25:00.005+02:00</published><updated>2010-06-30T22:50:28.696+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='Connector'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>SAP announces a new release of the SAP .NET Connector</title><content type='html'>&lt;div&gt;In 2003 SAP released the &lt;a href="http://help.sap.com/saphelp_tm60/helpdata/en/e9/23c80d66d08c4c8c044a3ea11ca90f/content.htm"&gt;SAP .NET Connector&lt;/a&gt; (NCo) to enable communication between the .NET platform and SAP systems. The first NCo versions (1.0x, 2.0) were aimed at .NET 1.x (with support for Visual Studio .NET and later on VS 2003), and it remained at that level. This resulted in the overall conclusion that the NCo was considered 'dead', or at least strongly outdated (&lt;a href="http://forums.sdn.sap.com/thread.jspa?messageID=7835878#7835878"&gt;Future Support of NCo&lt;/a&gt;). This idea was re-enfored in May 2009 by 1) the &lt;a href="https://forums.sdn.sap.com/thread.jspa?threadID=1298735&amp;tstart=30"&gt;advice of Juergen Daiberl to use webservices or WCF Lob Adapter in favor of NCo&lt;/a&gt;, and 2) a statement of SAP's Rima Rudnik-Sirich &lt;a href="http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/14331"&gt;phrasing&lt;/a&gt; that 'ES Explorer is a successor of NCo'.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;However, the truth (or weakness) of SAP Enterprise Services is that currently only a limited set is available, supporting a restricted subset of the SAP business processes functionality. There are alternatives to custom develop SAP/MS intergration whenever it is not standard provided: WCF on SAP webservices, WCF BizTalk Adapter on SAP BAPIs and RFC. And forthcoming is Duet Enterprise, with a positioning for interoperability and collaboration between SharePoint 2010 and Office 2010 clients towards SAP processes and data.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;And now SAP apparently decided to give new life to the NCo proposition. They have &lt;a href="http://wiki.sdn.sap.com/wiki/display/ABAPConn/ABAP+Connectivity+Home"&gt;announced .NET Connector 3.0&lt;/a&gt;, to be released in December 2010. At first, this appears strange when you combine this announcement with the upcoming release of Duet Enterprise. However, Duet Enterprise is thus strictly scoped for interoperability between SharePoint plus Office 2010 and SAP environments. A renewed NCo will provide an additional alternative to communicate from other .NET application formats (e.g. WPF, WF, Services) to the SAP systems.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5590538455691246289?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5590538455691246289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/sap-announces-new-release-of-sap-net.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5590538455691246289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5590538455691246289'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/sap-announces-new-release-of-sap-net.html' title='SAP announces a new release of the SAP .NET Connector'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-1673980727989810239</id><published>2010-06-22T22:34:00.006+02:00</published><updated>2010-06-23T08:07:16.963+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><title type='text'>Test, QA and Production SharePoint infra should be comparable</title><content type='html'>&lt;div&gt;In multiple SharePoint projects I have been confronted with delivered functionality succesfully validated in the test environment, does not operate the same in the QA environment. Since the application software is identical in the environments, the cause of the malfunctions must originate from differences at infrastructure level. Especially when it occurs in a later project stadium, this can be a very unpleasant surprise. Of course it's not realistic to expect nor demand that the Test, QA and Production environments are 100% comparable. However, the differences should be limited to hardware resources level; number of front-end servers, sizing of database, cpu, ... The infra architecture and configuration should be [logically] the same; load-balancing, firewall settings, proxy, Central Admin settings (e.g. Search, SSO, Policy for Web Application).&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Extra complication to achieve such an ideal Test/QA/Production setup, is that typically the Test environment is much more volatile. This is the first environment to try-out your stuff, be it application functionality, infrastructure settings, or both. And in case of failure, not always the deployed trial stuff is rolled back. This is an extra argument to use virtualized Test environments per SharePoint project. When a new project start, an own Test environment is provisioned, with the current production state as its baseline. The project deploys all the project deliverables to this own Test environment. There is no overlap or conflicts with the work from other projects. And after project end (successful completion, or earlier stopped), the project Test environment can be deactivated and retired.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-1673980727989810239?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/1673980727989810239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/test-qa-and-production-sharepoint-infra.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1673980727989810239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1673980727989810239'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/test-qa-and-production-sharepoint-infra.html' title='Test, QA and Production SharePoint infra should be comparable'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-2395789751567315638</id><published>2010-06-20T14:45:00.003+02:00</published><updated>2010-06-20T15:16:32.822+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Content Database'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>Installing CU 2010.0 corrupts local SharePoint environment</title><content type='html'>&lt;div&gt;As at many, at my current customer deployment we're running our local SharePoint development environments in a virtualized image (currently Virtual PC; before it was VMWare Workstation). Recently we developers were informed by the SDE team on the availability of Cumulative Update 2010.0. Main reason to install that CU within your own local development environment is to come in sync again with the SharePoint installation state at the hosting platforms (development, QA and production).&lt;/div&gt;&lt;div style='margin-top:10px'&gt;Last week I installed the update. To discover next that my local SharePoint environment was broken! None of the local SharePoint sites would start up, including Central Admin. Running the Configuration Wizard also halted with an error. The eventlog contained the following error: &lt;span style='font-family:Courier;'&gt;The schema version (3.1.8.0) of the database WSS_Content_Project on &amp;lt;Machinename&amp;gt; is not consistent with the expected database schema version (3.1.11.0) on &amp;lt;Machinename&amp;gt;.  Connections to this database from this server have been blocked to avoid data loss.  Upgrade the web front end or the content database to ensure that these versions match.&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px'&gt;Via this message I found the cause + solution in the following post: &lt;a href='http://blogs.microsoft.co.il/blogs/adlaim/archive/2007/10/26/the-schema-version-3-0-149-0-of-the-database-sps-content-db-on-moss.aspx'&gt;The schema version (3.0.149.0) of the database sps_content_db on MOSS&lt;/a&gt;. And indeed, after manually modifying for each SharePoint content database the version to 3.1.11.0 (in my case), all local SharePoint sites came back to live again.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-2395789751567315638?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/2395789751567315638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/installing-cu-20100-corrupts-local.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2395789751567315638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2395789751567315638'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/installing-cu-20100-corrupts-local.html' title='Installing CU 2010.0 corrupts local SharePoint environment'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-71815813068950601</id><published>2010-06-15T22:38:00.008+02:00</published><updated>2010-06-15T23:53:35.077+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Duet® Enterprise on stage at seminar 'SAP and Microsoft BI'</title><content type='html'>&lt;div&gt;Recently I attended the Microsoft seminar 'SAP and Microsoft BI'. The focus of this seminar, and the audience, was evidently on Business Intelligence in a heterogenous SAP + MS IT landscape. But within this scope, also the forthcoming DUET Enterprise receives it's role. Juergen Grebe of the SAP / MS Alliance team had a good session on the interoperability architecture and the provided capabilities of DUET Enterprise.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://docs.google.com/fileview?id=0B89AfTMhfP0ZNDZkOTg0NTEtZGJiNi00YTNmLTgyZjEtMDA1ODJhYzZmZGIw&amp;hl=nl"&gt;&lt;img src="http://1.bp.blogspot.com/_77IVwtGj8s0/TBf0TrIRrdI/AAAAAAAAAJE/C63CiU51SJ4/s1600/JuergenGrebe_DuetEnterprise.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5483119690178997714" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-71815813068950601?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/71815813068950601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/duet-enterprise-on-stage-at-seminar-sap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/71815813068950601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/71815813068950601'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/06/duet-enterprise-on-stage-at-seminar-sap.html' title='Duet® Enterprise on stage at seminar &apos;SAP and Microsoft BI&apos;'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_77IVwtGj8s0/TBf0TrIRrdI/AAAAAAAAAJE/C63CiU51SJ4/s72-c/JuergenGrebe_DuetEnterprise.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-7587936424842594009</id><published>2010-05-23T22:46:00.015+02:00</published><updated>2010-05-24T08:43:16.753+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><category scheme='http://www.blogger.com/atom/ns#' term='Office'/><title type='text'>White paper discussing the promise of Duet®  Enterprise</title><content type='html'>&lt;div&gt;CITO Research has published &lt;a href='http://go.wispubs.com/emails/may/Microsoft_WP_Howard.html'&gt;The Business Value of Duet Enterprise&lt;/a&gt;, a research white paper sponsored by Microsoft. Such sponsorship always contains the risk of the result being more of an advertorial instead of an independent and thorough analysis + evaluation. This paper at locations certainly qualifies as unconditional product promotion, but it also presents several useful insights and details on the mission and capabilities of Duet Enterprise.&lt;/div&gt;&lt;div style='margin-top:10px'&gt;The paper discussions the mission and values of Duet® Enterprise from different viewpoints and angles:&lt;ul style='margin-top:3px;'&gt;&lt;li&gt;&lt;span style='font-style:italic'&gt;[as it should be] &lt;/span&gt;Starts with the business vision; &lt;span style='font-style:italic'&gt;the why&lt;/span&gt;&lt;/li&gt;&lt;li&gt;the architecture and interoperability approach; &lt;span style='font-style:italic'&gt;the how at high level&lt;/span&gt;&lt;/li&gt;&lt;li&gt;examples of what can be achieved; use cases&lt;/li&gt;&lt;li&gt;the components of the Duet Enterprise foundation; it's building blocks for composing applications that surface SAP line-of-business content and processes in user interface formats tailored to the needs of the nowadays Information Workers&lt;/li&gt;&lt;li&gt;the personality of composites that are best realized via either Duet Enterprise, Business Connectivity Services, or rather BizTalk; choosing the right interop tool for the task/scenario at hand&lt;/li&gt;&lt;/ul&gt;Some of the most noticable points to take from the paper are:&lt;ol style='margin-top:3px;'&gt;&lt;li&gt;The statement that although Duet® Enterprise relies on SAP NetWeaver 7.02; it can handle scenario's where a company's SAP environment consists of many generations of SAP applications. From SAP R3 4.6C to SAP ERP 6.0 and beyond.&lt;/li&gt;&lt;li&gt;Duet® Enterprise is SAP / MS &lt;span style='font-style:italic'&gt;interoperability foundation&lt;/span&gt;; for rapid development and construction of custom applications&lt;/li&gt;&lt;li&gt;Duet® Enterprise enables the &lt;span style='font-style:italic'&gt;rapid development approach&lt;/span&gt; by providing the needed interop plumping&lt;/li&gt;&lt;li&gt;Duet® Enterprise builds on &lt;span style='font-style:italic'&gt;existing investments&lt;/span&gt; in SAP [business applications + architecture] and Microsoft [Information Worker] software.&lt;/li&gt;&lt;li&gt;Duet® Enterprise fits in with &lt;span style='font-style:italic'&gt;existing modern IT&lt;/span&gt; management, development processes and environment/technologies.&lt;/li&gt;&lt;li&gt;Duet® Enterprise is one way for realizing the vision of Office Business Applications when it concerns connecting with SAP line-of-business.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Missing in the paper is a thorough consideration of the strengths versus weaknesses; of the product and of the proposition itself. With respect to that, Duet® Enterprise could be seen as a threat to some of the SAP business. Although it's promise is to extend the reach of SAP business capabilities beyond its traditional usage and departments, it does so via Microsoft instead of SAP software. It will be interesting to watch hows this develops, and what it will mean for the business of both SAP as Microsoft. Ideally, both will prospher from it. Only then, the combined effort will truly deliver, and have a future.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-7587936424842594009?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/7587936424842594009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/05/white-paper-discussing-promise-of-duet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7587936424842594009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7587936424842594009'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/05/white-paper-discussing-promise-of-duet.html' title='White paper discussing the promise of Duet®  Enterprise'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-337569767960353995</id><published>2010-05-17T22:07:00.007+02:00</published><updated>2010-05-17T22:58:13.056+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Identity Management'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='SSO'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Claims-based SSO with SAML 2.0</title><content type='html'>&lt;div&gt;On SAP Community Network the presentation &lt;a href='http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/30fe0e7b-b334-2d10-45b0-f35afb25a5bc'&gt;Next Generation SSO for SAP Applications with SAML 2.0&lt;/a&gt; is published containing &lt;span style='font-style:italic'&gt;an overview about authentication, single sign-on (SSO), and identity federation&lt;/span&gt; for SAP centric applications. Combined with the recent release of Microsoft's Claims-Based identity platform (&lt;a href='http://msdn.microsoft.com/en-us/security/aa570351.aspx'&gt;Windows Identity Foundation&lt;/a&gt;, formerly known as Geneva), and IBM enabling Identity Federation via its WebSphere Application Server (&lt;a href='http://www.ibm.com/developerworks/webservices/library/ws-SAMLWAS/index.html?ca=drs-'&gt;Identity federation using SAML and WebSphere software&lt;/a&gt;); 3 of the largest software companies are taking significant steps on this requisite for the interoperability puzzle. Of the remaining other large software companies, Oracle has an handle to the OpenSSO product via the SUN acquisition. But doubt rises about the willingness and commitment of Oracle to OpenSSO - a first sign of this is demonstrated by some broken links to OpenSSO information. From the Google camp I yet miss notion of their plans and products on the Claims-Based Identity subject. I expect that it will either originate from the Open Source community, or donate to it. Who knows, perhaps Google (&lt;span style='font-style:italic'&gt;allthough IBM is a more likely candidate&lt;/span&gt;) would be the ideal new founder for OpenSSO...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-337569767960353995?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/337569767960353995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/05/claims-based-sso-with-saml-20.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/337569767960353995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/337569767960353995'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/05/claims-based-sso-with-saml-20.html' title='Claims-based SSO with SAML 2.0'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3063458062863058957</id><published>2010-05-11T23:23:00.009+02:00</published><updated>2010-05-13T23:18:14.787+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><title type='text'>Unable to recover from a corrupted Publishing infrastructure</title><content type='html'>&lt;div&gt;For a functional extension to the intranet (&lt;span style='font-style:italic;'&gt;enterprise portal&lt;/span&gt;) of a client organization, we needed to  provision a content page to an existing site. A precondition is thus that the Publishing infrastructure is activated within the context of that SharePoint site: at Site level (PublishingSite feature) and Web (PublishingWeb feature). Upon activating the latter we encountered the following error: &lt;span style='color:red'&gt;Provisioning did not succeed. Details: Failed to create the 'Pages' library. OriginalException: The feature failed to activate because a list at 'Pages' already exists in this site.  Delete or rename the list and try activating the feature again.&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Strangly enough: via the SharePoint GUI the Pages library was not visible. Could be that it was set to hidden. But trying to directly navigate via its url merely resulted in a NotFound. Upon opening the site collection in SharePoint Designer, it showed there was a left-over of the Pages library: merely an empty folder, no Forms nor other content. But this presence was in the way of activating the Publishing feature. So we deleted this folder via SPD. And then tried to activate PublishingWeb feature again. This time it progressed a bit further, to stop with the message: &lt;span style='color:red;'&gt;The page you selected contains a list that does not exist.  It may have been deleted by another user&lt;/span&gt;. Inspecting again: the Pages library was correctly available now, including associations with PublishingPage contenttypes. Missing this time was the Style Library documentlibrary. That is, when inspecting via SharePoint GUI. Again looking at filesystem level via SharePoint designer: same situation, Style Library folder present, but empty. Deleted this folder, and retried to activate the PublishingWeb feature. Sadly we kept on running into the error of missing List. Even after manually adding the Style Library; forcefully deactivate and re-activate the PublishingWeb feature. We did not manage to recover from the initial corrupted situation wrt Pages list. Search results on the Web for information on both the error messages gave some hits to problem descriptions, but sadly not to resolutions.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Due to a pressing time schedule, we therefore had to resort to a pragmatic alternative. Deleting the corrupted site collection, and re-creating it. This was a viable approach due to the current nature of the site collection: containing no content yet. But it leaves me with somewhat of a frustrated / disappointed mind. I would rather have seen us able to recover from the incorrect situation, while preserving the site collection.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3063458062863058957?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3063458062863058957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/05/unable-to-recover-from-corrupted.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3063458062863058957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3063458062863058957'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/05/unable-to-recover-from-corrupted.html' title='Unable to recover from a corrupted Publishing infrastructure'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5869206230366526848</id><published>2010-04-21T20:09:00.004+02:00</published><updated>2010-04-21T20:19:02.369+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>A Technical Overview of Duet Enterprise for Microsoft SharePoint and SAP</title><content type='html'>&lt;div&gt;On the Duet Enterprise Team Blog an &lt;a href='http://blogs.technet.com/duetenterprise/archive/2010/04/16/technical-overview-of-duet-enterprise-for-microsoft-sharepoint-and-sap.aspx'&gt;article&lt;/a&gt; is published discussing on high-level the technical architecture of Duet Enterprise, the positioning within a mixed SAP and Microsoft landscape, and the required products versions within these landscapes: SAP NetWeaver 7.02 together with SharePoint Server 2010 Enterprise Edition.&lt;/div&gt;&lt;div&gt;&lt;img src='http://blogs.technet.com/blogfiles/duetenterprise/WindowsLiveWriter/403eef6dc7e3_93C8/clip_image002_2.png'/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5869206230366526848?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5869206230366526848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/04/technical-overview-of-duet-enterprise.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5869206230366526848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5869206230366526848'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/04/technical-overview-of-duet-enterprise.html' title='A Technical Overview of Duet Enterprise for Microsoft SharePoint and SAP'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-2555880897495021459</id><published>2010-04-06T20:08:00.015+02:00</published><updated>2010-07-10T00:45:32.883+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Duet Enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>A perspective from within SAP AG on Duet Enterprise</title><content type='html'>&lt;div&gt;Up until now, most news on and attention given to the new Duet Enterprise proposition seemed to come from Microsoft only; leaving SAP AG rather silent on this subject. I am therefore pleased with a first concrete signal from SAP commenting and committing onto Duet Enterprise. Somya Kapoor from the Duet Enterprise Solution Management Team at SAP recently &lt;a href='http://www.youtube.com/watch?v=7W5ZYzA1HK8&amp;feature=player_embedded'&gt;shared some thoughts from within SAP on the Duet Enterprise proposition&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;!--[if !IE]&gt;--&gt;&lt;object style='height: 344px; width: 425px;'&gt;&lt;param name='movie' value='http://www.youtube.com/v/7W5ZYzA1HK8'&gt;&lt;param name='allowFullScreen' value='true'&gt;&lt;param name='allowScriptAccess' value='always'&gt;&lt;embed src='http://www.youtube.com/v/7W5ZYzA1HK8' type='application/x-shockwave-flash' allowfullscreen='true' allowScriptAccess='always' width='425' height='344'&gt;&lt;/embed&gt;&lt;/object&gt;&lt;!--&lt;![endif]--&gt;&lt;br /&gt;&lt;!--[if IE]&gt;&lt;OBJECT id=movie_player classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=640 height=385&gt;&lt;PARAM NAME="_cx" VALUE="16933"&gt;&lt;PARAM NAME="_cy" VALUE="10186"&gt;&lt;PARAM NAME="FlashVars" VALUE=""&gt;&lt;PARAM NAME="Movie" VALUE="http://www.youtube.com/v/7W5ZYzA1HK8"&gt;&lt;PARAM NAME="Src" VALUE="http://www.youtube.com/v/7W5ZYzA1HK8"&gt;&lt;PARAM NAME="WMode" VALUE="Opaque"&gt;&lt;PARAM NAME="Play" VALUE="0"&gt;&lt;PARAM NAME="Loop" VALUE="-1"&gt;&lt;PARAM NAME="Quality" VALUE="High"&gt;&lt;PARAM NAME="SAlign" VALUE="LT"&gt;&lt;PARAM NAME="Menu" VALUE="-1"&gt;&lt;PARAM NAME="Base" VALUE=""&gt;&lt;PARAM NAME="AllowScriptAccess" VALUE="always"&gt;&lt;PARAM NAME="Scale" VALUE="NoScale"&gt;&lt;PARAM NAME="DeviceFont" VALUE="0"&gt;&lt;PARAM NAME="EmbedMovie" VALUE="0"&gt;&lt;PARAM NAME="BGColor" VALUE="000000"&gt;&lt;PARAM NAME="SWRemote" VALUE=""&gt;&lt;PARAM NAME="MovieData" VALUE=""&gt;&lt;PARAM NAME="SeamlessTabbing" VALUE="1"&gt;&lt;PARAM NAME="Profile" VALUE="0"&gt;&lt;PARAM NAME="ProfileAddress" VALUE=""&gt;&lt;PARAM NAME="ProfilePort" VALUE="0"&gt;&lt;PARAM NAME="AllowNetworking" VALUE="all"&gt;&lt;PARAM NAME="AllowFullScreen" VALUE="true"&gt;&lt;/OBJECT&gt;&lt;![endif]--&gt;&lt;br /&gt;&lt;div style='margin-top:10px;'&gt;Some noticable statements in this short interview:&lt;ul style='margin-top:5px;'&gt;&lt;li &gt;&lt;span style='font-style:italic;'&gt;"Duet Enterprise is primarily focussed on integrating SAP and SharePoint - as opposed with Duet which focussed on integrating SAP and Microsoft Office"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style='font-style:italic;'&gt;"We [SAP] are aiming at customers who have SharePoint deployments, or experiences with it;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style='font-style:italic;'&gt;"We [SAP] want to bring the collaboration expertise of SharePoint into the SAP business processes in the back-end.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-2555880897495021459?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/2555880897495021459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/04/perspective-from-within-sap-ag-on-duet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2555880897495021459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2555880897495021459'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/04/perspective-from-within-sap-ag-on-duet.html' title='A perspective from within SAP AG on Duet Enterprise'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-587625486633441157</id><published>2010-04-01T21:00:00.002+02:00</published><updated>2010-04-01T21:07:59.966+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NetWeaver'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='SSO'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>A compact overview of SSO Technologies supported by SAP NetWeaver for surfacing from .NET based clients</title><content type='html'>&lt;div&gt;Earlier I blogged &lt;a href='http://williamvanstrien.blogspot.com/search/label/SSO'&gt;some&lt;/a&gt; about the area of Single Sign-On in a mixed SAP NetWeaver – Microsoft .NET world. Yesterday Andre Fischer from SAP AG published an up-to-date &lt;a href='http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/18549'&gt;compact overview&lt;/a&gt; on this topic. Recommended reading for those interested in SAP / MS interoperability.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-587625486633441157?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/587625486633441157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/04/compact-overview-of-sso-technologies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/587625486633441157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/587625486633441157'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/04/compact-overview-of-sso-technologies.html' title='A compact overview of SSO Technologies supported by SAP NetWeaver for surfacing from .NET based clients'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-1037854038264363250</id><published>2010-03-31T19:27:00.009+02:00</published><updated>2010-04-01T20:28:44.870+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ObjectModel'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Content Database'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><title type='text'>Efficient batch deletion from SharePoint List without filling up the site RecycleBin</title><content type='html'>&lt;div&gt;For a data management function I need a &lt;span style='font-style:italic;'&gt;performant&lt;/span&gt; way to first delete all items from a SharePoint list, before re-filling it with up-to-date content. Looping through the list and delete each item one-by-one is not acceptable. It would instantiate an internal &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPRequest&lt;/span&gt; object for each single listitem deletion, and take a longer time to complete. The answer to do it time-efficient is to use the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWeb&lt;/span&gt; method &lt;span style='font-family:Courier;font-size:smaller;'&gt;ProcessBatchData()&lt;/span&gt;. You feed this method with a batch string of multiple delete commands to perform in a &lt;span style='font-style:italic;'&gt;single&lt;/span&gt; SharePoint request.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;However, usage of &lt;span style='font-family:Courier;font-size:smaller;'&gt;ProcessBatchData&lt;/span&gt; has the disadvantage that all deleted items are put in the SharePoint &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPSite&lt;/span&gt; Recycle Bin. Kinda ridiculous for a programmatic batch-based deletion. And because of the larger number of deleted items (the reason for doing the deletion batch-based...), it makes the Recycle Bin pretty much unworkable thus useless for UI initiated restore of manual deleted content items.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;SharePoint does not provide an elegant way to prevent this standard behaviour. Elsewhere on the web it is suggested to temporarily disable the Recycle Bin at &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWebApplication&lt;/span&gt; level. This however suffers from 2 drawbacks:&lt;ol style='margin-top:5px;'&gt;&lt;li&gt;The current user needs to have the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPFarm&lt;/span&gt; administrator role. This is unlikely for a functional management role, and unacceptable from a security viewpoint.&lt;/li&gt;&lt;li&gt;Disabling the Recycle Bin at webapplication level has a nasty side-effect. It namely &lt;span style='font-style:italic;'&gt;clears all&lt;/span&gt; Recycle Bins in the webapplication. Not only that of your current context site and sitecollection, but all of them in the webapplication. This effectively destroys the Recycle Bin backup-purpose for manual deleted items; and it is thus not isolated to your scope but affects the entire webapplication. This is functional unacceptable.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;So if it's not possible to prevent the batch deleted items from appearing in the Recycle Bin, it is then required to delete them there afterwards. This could be done via a call to &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPContext.Current.Web.RecycleBin.DeleteAll()&lt;/span&gt;. But this clears the entire Recycle Bin, still potential removing too much. What we need is an approach to delete &lt;span style='font-style:italic;'&gt;exactly&lt;/span&gt; those items from the Recycle Bin that were put there as result of the list batch-deletion. The Recycle Bin has a different API interface as regular SharePoint lists. Usage of &lt;span style='font-family:Courier;font-size:smaller;'&gt;ProcessBatchData&lt;/span&gt; to delete the same relevant items from the Recycle Bin is not possible. But it is undesirable to first clear the SharePoint list via a batch-deletion, and next be forced to loop-based remove the same items from the Recycle Bin. Luckily the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPRecycleBinItemCollection&lt;/span&gt; class exposes its own method to issue a batch deletion: &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPRecycleBinItemCollection.Delete(GUID[])&lt;/span&gt;. It has a different method signature, which requires you to first determine the GUID per &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPRecycleBinItem&lt;/span&gt;. Also you must take care of keeping the chunck of deletion below a thresshold. SharePoint namely locks the database tables when executing the Recycle Bin batch deletion, which hangs the SharePoint server upon deleting a larger set. The Recycle Bin cleanup/reset can be done asynchronous in the background, doing it chunk based.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;The code for efficient batch deletion all items of a list, and next clear the same deleted items from the Recycle Bin is as follows:&lt;div align='left' style='width:100%;margin-top:5pt;font-size:9pt;font-weight:bold;font-style:italic'&gt;&lt;br /&gt;1. Control for time-efficient purge all items from SharePoint List&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_77IVwtGj8s0/S7TlSF84yHI/AAAAAAAAAIQ/7NUfiwNzj4o/s1600/DeleteFromListBatch.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 179px;" src="http://3.bp.blogspot.com/_77IVwtGj8s0/S7TlSF84yHI/AAAAAAAAAIQ/7NUfiwNzj4o/s320/DeleteFromListBatch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5455237147650476146" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align='left' style='float:left;width:100%;margin-top:5pt;font-size:9pt;font-weight:bold;font-style:italic'&gt;&lt;br /&gt;2. Cleanup the Recycle Bin in the background&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_77IVwtGj8s0/S7TllyMkZJI/AAAAAAAAAIY/KIi4lBOVXbo/s1600/DeleteFromRecycleBinInBackground.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://2.bp.blogspot.com/_77IVwtGj8s0/S7TllyMkZJI/AAAAAAAAAIY/KIi4lBOVXbo/s320/DeleteFromRecycleBinInBackground.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5455237485944923282" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-1037854038264363250?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/1037854038264363250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/03/efficient-batch-deletion-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1037854038264363250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/1037854038264363250'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/03/efficient-batch-deletion-from.html' title='Efficient batch deletion from SharePoint List without filling up the site RecycleBin'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_77IVwtGj8s0/S7TlSF84yHI/AAAAAAAAAIQ/7NUfiwNzj4o/s72-c/DeleteFromListBatch.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3109767508408296541</id><published>2010-03-29T23:21:00.016+02:00</published><updated>2010-03-29T23:36:00.325+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebPart'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Beware: usage of ImageButton can cause a 401 NotAuthorized in external facing site</title><content type='html'>&lt;div&gt;In one of our custom webparts we are using the ASP.NET &lt;span style='font-family:Courier;font-size:smaller;'&gt;ImageButton&lt;/span&gt; class. Instead of setting the image-source via the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ImageUrl&lt;/span&gt; property, we specify the image via CSS. All works fine. That is, until we "&lt;span style='font-style:italic;'&gt;got anonymous&lt;/span&gt;". Suddenly when browsing to a page with our WebPart on it, the (acceptance test) end-user was confronted with the IE loginbox. Via Fiddler (how I love this http debugging tool) I quickly detected the indirect cause: IE issued an HTTP GET for the URL of the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Pages&lt;/span&gt; document library. In an authenticated mode this will pass unnoticed. But for an anonymous user the particular HTTP GET will result in a &lt;span style='font-family:Courier;font-size:smaller;'&gt;401 NotAuthorized&lt;/span&gt; on trying to directly access the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Pages&lt;/span&gt; folder URL.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;So the next question was what caused the browser to issue this request for the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Pages&lt;/span&gt; URL? Well, this was the direct result of our on intention lack of setting the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ImageUrl&lt;/span&gt; property, in favor of flexible CSS specification. The resulting HTML is then something like:&lt;/div&gt;&lt;div style='margin-top:10px;text-align:center;'&gt;&lt;span style='font-family:Courier;font-size:smaller;'&gt;&amp;lt;input type="image" name="&amp;nbsp;...&amp;nbsp;" class="ImgClass" &lt;span style='color:blue;'&gt;src=""&lt;/span&gt;&amp;nbsp;...&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;IE (6) browsers  interpretate the empty image-src attribute as referring to the relative root of the webpage.  In our case with the WebPart placed on a publishing page, this translates to a request for the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Pages&lt;/span&gt; folder URL. FireFox and Chrome do not exhibit this behavior, they simple ignore the empty source attribute as it should. The solution for preventing IE to request the NotAuthorized &lt;span style='font-family:Courier;font-size:smaller;'&gt;Pages&lt;/span&gt; URL is to set a non-empty value for the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ImageUrl&lt;/span&gt; property. It’s not even required to point to an existent image file. In that case the HTTP request will silently result in a &lt;span style='font-family:Courier;font-size:smaller;'&gt;404 NotFound&lt;/span&gt; HTTP response. And since the image is set via CSS, the visual effect in the UI remains unnoticed for the end-user. I dislike polluting the HTTP transfer between browser and server with requests which are known before to fail. Therefore I point to &lt;span style='font-family:Courier;font-size:smaller;'&gt;ImageUrl&lt;/span&gt; to the current and available image-file. Via CSS it is then still possible to later flexible modify the displayed image.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3109767508408296541?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3109767508408296541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/03/usage-of-imagebutton-can-cause-401.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3109767508408296541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3109767508408296541'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/03/usage-of-imagebutton-can-cause-401.html' title='Beware: usage of ImageButton can cause a 401 NotAuthorized in external facing site'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-6576507220036268379</id><published>2010-02-23T19:33:00.027+01:00</published><updated>2010-02-24T23:53:20.235+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath Forms Server'/><title type='text'>FormsService SSP in farm holds on to previous version of Feature re-deployed InfoPath Form</title><content type='html'>&lt;div&gt;&lt;a href='http://williamvanstrien.blogspot.com/2010/01/automatic-publish-infopath-forms-via.html'&gt;Earlier&lt;/a&gt; I blogged about the ALM manner to develop and deploy InfoPath forms. One major benefit of this approach is that the InfoPath forms are considered as first-class source artifacts in the development environment and project, just as ‘regular’ source code (C#, XML, .js, css). An even bigger benefit is upon deployment: no need for manual actions to publish the form templates to your deployed and provisioned SharePoint application, it’s all done automatic in the context of a feature activation.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;SharePoint out-of-the-box provides the &lt;span style='font-family:Courier;font-size:smaller;'&gt;XsnFeatureReceiver&lt;/span&gt; class to provide the InfoPath Form Templates publishing support. However, the functionality of this standard class is not enough for real-life deployment scenarios. I ran into a few missing parts before, which I &lt;a href='http://williamvanstrien.blogspot.com/2010/01/automatic-publish-infopath-forms-via.html'&gt;handled&lt;/a&gt; by extending and augmenting the &lt;span style='font-family:Courier;font-size:smaller;'&gt;XsnFeatureReceiver&lt;/span&gt; class. This week I was confronted with another issue. After a re-deployment with updated InfoPath forms, the earlier deployed forms were still active. That is, when opening them in the browser. When opening in InfoPath client, the new version was applied. Thus the deployment to SharePoint server was performed, but somehow for InfoPath Forms Services context the earlier deployed version per InfoPath form remained active. I did not experience this effect in my local single-server local development image. But when doing a re-deployment to the distributed test farm-environment, the issue manifests itself.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;I inspected the managed forms templates administration of the FormsService SSP, and discovered that still the initial deployed versions were administered. And after uninstalling the &lt;span style='font-family:Courier;font-size:smaller;'&gt;InfoPathInfrastructure&lt;/span&gt; feature, the InfoPath form templates in &lt;span style='font-family:Courier;font-size:smaller;'&gt;FormsService&lt;/span&gt; were not cleared. This obstructs the activation of the new versions of the forms upon re-deployment. As solution I extended my &lt;span style='font-family:Courier;font-size:smaller;'&gt;InfoPathInfrastructure feature&lt;/span&gt; to also make sure the InfoPath forms that it installed, are removed from the FormsService SSP upon uninstalling the feature.&lt;/div&gt;&lt;div style='margin-top:10px;width:100%;float:left;'&gt;&lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/S4WsDpFi-TI/AAAAAAAAAH4/XbH2yCSWXjU/s1600-h/RemoveFormTemplatesInFormsService.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 133px;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/S4WsDpFi-TI/AAAAAAAAAH4/XbH2yCSWXjU/s320/RemoveFormTemplatesInFormsService.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5441944903315814706" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;With this fix, I’m able to deploy and activate new versions of the InfoPath forms to the distributed target SharePoint farm environment (test, staging, production) for usage via InfoPath Forms Services. And still conform ALM principles.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-6576507220036268379?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/6576507220036268379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/02/formsservice-in-farm-holds-on-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6576507220036268379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6576507220036268379'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/02/formsservice-in-farm-holds-on-to.html' title='FormsService SSP in farm holds on to previous version of Feature re-deployed InfoPath Form'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_77IVwtGj8s0/S4WsDpFi-TI/AAAAAAAAAH4/XbH2yCSWXjU/s72-c/RemoveFormTemplatesInFormsService.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3892171585001700120</id><published>2010-01-29T20:15:00.012+01:00</published><updated>2010-01-29T22:23:02.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom development'/><title type='text'>SharePoint [2010] as development, composition + application platform</title><content type='html'>&lt;div&gt;I consider SharePoint having 2 distinct faces:&lt;ol style='margin-top:2px';&gt;&lt;li&gt;It's in itself an application, with lot's of end-user oriented functionality. This is true for the foundation WSS, and significant more for the licensed version MOSS 2007&lt;/li&gt;&lt;li&gt;It's a rich development and runtime application platform, to host your own custom developed applications.&lt;/li&gt;&lt;/ol&gt;Being primarily development-oriented, it will be clear that personally I like SharePoint best for the second role.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;I'm not alone on this. More and more custom company-internal applications are based on and within the SharePoint platform. SharePoint comes out-of-the-box with a well-filled toolbox of both technical as functional building blocks. Developing custom SharePoint applications is therefore a combination of composing and customizing OOTB SharePoint building blocks, and augmenting it with custom developed functionality in which the SharePoint platform does not standard delivers. This implies a significant mindset switch for [old-school] application developers. Instead of the default decision to custom build all application parts, the SharePoint best-practice approach is to first consider the OOTB building blocks. Can you deliver the custom-requested functionality on &lt;span style='font-style:italic;'&gt;sufficient level&lt;/span&gt; via the application of the standard SharePoint blocks? If so, choose that path. This composition-based approach will gain you in the initial application development stage. But even more it will be cost-benificial within the application maintenance period. It's better to have Microsoft fix and improve on standard building blocks, than have to do it yourself on your own proprietary ones. Of course, this principle can especially be applied on the more technical functionalities. And this gives you more time and relative budget to focus on the differential functionality for your company.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;a href='http://www.davidchappell.com/about/index.php'&gt;David Chappell&lt;/a&gt; has written a conceptual white paper highlighting the application platform aspects of the forthcoming SharePoint 2010. You can download it on the Microsoft site, &lt;a href='http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=5184cb27-98d9-4cc0-bb0b-4b24d5b62db6;'&gt;SharePoint 2010: Developer Platform White Paper&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3892171585001700120?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3892171585001700120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/sharepoint-2010-as-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3892171585001700120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3892171585001700120'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/sharepoint-2010-as-development.html' title='SharePoint [2010] as development, composition + application platform'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-364721043262774586</id><published>2010-01-26T07:00:00.002+01:00</published><updated>2010-01-29T22:23:58.623+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web.config'/><category scheme='http://www.blogger.com/atom/ns#' term='Publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='PageLayout'/><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><title type='text'>AllUsersWebPart and SPWebApplication.ApplyWebConfigModifications don't match</title><content type='html'>&lt;div&gt;&lt;ul&gt;&lt;li&gt;In a &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt;, I apply the &lt;span style='font-family:Courier;font-size:smaller;'&gt;AllUsersWebPart&lt;/span&gt; construct to automatically add default webparts to all publishing pages based on the PageLayout &lt;span style='font-family:Courier;font-size:smaller;'&gt;File&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;In a &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt;, I utilize the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWebConfigModification&lt;/span&gt; class to add web.config modifications&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;When done in separate &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt;s, both constructs operate successfully. However, when included within the same &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; activation, the invocation of &lt;span style='font-family:Courier;font-size:smaller;'&gt;ApplyWebConfigModifications&lt;/span&gt; method results in a &lt;span style='font-family:Courier;font-size:smaller;'&gt;SecurityException&lt;/span&gt;:&lt;/div&gt;&lt;div style='margin-top:5px;margin-left:10px;'&gt;&lt;span style='font-family:Courier;font-size:smaller;'&gt;Access Denied&lt;br /&gt;at Microsoft.SharePoint.Administration.SPPersistedObject.Update()&lt;br /&gt;at Microsoft.SharePoint.Administration.SPWebApplication.ApplyWebConfigModifications()&lt;br /&gt;at Microsoft.SharePoint.Administration.SPWebService.ApplyWebConfigModifications()&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;It looks as if internally SharePoint somehow puts a lock on the Administration persistent object. I tried to verify my suspicion via Reflector, but not surprisingly this internal code is obfuscated. The runtime error only manifests itself when the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; is (re)activated via the GUI. The &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; activation via &lt;span style='font-family:Courier;font-size:smaller;'&gt;stsadm&lt;/span&gt; reports no problem, and successfully performs the deployment work.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Still, I want to hold on to the idea of one single self-contained &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; to deploy all the required parts. And I want to be able to turn the Feature on and off interactively via the SharePoint GUI (&lt;span style='font-style:italic;'&gt;so that I can also operate the feature remote, without access to the deployment server&lt;/span&gt;). A resolution is to apply another approach to provision the default webparts on the pagelayouts. Besides the usage of &lt;span style='font-family:Courier;font-size:smaller;'&gt;AllUsersWebPart&lt;/span&gt;, it is also possible to directly include the webpart specifications in the &lt;span style='font-family:Courier;font-size:smaller;'&gt;PageLayout&lt;/span&gt; file itself:&lt;/div&gt;&lt;div style='margin-top:10px;width:100%;'&gt;&lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/S1zIEuZ_gWI/AAAAAAAAAHw/l-17eYuXFZ0/s1600-h/WebPartInPageLayout.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 92px;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/S1zIEuZ_gWI/AAAAAAAAAHw/l-17eYuXFZ0/s320/WebPartInPageLayout.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5430435234204057954" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:10px;clear:both;'&gt; With this construction, the invocation of &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWebApplication.ApplyWebConfigModifications&lt;/span&gt; method is done successfully. And as a bonus, also another problem is prevented; that of magically duplicating the default webparts provisioned via &lt;span style='font-family:Courier;font-size:smaller;'&gt;AllUsersWebPart&lt;/span&gt; upon &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; re-activation.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;A final word of caution. With this approach I at first encountered another problem. When editing on a created publishing page the properties of the default WebPart provisioned via the PageLayout file, SharePoint displayed an error warning in the edit toolpane, "a web part you attempted to change is either invalid or has been removed by another user". Although the net effect of the WebPart settings is simple done, this is not very trustwordy towards the Web Content Manager. Hard to explain that they can just ignore this warning. Before deciding to then have to abandon the approach, I re-examed the default WebPart specification in the PageLayout file to see if anything there could be causing SharePoint to suspect a concurrent update. And yes there was, 'thanx' to the automatic editing behaviour of Visual Studio. When you add a control within an .aspx file, Visual Studio automatically add a default 'ID' property to the control. For the default WebPart however this is not needed, the property is actually set when creating a publishing page off this &lt;span style='font-family:Courier;font-size:smaller;'&gt;PageLayout&lt;/span&gt;. But the mere presence of it in the default part results in SharePoint detecting a concurrent update. So remember to don't include the 'ID' property within WebPart specifications included within PageLayout files.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-364721043262774586?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/364721043262774586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/alluserswebpart-and-spwebapplicationapp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/364721043262774586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/364721043262774586'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/alluserswebpart-and-spwebapplicationapp.html' title='AllUsersWebPart and SPWebApplication.ApplyWebConfigModifications don&apos;t match'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_77IVwtGj8s0/S1zIEuZ_gWI/AAAAAAAAAHw/l-17eYuXFZ0/s72-c/WebPartInPageLayout.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5193194402857041650</id><published>2010-01-20T07:15:00.003+01:00</published><updated>2010-01-21T23:12:37.242+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Administration'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Installation'/><title type='text'>Tip: psconfig saved my local SharePoint environment</title><content type='html'>&lt;div&gt;Once in a while, your local SharePoint installation may become corrupted. It happened to me today. I experienced diverse problems and symptons. Most noticable the malfunctioning of SharePoint search: crawling no longer worked, connect to the SharePoint Search service gave a "not able to access remote service". And when I inspected the eventlog, I detected several Office Server Search errors:&lt;/div&gt;&lt;div style='margin-top:10px;width:100%;'&gt;&lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/S1dePFVeMJI/AAAAAAAAAHo/GxOcUfby2ls/s1600-h/SearchIndexError.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 234px;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/S1dePFVeMJI/AAAAAAAAAHo/GxOcUfby2ls/s320/SearchIndexError.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5428911489041707154" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;A seemingly total other problem was upon site collection creation via a custom site definition. This site definition applies a custom &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWebProvisioningProvider&lt;/span&gt;. Here I encountered a problem in loading the assembly of that provider, due to apparently missing referenced (system) assemblies.&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;When I next activated custom &lt;span style='font-family:Courier;font-size:smaller;'&gt;FeatureReceiver&lt;/span&gt; code that programmatically manages the Search content sources, SharePoint threw a &lt;span style='font-family:Courier;font-size:smaller;'&gt;Microsoft.Office.Server.Search.Administration.DeletedConcurrencyException&lt;/span&gt; with message &lt;span style='font-style:italic;'&gt;Object e26da097-50ff-4386-b3f6-2b2b30f73b96 not found&lt;/span&gt;. This was the start to fixing my environment... I found via searching on &lt;span style='font-family:Courier;font-size:smaller;'&gt;DeletedConcurrencyException&lt;/span&gt; a useful advice to run the SharePoint admin tool &lt;span style='font-family:Courier;font-size:smaller;'&gt;psconfig&lt;/span&gt;:&lt;/div&gt;&lt;div style='margin-top:10px;font-style:italic;text-align:center;width:95%;border-style:solid;border-width:thin;padding:5pt;float:left;'&gt;psconfig -cmd upgrade -inplace b2b -wait&lt;/div&gt;&lt;div style='margin-top:5px;float:left;'&gt;And indeed, after doing that magically the above described problems have vanished. That saved my day, I already feared that I had to re-install my local SharePoint environment.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5193194402857041650?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5193194402857041650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/psconfig-saved-my-local-sharepoint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5193194402857041650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5193194402857041650'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/psconfig-saved-my-local-sharepoint.html' title='Tip: psconfig saved my local SharePoint environment'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_77IVwtGj8s0/S1dePFVeMJI/AAAAAAAAAHo/GxOcUfby2ls/s72-c/SearchIndexError.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3526763606426233</id><published>2010-01-19T07:00:00.002+01:00</published><updated>2010-01-19T07:00:00.627+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='ObjectModel'/><category scheme='http://www.blogger.com/atom/ns#' term='Site Definition'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><title type='text'>PublishingWeb.IsPublishingWeb malfunctions on custom site definition</title><content type='html'>&lt;div&gt;I typically apply a &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt;-based approach for the provisioning of a SharePoint site into a full-functioning application . I prefer this above putting everything within a custom site definition. I'm in good company with my resistance against (overly complex) &lt;span style='font-family:Courier;font-size:smaller;'&gt;Onet.xml&lt;/span&gt;'s [&lt;span style='font-style:italic;'&gt;Andrew Connel, &lt;a href='http://www.andrewconnell.com/blog/archive/2008/02/15/You-dont-need-to-create-site-definitions.aspx'&gt;You don't need to create site definitions&lt;/a&gt;, Joel Oleson, &lt;a href='http://www.sharepointjoel.com/Lists/Posts/Post.aspx?ID=117'&gt;Do you Really Need to Create Custom Site Definitions?&lt;/a&gt;&lt;/span&gt;]. I actually reuse the same site provisioning engine functionality within multiple SharePoint projects and applications. The reuse is made possible by specifying the provision actions via an XML feed file. Via this, the engine can be instructed to provision structure (&lt;span style='font-family:Courier;font-size:smaller;'&gt;Lists&lt;/span&gt;, &lt;span style='font-family:Courier;font-size:smaller;'&gt;Libraries&lt;/span&gt;), content (publishing pages, &lt;span style='font-family:Courier;font-size:smaller;'&gt;ListItems&lt;/span&gt;), and configuration (web.config via &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWebConfigModification&lt;/span&gt;, and &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb&lt;/span&gt; + &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWeb&lt;/span&gt; properties).&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;With respect to the latter, I discovered that the OOTB &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb.IsPublishingWeb&lt;/span&gt; sometimes plays tricks on you. Let me explain. In the provision engine I've implemented functionality to set diverse navigation settings: &lt;span style='font-family:Courier;font-size:smaller;'&gt;IncludeSubSites&lt;/span&gt;, &lt;span style='font-family:Courier;font-size:smaller;'&gt;NavigationShowSiblings&lt;/span&gt;, &lt;span style='font-family:Courier;font-size:smaller;'&gt;InheritGlobalNavigation&lt;/span&gt;, and so on. These properties can only be set on publishing webs, and are in the SharePoint Object API available via a &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb&lt;/span&gt; instance. In the engine code I first do a check whether the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWeb&lt;/span&gt; on which the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; is activated, is actually a &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb&lt;/span&gt;. And only then via &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb.GetPublishingWeb&lt;/span&gt; access a valid wrapper reference, and set the navigation properties.&lt;/div&gt;&lt;div style='margin-top:10px'&gt;This all worked fine in situations in which I applied the provision engine afterwards on an already created Publishing site collection. In my current project I do it slightly different. I've implemented a minimal site definition, and within the context of it activate per web in the created site topology the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Publishing&lt;/span&gt; feature, and next execute the provision engine. In this setup, the navigation settings appeared to be ignored by the provision engine. When I debugged the provision execution, I discovered that &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb.IsPublishingWeb&lt;/span&gt; returned &lt;span style='font-family:Courier;font-size:smaller;'&gt;false&lt;/span&gt; for all webs in the site topology. Very strange, since I made sure to first activate the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Publishing&lt;/span&gt; feature...&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;I ran into the forum-thread &lt;a href='http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/ecb7abe3-c5e2-43c3-9f7a-2a725dc379c9'&gt;IsPublishingWeb() - what does it REALLY check for?&lt;/a&gt; posting a question on this issue. And followed up on the advice given there: implement an own &lt;span style='font-family:Courier;font-size:smaller;'&gt;SharePointHelper.IsPublishingWeb&lt;/span&gt; method to determine whether the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPWeb&lt;/span&gt; instance is valid for being wrapped into a &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb&lt;/span&gt; instance.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;BTW: My own experiences learn that it is not due the asynchronous site creation behaviour. Also when later via site settings (de)activating the provision engine feature, &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb.IsPublishingWeb&lt;/span&gt; remains returning false, despite that the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Publishing&lt;/span&gt; feature is activated on the (sub)web. It looks more as if &lt;span style='font-family:Courier;font-size:smaller;'&gt;PublishingWeb.IsPublishingWeb&lt;/span&gt; is somehow dependent on something that is set behind the curtains via OOTB &lt;span style='font-family:Courier;font-size:smaller;'&gt;Publishing&lt;/span&gt; site definitions.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3526763606426233?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3526763606426233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/publishingwebispublishingweb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3526763606426233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3526763606426233'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/publishingwebispublishingweb.html' title='PublishingWeb.IsPublishingWeb malfunctions on custom site definition'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-6463503716829459191</id><published>2010-01-15T07:00:00.009+01:00</published><updated>2010-08-10T21:43:27.109+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ContentType'/><category scheme='http://www.blogger.com/atom/ns#' term='SiteColumn'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='CAML'/><title type='text'>Aggregate the values from an InfoPath repeating section for data administration</title><content type='html'>&lt;div&gt;A common requirement for setting up (web)forms is to enter multiple rows of similar information. For example, entering the name(s) of your child(ren) for an holiday booking. The InfoPath &lt;span style='font-family:Courier;font-size:smaller;'&gt;Repeating Section&lt;/span&gt; enables an intuitive usage model for this. Initial the form displays only 1 section for data entrance. Via a link or button the user can on-the-fly expand the form with more occurrences of that same section.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Question is how best to administer the entered data from the repeating section in a SharePoint library. Is this a Master/Slave relationship? Or should it be considered simple as embedded in the form data self? The former requires a relation data model employed within the SharePoint information architecture. Although possible, this is not the typical SharePoint model which is namely to administrate the entity data in a single &lt;span style='font-family:Courier;font-size:smaller;'&gt;List&lt;/span&gt; or &lt;span style='font-family:Courier;font-size:smaller;'&gt;Library&lt;/span&gt;. However, for the second alternative it is still required to potentially administrate multiple values per field in the repeating section.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;SharePoint supports this via the concept of &lt;span style='font-family:Courier;font-size:smaller;'&gt;AggregateFunction&lt;/span&gt; at &lt;span style='font-family:Courier;font-size:smaller;'&gt;Field&lt;/span&gt; level. To collect the data from a repeating section, specify &lt;span style='font-family:Courier;font-size:smaller;'&gt;aggregate="merge"&lt;/span&gt; for the field within the InfoPath form template&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;When explicitly self-provision the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt; and &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; (&lt;span style='font-style:italic;'&gt;&lt;a href='http://williamvanstrien.blogspot.com/2010/01/administrate-data-from-infopath-form-in.html'&gt;Administrate data from InfoPath form in a self-provisioned ContentType&lt;/a&gt;&lt;/span&gt;), you ran into a problem here. The FieldSpecification CAML currently does not allow the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Aggregate&lt;/span&gt; attribute as in:&lt;br/&gt;&lt;br/&gt;&lt;span style='margin-left:10px;font-family:Courier;'&gt;&amp;lt;FieldRef &lt;br/&gt;&amp;nbsp;&amp;nbsp;ID="{5e046132-9284-4322-b1c7-9a742d60270e}" &lt;br/&gt;&amp;nbsp;&amp;nbsp;Name="FirstNameChild" &lt;br/&gt;&amp;nbsp;&amp;nbsp;ReadOnly="TRUE" &lt;br/&gt;&amp;nbsp;&amp;nbsp;Node="/my:myFields/my:group/my:Children/my:FirstNameChild" /&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;SharePoint will fail the activation of your &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; with the error message: &lt;span style='font-family:Courier;font-size:smaller;color:red;'&gt;The 'Aggregation' attribute is not allowed&lt;/span&gt;.&lt;br/&gt; The remedie is to skip the 'Aggregate' attribute from the CAML specification, and afterwards add it via an &lt;span style='font-family:Courier;font-size:smaller;'&gt;EventReceiver&lt;/span&gt; to the provisioned &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPField&lt;/span&gt; in the &lt;span style='font-family:Courier;font-size:smaller;'&gt;RootWeb&lt;/span&gt;:&lt;br/&gt;&lt;span style='font-family:Courier;'&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;SPField aggregateField = site.RootWeb.Fields[new Guid("{5e046132-9284-4322-b1c7-9a742d60270e}")];&lt;br/&gt;&amp;nbsp;&amp;nbsp;aggregateField.AggregationFunction = "merge";&lt;br/&gt;&amp;nbsp;&amp;nbsp;aggregateField.Update();&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-6463503716829459191?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/6463503716829459191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/aggregate-values-from-repeating-section.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6463503716829459191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6463503716829459191'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/aggregate-values-from-repeating-section.html' title='Aggregate the values from an InfoPath repeating section for data administration'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-5334319210756212045</id><published>2010-01-13T07:00:00.002+01:00</published><updated>2010-08-10T21:42:55.651+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ContentType'/><category scheme='http://www.blogger.com/atom/ns#' term='SiteColumn'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><title type='text'>Administrate data from InfoPath form in a self-provisioned ContentType</title><content type='html'>&lt;div&gt;When registrating via &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSNFeatureReceiver&lt;/span&gt; an InfoPath Form Template in a SharePoint sitecollection, automatically a &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; and the associated &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt; are provisioned. This &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; enables promotion of the data entered via the form to a SharePoint library. However, I prefer to apply explicit self-provisioned &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; and &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt; for the data administration. The rationale is to have full control over the created information architecture entities. In the automatic created &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt;, the ID is arbitrary and thus differerent accross (re)deployments and environments. This hampers the content deployment process between environments. And at rolling out an upgrade of the InfoPath form template in the same site collection, a new version of the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; is provisioned with potential another ID. The automatic provisioned &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt; do not expose this particular problem. Their IDs are namely contained in the InfoPath form template, and therefore remain identical accross (re)deployments. But the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt; have their own issues. Most noticable is a &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumn&lt;/span&gt; with type &lt;span style='font-family:Courier;font-size:smaller;'&gt;(Multi)Lookup&lt;/span&gt;. This cannot be correctly provisioned via a CAML FieldSpecification only, but requires a fix afterwards (&lt;span style='font-style:italic;'&gt;&lt;a href='http://www.sharepointnutsandbolts.com/2007/04/sample-code-creating-list-based-site.html'&gt;Creating Lookup columns as a feature&lt;/a&gt;&lt;/span&gt;). Another problem that both the automatic provisioned &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt; and &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; suffer of, is when there are changes in the definiton while the entity is already in use. To propagate the changes at the sitecollection-defined entities to their usage at &lt;span style='font-family:Courier;font-size:smaller;'&gt;List/Library&lt;/span&gt; level requires some afterwards fix via custom code.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Because of these issues I prefer to explicit self-provision both the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt; and the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; for administrating the forms data. You then control the ID of the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt;, you can fix the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Lookup&lt;/span&gt;-relationships for &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt;, and you can propagate changes within the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; to all &lt;span style='font-family:Courier;font-size:smaller;'&gt;List/Libraries&lt;/span&gt; which already use the type. It costs some extra development time, but it surely pays off upon repeated full-automic deployments, and accross environments.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-5334319210756212045?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/5334319210756212045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/administrate-data-from-infopath-form-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5334319210756212045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/5334319210756212045'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/administrate-data-from-infopath-form-in.html' title='Administrate data from InfoPath form in a self-provisioned ContentType'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3270178609192393638</id><published>2010-01-11T07:00:00.001+01:00</published><updated>2010-01-11T07:00:02.870+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code structure'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath Forms Server'/><title type='text'>Server-side generation of InfoPath email</title><content type='html'>&lt;div&gt;In a SharePoint based application, we utilize InfoPath Forms Server to serve InfoPath forms. The reason to apply InfoPath are the well-known: to enable business itself to design and maintain the forms, within a rich designer tool [the InfoPath designer]. To make that viable, a design principle is to keep the forms as slim and simple as possible. Meaning, no (complex) business logic embedded in the forms, no code behind, no web services invocation; just restrict to form input and validation. Another advantage of this restricted InfoPath usage, is that business can itself directly deploy the forms. These type of forms do not require &lt;span style='font-family:Courier;font-size:smaller;'&gt;FullTrust&lt;/span&gt;, nor is it needed to approve and activate them by IT operations in central admin.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;A requirement is to email the forms; to a functional mailbox, and conditionally to the end-user him/herself. The latter is flagged by an option on the form. A management requirement is that the mailbox per form type must be configurable, without need to modify the forms. The only allowed management actions on the form level are for altering data collection and form display/layout.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;InfoPath provides standard functionality to automatically email the form upon submit. However, because the destination functional mailbox may not be hardcoded in the form (the management requirement); and because of the conditional email copy to end-user would result in a more complex submit option; I rejected that solution approach. Instead I opt for a setup in which the form email handling is done via server side code. The high level design:&lt;ul style='margin-top:5px;'&gt;&lt;li&gt;associate an &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPItemEventReceiver&lt;/span&gt; for the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ItemAdded&lt;/span&gt; event of new instances of the Form &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt;. The &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPItemEventReceiver&lt;/span&gt; can either be associated at the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentType&lt;/span&gt; definition, or per &lt;span style='font-family:Courier;font-size:smaller;'&gt;FormLibrary&lt;/span&gt;&lt;/li&gt;&lt;li&gt;The &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPItemEventReceiver&lt;/span&gt; handles the emailing of each new added form. One to the configurable functional mailbox. This setting can thus be server side retrieved and applied, and it can be managed without need to modify the form for this. And if the end-user selected so in the form, then also send a copy to the end-user mailbox. This conditional logic can easily be developed within the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPItemEventReceiver&lt;/span&gt; handling&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;To set up the email-version of a submitted form, it is needed to retrieve the form data, and transform that into an email body-message. Design decision here is to apply the same view translation as embedded within the source form template. Rationale for that decision is that the email layout always will correspond with the displayed form layout. In that context, it is desired to retrieve the view stylesheet directly from the source form template self. Then the email layout will remain to automatically follow the form layout, irrespective of changes made in the form layout by business. With this, the steps to setup the email body are:&lt;ol style='margin-top:5px;'&gt;&lt;li&gt;read in the xmfile associated with the added form item&lt;/li&gt;&lt;li&gt;retrieve the &lt;span style='font-style:italic;'&gt;mso-infoPathSolution&lt;/span&gt; processing instruction, and parse the name of the source form template&lt;/li&gt;&lt;li&gt;download the source form template, and extract the view stylesheet from the cabinet container&lt;/li&gt;&lt;li&gt;cache the relation &amp;lt;&lt;span style='font-style:italic;'&gt;name source form template, view&lt;/span&gt;&amp;gt; for later added forms the view can directly be found without need to get it from the source form template &lt;/li&gt;&lt;li&gt;apply the view stylesheet to transform the data of the xmlfile into html&lt;/li&gt;&lt;/ol&gt;The result is an email message in the same layout as the form rendering within InfoPath Forms Server. &lt;span style='font-style:italic;'&gt;Warning:&lt;/span&gt; typically the resulting message is too large to be correctly handled by &lt;span style='font-family:Courier;font-size:smaller;'&gt;SPUtily.SendMail&lt;/span&gt;, so best to apply &lt;span style='font-family:Courier;font-size:smaller;'&gt;SmptClient&lt;/span&gt; instead for sending the email.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3270178609192393638?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3270178609192393638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/server-side-generation-of-infopath.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3270178609192393638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3270178609192393638'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/server-side-generation-of-infopath.html' title='Server-side generation of InfoPath email'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-7615065745482212903</id><published>2010-01-07T07:00:00.001+01:00</published><updated>2010-01-07T21:19:42.192+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath Forms Server'/><title type='text'>Tip: submit form via InfoPath client when InfoPath Forms Server submit reports a problem</title><content type='html'>&lt;div&gt;&lt;h3 style='font-size:110%;'&gt;Context:&lt;/h3&gt;Upon submit of a form via InfoPath Forms Server, encounter the InfoPath error &lt;span style='font-style:italic;color:red;'&gt;"An error occurred while the form was being submitted"&lt;/span&gt;. That's it, no more error details displayed, nor to be found within the logging.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Problem analysis&lt;/h3&gt;So, how to detect what is the concrete problem cause? &lt;span style='font-weight:bold;'&gt;Tip:&lt;/span&gt; try to submit the same form directly via the InfoPath designer client. If the problem also occurs within this host context, you can here view more error details. In my situation, the error details displayed &lt;span style='font-style:italic;'&gt;"A value in the form may be used to specify the file name. If you know the value in the form that specifies the file name, revise it and try again. Otherwise, contact the author of the form template"&lt;/span&gt;. Translation, I forgot to specify a filename pattern within the submit options to make it unique.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-7615065745482212903?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/7615065745482212903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/tip-submit-form-via-infopath-client.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7615065745482212903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/7615065745482212903'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/tip-submit-form-via-infopath-client.html' title='Tip: submit form via InfoPath client when InfoPath Forms Server submit reports a problem'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-6855015995343624941</id><published>2010-01-05T07:00:00.009+01:00</published><updated>2010-07-31T10:52:35.543+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='VS2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath Forms Server'/><title type='text'>Automatic publish InfoPath forms via Feature-based ALM deployment</title><content type='html'>&lt;div&gt;&lt;h3 style='font-size:110%;'&gt;Fixed the Feature-based deployment of InfoPath forms to SharePoint site while treating them as first-class source artifacts in VS + TFS environment&lt;/h3&gt;I’m a supporter of applying Application Lifecycle Management (ALM) principles within application development projects. This also goes for SharePoint-based custom applications. Basically this means:&lt;ol style='margin-top:5px;'&gt;&lt;li&gt;designing and developing the SharePoint artifacts within a team-based source repository environment (aka, Team Foundation Server);&lt;/li&gt;&lt;li&gt;applying version control to the individual application/building blocks;&lt;/li&gt;&lt;li&gt;daily build;&lt;/li&gt;&lt;li&gt;and full automatic and repeatable deployments&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;With InfoPath development, this gives some challenges. First of all, the InfoPath forms are setup and maintained via its own designer-tool, namely the InfoPath Designer client; and not directly from within the scope of Visual Studio. However, the most significant issue is the manner of deployment: the InfoPath client contains functionality to publish the InfoPath form to the destination environment, with SharePoint site as one of the available options. Given my ALM aspirations, I want to copy this InfoPath client deployment-experience to within the regular SharePoint deployments, via the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Solution&lt;/span&gt; framework and SharePoint &lt;span style='font-family:Courier;font-size:smaller;'&gt;Features&lt;/span&gt;. In essence, I want to achieve the following:&lt;ol style='margin-top:5px;'&gt;&lt;li&gt;Automatically provision the required Information Architecture artifacts:&lt;ul&gt;&lt;li&gt;&lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Masterdata for &lt;span style='font-family:Courier;font-size:smaller;'&gt;LookupFields&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentTypes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style='font-family:Courier;font-size:smaller;'&gt;Forms Libraries&lt;/span&gt;, associated with the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentTypes&lt;/span&gt;, for administration of the filled in InfoPath forms&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Automatically provision and activate the required InfoPath infrastructure&lt;/li&gt;&lt;ul&gt;&lt;li&gt;InfoPath forms&lt;/li&gt;&lt;li&gt;DataConnections&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;The first category, the Information Architecture artifacts, is well-known SharePoint provisioning. It can be done via a &lt;span style='font-family:Courier;font-size:smaller;'&gt;Site Definition&lt;/span&gt;, &lt;span style='font-family:Courier;font-size:smaller;'&gt;Features&lt;/span&gt;, or a combination. I favor the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt;-based approach, because it is modular, and allows me to turn it off and on.&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;The second category gave me more challenges. On internet search, I came across some posts that mentioned the SharePoint OOTB &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSNFeatureReceiver&lt;/span&gt; that aids in here. However, it quickly appeared to me that it only takes care of one part, namely registrating the InfoPath form templates within the target SharePoint site. To successfully achieve this, &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSNFeatureReceiver&lt;/span&gt; has constraints on the deployable InfoPath forms. And when even a single one of them does not comply to these constraints, &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSNFeatureReceiver&lt;/span&gt; rather silently fails to correctly install the forms. Another missing part is for the &lt;span style='font-family:Courier;font-size:smaller;'&gt;DataConnections&lt;/span&gt;. The upload is not the issue here, being standard SharePoint &lt;span style='font-family:Courier;font-size:smaller;'&gt;Module&lt;/span&gt; functionality. But rather adjusting them to the specific target environment. In my ALM principles, I want to hold on to 1 single instance per &lt;span style='font-family:Courier;font-size:smaller;'&gt;DataConnection&lt;/span&gt; file, and not be forced to maintain versions for each of them per target environment (&lt;span style='font-style:italic;'&gt;development, test, staging, production&lt;/span&gt;).&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;Luckily, Microsoft has not made &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSNReceiverFeature&lt;/span&gt; sealed. So I decided to overload it to augment the standard deployment functionality with the above described aspects. Adjusting the &lt;span style='font-family:Courier;font-size:smaller;'&gt;DataConnections&lt;/span&gt; appeared rather simple, with thanks to this blog (&lt;a href='http://blogs.code-counsel.net/Wouter/Lists/Posts/Post.aspx?ID=96'&gt;Building InfoPath Form Services Solutions using Visual Studio 2008&lt;/a&gt;), including a link to &lt;a href='http://blogs.code-counsel.net/Wouter/Downloads/IPFS%20Demo%20-%203%20-%20Provisioning.zip'&gt;demo provision code&lt;/a&gt;. I took this as basis to realize a generic approach, feeded by an XML configuration file delivered within the feature scope&lt;/div&gt;&lt;div style='margin-top:10px;width:100%;float:left;'&gt;&lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/Sz9f1K-ux1I/AAAAAAAAAHQ/LhbuWeDfDWg/s1600-h/InfoPathInfraFixBlog2.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 222px;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/Sz9f1K-ux1I/AAAAAAAAAHQ/LhbuWeDfDWg/s320/InfoPathInfraFixBlog2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5422157843462539090" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;The correct deployment of the InfoPath forms appeared to be more of a challenge. Eventually, I found out that the direct cause of the failed deployment was that I earlier on published the forms during my development and testing of the forms. As soon as you publish an InfoPath form, the InfoPath client administrates this within the form itself. And this appeared to result in the malfunctioning &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSNFeatureReceiver&lt;/span&gt; based InfoPath forms registration. This can be mitiligated by correcting the InfoPath forms. An alternative is to modify the original InfoPath form artifacts. However, this would then be a corrective action to be repeated every time you’d published an InfoPath form just for an InfoPath designer (programmer) test. I therefore went for the alternative to do the correction as part of the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; installation procedure. This way during the development phase the team can just go one and (re)publish the forms, without worrying about the effect on deployment later on.&lt;/div&gt;&lt;div style='margin-top:10px;width:100%;float:left;'&gt;&lt;a href="http://1.bp.blogspot.com/_77IVwtGj8s0/Sz9gWEJ78qI/AAAAAAAAAHY/L5eiuZhz3UU/s1600-h/InfoPathInfraFixBlog0.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 194px;" src="http://1.bp.blogspot.com/_77IVwtGj8s0/Sz9gWEJ78qI/AAAAAAAAAHY/L5eiuZhz3UU/s320/InfoPathInfraFixBlog0.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5422158408566174370" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:10px;width:100%;'&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_77IVwtGj8s0/Sz9goaqeYgI/AAAAAAAAAHg/OfB0Ex1SeH0/s1600-h/InfoPathInfraFixBlog.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 313px;" src="http://1.bp.blogspot.com/_77IVwtGj8s0/Sz9goaqeYgI/AAAAAAAAAHg/OfB0Ex1SeH0/s320/InfoPathInfraFixBlog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5422158723845874178" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:10px;width:100%;'&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/TFPjb3efAxI/AAAAAAAAAJM/z1lael5ehoc/s1600/checkOnPresenceAndRemoveAttribute.JPG"&gt;&lt;img style="float:left; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 80px;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/TFPjb3efAxI/AAAAAAAAAJM/z1lael5ehoc/s320/checkOnPresenceAndRemoveAttribute.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5499989637837292306" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style='margin-top:10px;float:left;'&gt;Another thing to take into account when doing &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt;-based deployment of InfoPath forms, is that the Forms must be contained at the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; root-directory. I like to structure &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; contents within subfolders for different deployable types. &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentTypes&lt;/span&gt;, &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt;, &lt;span style='font-family:Courier;font-size:smaller;'&gt;DataConnections&lt;/span&gt;, and also InfoPath forms, each within their own subfolders within the feature. However, in case of InfoPath forms deployed via &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSNFeatureReceiver&lt;/span&gt;, this is not working. Without a concrete error message, the registrating will then just not be performed. So keep your Forms at the &lt;span style='font-family:Courier;font-size:smaller;'&gt;Feature&lt;/span&gt; root-level.&lt;/div&gt;&lt;div style='margin-top:10px;border-style:solid;border-width:thin;padding:5pt;float:left;'&gt;&lt;h3 style='font-size:110%;'&gt;Deployment steps, and thus functionality of InfoPathInfrastructure feature&lt;/h3&gt;&lt;h4 style='font-size:90%;'&gt;Upon Feature installation event:&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Fix the forms files, for successful automatic publishing via &lt;span style='font-family:Courier;font-size:smaller;'&gt;XSNFeatureReceiver&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Extract the forms; this on itself presented a challenge, since .NET does not provide standard cabinet (.cab) handling&lt;/li&gt;&lt;li&gt;Inspect the manifest.xsf file on the presence of &lt;span style='font-family:Courier;font-size:smaller;'&gt;publishUrl&lt;/span&gt; and &lt;span style='font-family:Courier;font-size:smaller;'&gt;trustLevel&lt;/span&gt;; remove any of them present&lt;/li&gt;&lt;li&gt;Repack the .xsn container / file&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4 style='font-size:90%;'&gt;Within the Feature Activation:&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;upload forms files to &lt;span style='font-family:Courier;font-size:smaller;'&gt;FormsServerTemplate&lt;/span&gt; library&lt;/li&gt;&lt;li&gt;Registrate the forms&lt;/li&gt;&lt;li&gt;upload data connections to &lt;span style='font-family:Courier;font-size:smaller;'&gt;DataConnections&lt;/span&gt; library&lt;/li&gt;&lt;li&gt;provision site columns&lt;/li&gt;&lt;li&gt;provision master data lists&lt;/li&gt;&lt;li&gt;&lt;a href='http://williamvanstrien.blogspot.com/2009/12/tip-use-lookup-iso-choice-field-for.html'&gt;fix&lt;/a&gt; the lookup references&lt;/li&gt;&lt;li&gt;provision content types; including reference to the uploaded forms&lt;/li&gt;&lt;li&gt;provision contents/data libraries&lt;/li&gt;&lt;li&gt;assign content types to the contents libraries&lt;/li&gt;&lt;li&gt;fix retrieve data connections --&amp;gt; associate with the master data list in the deploy environment (iso your local / development source)&lt;/li&gt;&lt;li&gt;fix submit data connection --&amp;gt; associate with the content data list in the deploy environment (iso your local / development source)&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-6855015995343624941?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/6855015995343624941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/automatic-publish-infopath-forms-via.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6855015995343624941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/6855015995343624941'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/automatic-publish-infopath-forms-via.html' title='Automatic publish InfoPath forms via Feature-based ALM deployment'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_77IVwtGj8s0/Sz9f1K-ux1I/AAAAAAAAAHQ/LhbuWeDfDWg/s72-c/InfoPathInfraFixBlog2.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-3057519208008122823</id><published>2010-01-02T11:26:00.006+01:00</published><updated>2010-01-15T21:28:14.390+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath Forms Server'/><title type='text'>InfoPath embedded via XMLFormView conflicts in IE with CSS relative positioning</title><content type='html'>&lt;div&gt;You can apply the out-of-the-box &lt;span style='font-family:Courier;font-size:smaller;'&gt;XMLFormView&lt;/span&gt; webpart to embed an InfoPath form within a SharePoint page. This way, the form displays as a visual integrated part within the SharePoint application, maintaining for the user the full application context (branding, navigation menu's). However, upon doing this (after applying the required infrastructure initialization steps, see this &lt;a href='http://www.nickgrattan.net/Publications/How%20to%20Host%20Microsoft%20InfoPath%20Forms%20in%20SharePoint%20Pages.pdf'&gt;whitepaper&lt;/a&gt;), I continuously encounter a runtime Javascript eror when browsing the page in Internet Explorer. The error occurs in INC\Core.js in the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization_ComputeAbsoluteLeft&lt;/span&gt; function, used to position an error asterix within the form. Within this method, the DOM-tree is traversed up to the HTML-root. At least that is the intention, but somehow this goes wrong with IE; and the OOTB script is not made robust. This &lt;a href='http://www.eggheadcafe.com/software/aspnet/33459807/positionrelative-breaks.aspx'&gt;article&lt;/a&gt; gives more background details.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;So, the problem cause is known. What about the resolution? I don't intend to sacrifice the correct CSS handling, just because IE doesn't handle it well. I see multiple options:&lt;ol style='margin-top:5px;'&gt;&lt;li&gt;Making the HTML robust by wrapping the relative positioned DIV within an absolute positioned Body-container&lt;/li&gt;&lt;li&gt;Runtime overloading the OOTB &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization_ComputeAbsoluteLeft&lt;/span&gt; function to fix it for IE behaviour&lt;/li&gt;&lt;li&gt;Use the &lt;span style='font-family:Courier;font-size:smaller;'&gt;PageViewer&lt;/span&gt; webpart iso &lt;span style='font-family:Courier;font-size:smaller;'&gt;XMLFormView&lt;/span&gt; to embed the InfoPath form&lt;/li&gt;&lt;li&gt;Inspect the Core.js code, and find a proper, and more localized solution&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Your guess is right, I applied the latter. It appears that although the runtime errors occurs within the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization_ComputeAbsoluteLeft&lt;/span&gt; function, the solution can be found within the invoked helper &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization_IsPositionCausingElement&lt;/span&gt; function. That function returns true if the inspected style object has its overflow property set, and in that case the loop within &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization_ComputeAbsoluteLeft&lt;/span&gt; stops. The solution is therefore to assign an overflow setting to a proper container element of the &lt;span style='font-family:Courier;font-size:smaller;'&gt;XmlFormView&lt;/span&gt;. Since CSS styles are applied afterwards, it's not possible to assign this property via CSS. Options are to either place the style inline, or to add it via code - before the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization_ComputeAbsoluteLeft&lt;/span&gt; will be invoked. I applied the last. Rationale for this is that I only want to apply the IE-hack / resolution when it is needed. That is, when an XmlFormView is rendered within either IE 6 or 7. Inline style does not allow me to that, javascript does:&lt;/div&gt;&lt;div style='margin-top:10px;margin-left:15px;'&gt;&lt;span style='font-family:Courier;font-size:smaller;'&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;function fixInfoPathFormView()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;/*@cc_on&lt;br /&gt;&amp;nbsp;&amp;nbsp;@if (@_jscript_version &amp;lt;= 5.7)&lt;br /&gt;&amp;nbsp;&amp;nbsp;var objFormView = document.all["__XmlFormView"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (objFormView != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var objFormViewContainer = document.all["wrap-center"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (objFormViewContainer.style != null &amp;amp;&amp;amp; objFormViewContainer.style.overflow == "") objFormViewContainer.style.overflow = "auto";&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;/*@end&lt;br /&gt;&amp;nbsp;&amp;nbsp;@*/&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:20px;font-style:italic;'&gt;&amp;lt;UPDATE&amp;gt;The above workaround is dependent on the installation of SharePoint SP2 in your environment. Prior SP2, the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization_ComputeAbsoluteLeft&lt;/span&gt; function does not check via the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ErrorVisualization_IsPositionCausingElement&lt;/span&gt; function; but just tries to traverse the offsetParent hierarchy until reaching the document.body object. Remedie then to avoid the runtime error is option 1: set the position of the document.body container to static.&amp;lt;/UPDATE&amp;gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-3057519208008122823?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/3057519208008122823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/infopath-embedded-via-xmlformview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3057519208008122823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/3057519208008122823'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2010/01/infopath-embedded-via-xmlformview.html' title='InfoPath embedded via XMLFormView conflicts in IE with CSS relative positioning'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-2752755692687190375</id><published>2009-12-29T18:30:00.023+01:00</published><updated>2010-08-10T21:44:00.410+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Managed Property'/><category scheme='http://www.blogger.com/atom/ns#' term='SiteColumn'/><category scheme='http://www.blogger.com/atom/ns#' term='CAML'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Search'/><title type='text'>Peculiarities for handling space-character in field names for query and search: ManagedProperty name vs Field / ColumnName</title><content type='html'>&lt;div&gt;For better human readability, and thus understanding by the end users, it is often desired to use spaces in the &lt;span style='font-family:Courier;font-size:smaller;'&gt;DisplayName&lt;/span&gt; of &lt;span style='font-family:Courier;font-size:smaller;'&gt;SiteColumns&lt;/span&gt; and &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentTypes FieldRefs&lt;/span&gt;: &lt;span style='font-style:italic;'&gt;"The columnname"&lt;/span&gt;. But beware, this gives some peculiarities with the different approaches to query and display the SharePoint content...&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Enterprise Search&lt;/h3&gt;Upon first crawling of the content source, this ends up in a &lt;span style='font-family:Courier;font-size:smaller;'&gt;CrawledProperty&lt;/span&gt; with the name &lt;span style='font-style:italic;'&gt;"The_x0020_ColumnName"&lt;/span&gt;. This can be mapped to a &lt;span style='font-family:Courier;font-size:smaller;'&gt;ManagedProperty&lt;/span&gt;. The name of this property may &lt;span style='font-style:italic;'&gt;not&lt;/span&gt; include any spaces. Here it could be &lt;span style='font-style:italic;'&gt;"TheColumnName"&lt;/span&gt;. With Enterprise Search, one can now query and select on the property 'TheColumnName'. For instance, query via the &lt;span style='font-family:Courier;font-size:smaller;'&gt;AdvancedSearchBox&lt;/span&gt; webpart, and display the results via the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SearchCoreResults&lt;/span&gt; webpart. Rather handy to skip in the XML-based query (SQL-CAML), and the rendering of the query result (XSLT), the special handling of the space character.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;CAML-based site content query&lt;/h3&gt;When query and displaying site data via the &lt;span style='font-family:Courier;font-size:smaller;'&gt;ContentQueryWebPart&lt;/span&gt;, one must select and display on the &lt;span style='font-weight:bold;'&gt;actual field / column name&lt;/span&gt;. That is, in the &lt;span style='font-family:Courier;font-size:smaller;'&gt;CommonViewFields&lt;/span&gt; specification, the actual column name must be used. Due to the space in the name, CAML space-mapping must be applied; resulting in 'The_x0020_columnname'. Example:&lt;/div&gt;&lt;span style='font-family:Courier;font-size:smaller;'&gt;&lt;div style='margin-top:5px;margin-left:15px;'&gt;&amp;lt;property name="CommonViewFields" type="string"&amp;gt;&lt;br/&gt;Title,String;The_x0020_columnname,Choice;Editor,User&lt;br/&gt;&amp;lt;/property&amp;gt;&lt;/div&gt;&lt;/span&gt;&lt;div style='margin-top:5px;'&gt;This is all pretty well-known SharePoint stuff.&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;Something that is less known, is that yet another CAML translation must be applied to successfully display the CQWP queryresults via XSLT rendering. The CAML-space character '_x0020_' must itself be translated into '_x005F_x0020_'. So for instance:&lt;/div&gt;&lt;div style='margin-top:5px;margin-left:15px'&gt;&lt;span style='font-family:Courier;font-size:smaller;'&gt;&amp;lt;td class="ms-vb" nowrap=""&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="@The_x005F_x0020_columnname"/&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:10px;'&gt;&lt;h3 style='font-size:110%;'&gt;Thus...&lt;/h3&gt;To summarize: when you put a space in the displayname of a field, this may wind up in 4 different 'names' within the query/display pipeline:&lt;ol style='margin-top:2px;'&gt;&lt;li&gt;The actual displayname itself: "The columnname"&lt;/li&gt;&lt;li&gt;The managed property name for within enterprise search: "TheColumnName"&lt;/li&gt;&lt;li&gt;The query fieldspecification within CQWP: "The_x0020_columnname"&lt;/li&gt;&lt;li&gt;The query result rendering used by CQWP: "The_x005F_x0020_columnname"&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-2752755692687190375?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/2752755692687190375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2009/12/peculiarities-for-handling-space.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2752755692687190375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/2752755692687190375'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2009/12/peculiarities-for-handling-space.html' title='Peculiarities for handling space-character in field names for query and search: ManagedProperty name vs Field / ColumnName'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-537060835562964883</id><published>2009-12-28T10:14:00.012+01:00</published><updated>2009-12-28T10:40:54.657+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Managed Property'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Search'/><title type='text'>Tip: difference in metadata only does not qualify document items as different</title><content type='html'>&lt;div&gt;In my last &lt;a href='http://williamvanstrien.blogspot.com/2009/12/steps-for-initializing-enterprise.html'&gt;post&lt;/a&gt; I described the approach to set-up your managed properties collection as part of initializing the enterprise search experience. To test the outcome of this initialization, I next uploaded a couple of documents, and arbitrary filled in some of the metadata fields. Actually, I uploaded the same dummy / test document multiple times, each time renaming it. To my surprise, enterprise search next continuously returned only 1 of the uploaded documents. The cause of this is that the search crawling detected that the renamed documents are actually the same / duplicates. And on default, enterprise search via the &lt;span style='font-family:Courier;font-size:smaller;'&gt;SearchCoreResults&lt;/span&gt; webpart does not include duplicates. The tip is therefore in order to properly test the enterprise search in your application, make sure to upload &lt;span style='font-style:italic;'&gt;different&lt;/span&gt; documents (&lt;span style='font-style:italic;'&gt;that is, with difference in the document content&lt;/span&gt;) within the crawled content source.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9057379846514679550-537060835562964883?l=williamvanstrien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://williamvanstrien.blogspot.com/feeds/537060835562964883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://williamvanstrien.blogspot.com/2009/12/tip-difference-in-metadata-only-does.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/537060835562964883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9057379846514679550/posts/default/537060835562964883'/><link rel='alternate' type='text/html' href='http://williamvanstrien.blogspot.com/2009/12/tip-difference-in-metadata-only-does.html' title='Tip: difference in metadata only does not qualify document items as different'/><author><name>William van Strien</name><uri>http://www.blogger.com/profile/02730614987048826403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_77IVwtGj8s0/SkPnanVuCnI/AAAAAAAAAAw/_C9jha-Ytc0/S220/WvStrien.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9057379846514679550.post-2686416022222373724</id><published>2009-12-21T22:49:00.035+01:00</published><updated>2010-01-21T22:46:21.032+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Managed Property'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Feature'/><category scheme='http://www.blogger.com/atom/ns#' term='Best practice'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Search'/><title type='text'>Automated approach for initializing Enterprise Search experience</title><content type='html'>&lt;div&gt;Whenever you want to utilize the Enterprise Search functionalities in your application, you must take into account for correct initialization: set up a content source, administer its crawling scheme, create the searchable managed properties, set up a Search Scope. Although the different steps can be done manually via the SharePoint GUI (combination of Central Admin and your own application), this is less workable within the context of an ALM based project. Your application is then multiple times (re)deployed, and to different environment (development, test, staging, production). Each time the manual installation/initialization steps would need to be repeated. This is cumbersome, and [thus] error prone. A better approach (as always) is to strive for a fully automated initialization of the enterprise search. I’ve applied this several times via the approach outlined here:&lt;ul&gt;&lt;li&gt;create a new Feature, with a FeatureReceiver codebehind&lt;/li&gt;&lt;li&gt;In the activation method of the feature, do the following steps:&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-left:35px;'&gt;&lt;span style='border-width:1px;'&gt;&lt;div&gt;&lt;ol&gt;&lt;h3 style='font-size:110%;'&gt;Create the content source&lt;/h3&gt;&lt;li&gt;use the Search Object Model to create the content source&lt;/li&gt;&lt;li&gt;if applicable, administer include and exclude rules&lt;/li&gt;&lt;li&gt;create the crawl schemes; full and incremental&lt;/li&gt;&lt;div style='margin-top:10px;margin-bottom:20px;width:100%;'&gt;&lt;a href="http://4.bp.blogspot.com/_77IVwtGj8s0/Sy_xPr7YwjI/AAAAAAAAAGo/0YrzmmzSD1w/s1600-h/CreateContentSource.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 210px;" src="http://4.bp.blogspot.com/_77IVwtGj8s0/Sy_xPr7YwjI/AAAAAAAAAGo/0YrzmmzSD1w/s320/CreateContentSource.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5417814128542138930" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3 style='font-size:110%;'&gt;Create managed properties&lt;/h3&gt;&lt;i&gt;Important to realize here is that a managed property can only be made if the mapping crawled property is available.&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;&lt;li&gt;make sure the crawled content source contains at least one item, by either adding a dummy listitem (for regular Lists), or uploading a dummy document (for document library)&lt;/li&gt;&lt;li&gt;Use the content type(s) definition(s) to determine the fields of the searchable content, and assign per field a non-nil value&lt;/li&gt;&lt;li&gt;Initiate a full crawl, in order to let the crawler make up crawled properties for each of the content type(s) fields&lt;/li&gt;&lt;li&gt;After the full crawl, loop through the collection of determined content type(s) fields, and for each field create a Managed Property of the proper type, and associate it with the automatically created crawled property&lt;/li&gt;&lt;li&gt;Remove the dummy content(s) of step 4&lt;/li&gt;&lt;div style='margin-top:10px;margin-bottom:20px;width:100%;'&gt;&lt;a href="http://1.bp.blogspot.com/_77IVwtGj8s0/Sy_xeokJuhI/AAAAAAAAAGw/nn28tgUaCQA/s1600-h/CreateManagedPropsViaCrawledProps.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 257px;" src="http://1.bp.blogspot.com/_77IVwtGj8s0/Sy_xeokJuhI/AAAAAAAAAGw/nn28tgUaCQA/s320/CreateManagedPropsViaCrawledProps.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5417814385337416210" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3 style='font-size:110%;'&gt;Create the Search Scope&lt;/h3&gt;&lt;li&gt;use the Search Object Model API to create a Search Scope&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='margin-top:15px;'&gt;&lt;ul&gt;&lt;li&gt;In the deactivation method of the feature, do the &lt;i&gt;proper&lt;/i&gt; reversible actions of the feature activation event.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style='margin-top:10px;margin-left:45px;float:left;'&gt;What is proper, is situation / application dependent. Normally, you would implement in the feature deactivation a full restore to the status &lt;b&gt;before&lt;/b&gt; the feature activation. Here that means removal of the managed properties, crawled properties, search scope and content source. However, when you delete the content source, you typically &lt;i&gt;&lt;b&gt;undo more&lt;/b&gt;&lt;/i&gt; than strict the feature activation. In a production situation, the content source has been crawled and crawled, building up the index administration. Upon content source deletion, you also loose al this hard work content crawling and indexing. Feature deactivation would then thus not only undo the feature activation itself, but also work done later. Whether this is appropriate, depends on the application and content specifications. Every content can be recrawled. However, for a large and complex set (documents, .pdf’s, TIFF files, LOB via BDC…) this can be time consuming, and during the required full crawl the application search cannot find and retu
