<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogit.create.pt/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Tiago Oliveira</title><link>http://blogit.create.pt/blogs/tiagooliveira/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 (Build: 60809.935)</generator><item><title>Biztalk xml header processing</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2009/08/17/Biztalk-xml-header-processing.aspx</link><pubDate>Mon, 17 Aug 2009 21:44:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:1876</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/1876.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=1876</wfw:commentRss><description>&lt;p&gt;When we use infopath or similar technologies with biztalk, the messages have always a xml processing header. Biztalk does not copy xml processing header to the output messages by default, so we have to set it manually. &lt;/p&gt;&lt;p&gt;There are several options in biztalk to manipulate xml header processing in output messages:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Set the header in orchestration using the message context properties &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Example &lt;br /&gt;&lt;strong&gt;message(XMLNORM.ProcessingInstructionOption)&lt;/strong&gt; = &lt;strong&gt;0 &lt;/strong&gt;(append) or &lt;strong&gt;1 &lt;/strong&gt;(create new); &lt;br /&gt;&lt;strong&gt;message(XMLNORM.ProcessingInstruction)&lt;/strong&gt; = &amp;ldquo;xml processing header to add or append&amp;rdquo;;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: For the demoting process to occur, you must use the Xml assembler component or xml transmit pipeline in the output send port.&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Use xml transmit pipeline or a custom pipeline with the xml assembler component in the output send port &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;When you use the xml transmit pipeline, you must set the following properties:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ProcessingInstructionsOptions &amp;ndash; &lt;/strong&gt;&lt;strong&gt;0 &lt;/strong&gt;(append) or &lt;strong&gt;1 &lt;/strong&gt;(create new)&lt;br /&gt;&lt;strong&gt;XmlAsmProcessingInstructions -&lt;/strong&gt; &amp;ldquo;xml processing header to add or append&amp;rdquo;&lt;/p&gt;&lt;p&gt;When&amp;nbsp; you use a custom pipeline with xml assembler component, set the following properties:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Add Processing Instructions&lt;/strong&gt; &amp;ndash; Append or Create new &lt;strong&gt;&lt;br /&gt;Add processing instructions text -&lt;/strong&gt; &amp;ldquo;xml processing header to add or append&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Use a custom pipeline component &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;This option is the most difficult to implement, you have to create a custom assembler component, get and change de output message.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Do not forget to set the the biztalk maps property &amp;ldquo;&lt;strong&gt;copy processing instructions (pis)&lt;/strong&gt;&amp;rdquo; to &lt;strong&gt;&amp;ldquo;yes&amp;rdquo;&lt;/strong&gt; when you want to copy the processing instructions from the input to output messages.&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=1876" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Biztalk+Server/default.aspx">Biztalk Server</category><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Infopath/default.aspx">Infopath</category></item><item><title>Using xpath function in orchestrations</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2009/02/02/Using-xpath-function-in-orchestrations.aspx</link><pubDate>Tue, 03 Feb 2009 00:57:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:1591</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/1591.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=1591</wfw:commentRss><description>&lt;p&gt;Xpath is a function that can be used in any orchestration to set and retrieve data from/to messages.&lt;/p&gt;&lt;p&gt;The syntax is very simple:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Set a value in message &lt;br /&gt;&lt;u&gt;xpath(message, &amp;quot;xpathQuery&amp;quot;) = value;&lt;/u&gt; &lt;/li&gt;&lt;li&gt;Get a value from message &lt;br /&gt;variable = xpath(message, &amp;quot;xpathQuery&amp;quot;); &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The first problem that all users complains it&amp;#39;s how to get the xpath of a specific message element. This can be achieved by going to the properties of the chosen element and copy the &amp;quot;Instance XPath&amp;quot; property value.&lt;/p&gt;&lt;p&gt;&lt;img height="265" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/353477145.jpg" width="670" /&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;Another problem is using Xpath function to get message elements data. When you want to get a string value to a string variable, for example, you must use the xpath &lt;a href="http://www.w3schools.com/xpath/xpath_functions.asp#string" target="_blank"&gt;string&lt;/a&gt; function. &lt;br /&gt;&lt;br /&gt;stringVariable = xpath(message, &amp;quot;&lt;strong&gt;string(&lt;/strong&gt;xpathQuery&lt;strong&gt;)&lt;/strong&gt;&amp;quot;);&lt;/p&gt;&lt;p&gt;For a number value&lt;/p&gt;&lt;p&gt;intVariable = xpath(message, &amp;quot;&lt;strong&gt;number(&lt;/strong&gt;xpathQuery&lt;strong&gt;)&lt;/strong&gt;&amp;quot;);&lt;/p&gt;&lt;p&gt;If you want to use the Xpath function to get xml data to a XmlDocument variable you must not use any xpath function.&lt;/p&gt;&lt;p&gt;xmlDocumentVariable = xpath(message, &amp;quot;xpathQuery&amp;quot;); &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Some examples:&lt;/p&gt;&lt;p&gt;booleanVar = xpath(message, &amp;quot;boolean(/*[local-name()=&amp;#39;Root&amp;#39; and namespace-uri()=&amp;#39;&lt;a href="http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;IntField&amp;#39;"&gt;http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;IntField&amp;#39;&lt;/a&gt; and namespace-uri()=&amp;#39;&amp;#39;])&amp;quot;); &lt;/p&gt;&lt;p&gt;xmlVariable = xpath(message, &amp;quot;/*[local-name()=&amp;#39;Root&amp;#39; and namespace-uri()=&amp;#39;&lt;a href="http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;anyField&amp;#39;"&gt;http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;anyField&amp;#39;&lt;/a&gt; and namespace-uri()=&amp;#39;&amp;#39;]&amp;quot;); &lt;/p&gt;&lt;p&gt;xpath(message, &amp;quot;/*[local-name()=&amp;#39;Root&amp;#39; and namespace-uri()=&amp;#39;&lt;a href="http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;anyField&amp;#39;"&gt;http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;anyField&amp;#39;&lt;/a&gt; and namespace-uri()=&amp;#39;&amp;#39;]&amp;quot;) = xmlVariable.InnerXml; &lt;/p&gt;&lt;p&gt;xpath(message, &amp;quot;/*[local-name()=&amp;#39;Root&amp;#39; and namespace-uri()=&amp;#39;&lt;a href="http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;BooleanField&amp;#39;"&gt;http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;BooleanField&amp;#39;&lt;/a&gt; and namespace-uri()=&amp;#39;&amp;#39;]&amp;quot;) = booleanVar; &lt;/p&gt;&lt;p&gt;xpath(message, &amp;quot;/*[local-name()=&amp;#39;Root&amp;#39; and namespace-uri()=&amp;#39;&lt;a href="http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;IntField&amp;#39;"&gt;http://TestNamespace/200902&amp;#39;]/*[local-name()=&amp;#39;IntField&amp;#39;&lt;/a&gt; and namespace-uri()=&amp;#39;&amp;#39;]&amp;quot;) = 3; &lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=1591" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Biztalk+Server/default.aspx">Biztalk Server</category></item><item><title>Replace namespace prefix pipeline component</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2008/11/27/Replace-namespace-prefix-pipeline-component.aspx</link><pubDate>Fri, 28 Nov 2008 00:24:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:1452</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/1452.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=1452</wfw:commentRss><description>In some biztalk integrations with legacy systems, there are message specifications that requires a specific namespace prefix, but all biztalk messages use ns0, ns1, ns... definition to define prefix information. &lt;p&gt;To solve this problem there are two solutions :&lt;/p&gt;&lt;ol&gt;&lt;li&gt;You can replace the prefix data in all maps output xslt, then replace the map with the changed xslt, solution explained in &lt;a href="http://codebetter.com/blogs/jeff.lynch/archive/2006/08/09/129054.aspx" target="_blank"&gt;Jeff Lynch blog&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;Use a custom pipeline with a component that makes the necessary replacements.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If you have few maps that do not change frequently, you can implement the first solution, otherwise the second solution is better.&lt;/p&gt;&lt;p&gt;I have created a &lt;a href="http://cid-f606a2a2dd927b87.skydrive.live.com/self.aspx/P%c3%bablica/RenameNamespacePrefixComponent.zip" target="_blank"&gt;custom component&lt;/a&gt;, based on the ESB Guidance namespace component, that perform the prefix replacements. It only requires the old and the new prefix name and uses streams in the replacement for better performance.&lt;/p&gt;&lt;p&gt;Before use, check the regular expression replacement agains your message schemas, and see if doesn&amp;#39;t make any unnecessary replacement. &lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=1452" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Biztalk+Server/default.aspx">Biztalk Server</category></item><item><title>How to - Validate Windows Workflow custom activity input</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2008/06/11/How-to-_2D00_-Validate-Windows-Workflow-custom-activity-input.aspx</link><pubDate>Wed, 11 Jun 2008 13:57:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:552</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/552.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=552</wfw:commentRss><description>&lt;p&gt;Windows Workflow allow us to perform custom validator input that is executed&amp;nbsp;at design and compile time. The error output is similar as Biztalk Orchestration shape errors. &lt;/p&gt;
&lt;p&gt;Adding a validator&amp;nbsp;to a&amp;nbsp;custom activity involves&amp;nbsp;two steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a class that derives from &lt;a href="http://msdn.microsoft.com/pt-br/library/system.workflow.componentmodel.compiler.activityvalidator.aspx" title="ActivityValidator" target="_blank"&gt;ActivityValidator&lt;/a&gt; class and override &lt;a href="http://msdn.microsoft.com/pt-br/library/system.workflow.componentmodel.compiler.activityvalidator.validate.aspx" target="_blank"&gt;Validate &lt;/a&gt;method;&lt;/li&gt;
&lt;li&gt;Add a &lt;a href="http://msdn.microsoft.com/pt-br/library/ms590699.aspx" title="ActivityValidator attribute" target="_blank"&gt;ActivityValidator attribute&lt;/a&gt; with the validator type to the custom activity;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As an example,&amp;nbsp;i&amp;#39;m going to show a validator creation that verifies if a specific property is set.&lt;/p&gt;
&lt;p&gt;I have already created a custom activity that is called Hello and have a property that receives the user name. To validate if the activity proprety is set, i&amp;#39;m going to create a validator.&amp;nbsp;
&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ActivityValidator class creation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As said early, to create a validator i have to create a class that derives from ActivityValidator. To perform the validation i have to override the validate method and set the validation code.&lt;br /&gt;
 &lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; 
System.Text.RegularExpressions;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; 
System.Workflow.ComponentModel.Compiler;&lt;/p&gt;
&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;internal sealed class&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ExampleValidator&lt;/font&gt;&lt;font size="2"&gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ActivityValidator&lt;/font&gt; {&lt;/p&gt;
&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ValidationErrorCollection&lt;/font&gt;&lt;font size="2"&gt; Validate (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ValidationManager&lt;/font&gt;&lt;font size="2"&gt; manager, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt; obj) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (manager == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; throw&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ArgumentNullException&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800080" size="2"&gt;&amp;quot;Invalid manager.&amp;quot;&lt;/font&gt;);&lt;font size="2"&gt;)
&lt;p&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (obj == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; throw&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ArgumentNullException&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800080" size="2"&gt;&amp;quot;Invalid activity.&amp;quot;&lt;/font&gt;);&lt;font size="2"&gt;)
&lt;p&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HelloActivity &lt;/font&gt;&lt;font size="2"&gt;activity = obj &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;as&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font color="#2b91af" size="2"&gt;HelloActivity &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (activity == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;) throw&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;InvalidOperationException&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800080" size="2"&gt;&amp;quot;Activity should be a HelloActivity.&lt;/font&gt;&lt;font color="#800080" size="2"&gt;&amp;quot;&lt;/font&gt;);&lt;font size="2"&gt;&lt;br /&gt;
&lt;p&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ValidationErrorCollection&lt;/font&gt;&lt;font size="2"&gt; errors = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;base&lt;/font&gt;&lt;font size="2"&gt;.Validate(manager, obj);&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Validate UserName property setting validationErrorCollection with information&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // about the property that causes the error.&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;.IsNullOrEmpty(activity.UserName)) {&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; &lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;errors.Add(&lt;font color="#2b91af" size="2"&gt;ValidationError&lt;/font&gt;&lt;font size="2"&gt;.GetNotSetValidationError(&lt;/font&gt;&lt;font color="#800080" size="2"&gt;&amp;quot;Username&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;));&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;font size="2"&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/font&gt;&lt;font size="2"&gt; errors;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;strong&gt;Custom activity &lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;strong&gt;and validator association&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;p&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;To associate the validator with the custom activity it&amp;#39;s used the activityvalidator attribute.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ActivityValidator&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;(&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;(&lt;font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ExampleValidator&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;))]&lt;/p&gt;&lt;p&gt;&lt;font&gt;&lt;font color="#0000ff" size="2"&gt;public sealed class&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HelloActivity&lt;/font&gt;&lt;font size="2"&gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;System.Workflow.ComponentModel.Activity&lt;/font&gt; {..&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;In the end the custom activity validator error will be show like this:&lt;/p&gt;&lt;p&gt;&lt;img alt="WFValidator" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/344944713.jpg" title="WFValidator" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=552" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Windows+Workflow+Foundation/default.aspx">Windows Workflow Foundation</category></item><item><title>Using WF CallExternalMethod activity in Windows Workflow</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2008/04/16/Using-WF-CallExternalMethod-activity-in-Windows-Workflow.aspx</link><pubDate>Wed, 16 Apr 2008 22:29:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:522</guid><dc:creator>tpo</dc:creator><slash:comments>1</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/522.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=522</wfw:commentRss><description>&lt;p&gt;The &lt;a href="http://msdn2.microsoft.com/en-us/library/system.workflow.activities.callexternalmethodactivity.aspx" target="_blank"&gt;CallExternalMethod Activity&lt;/a&gt; allows us to make synchronous communication between Workflow and the Host through the Local Service&lt;span style="color:red;"&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/span&gt;using&lt;strong&gt; &lt;/strong&gt;Local Service Communication. &lt;/p&gt;&lt;p&gt;Local Service Communication allows workflows to communicate with an external service that resides within the Host.&lt;span style="font-size:9pt;color:#0000dc;font-family:MS Shell Dlg;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Using this activity involves 4 phases: &lt;/p&gt;&lt;p&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Contract interface creation; &lt;/p&gt;&lt;p&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Workflow CallExternalMethod activity configuration with the contract interface, the parameter(s) and return properties (if applies); &lt;/p&gt;&lt;p&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Contract implementation creation; &lt;/p&gt;&lt;p&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Using ExternalDataExchangeService class at the Host, to register the Contract implementation &lt;/p&gt;&lt;p style="margin-left:36pt;"&gt;We can optionally set the input properties and read the return data. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Example: &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In this example I&amp;#39;m going to show the execution of a simple method that returns the 2 input parameters concatenation. &lt;/p&gt;&lt;h3&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Contract interface creation &lt;/h3&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;In the contract interface you have only to create the interface contract definition used by the Workflow. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;You&amp;#39;re going to create an Interface named &amp;quot;IContract&amp;quot;, which defines the Concatenate method. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;All interfaces must have the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.workflow.activities.externaldataexchangeattribute.aspx" target="_blank"&gt;ExternalDataExchange&lt;/a&gt; attribute defined that marks the interface as a local service interface. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-size:9pt;font-family:Consolas;"&gt;[&lt;span style="color:#2b91af;"&gt;ExternalDataExchange&lt;/span&gt;] &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IContract&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt; Concatenate(&lt;span style="color:blue;"&gt;string&lt;/span&gt; parameter1, &lt;span style="color:blue;"&gt;string&lt;/span&gt; parameter2); &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;h3&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Workflow CallExternalMethodActivity configuration &lt;/h3&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Add the CallExternalMethodActivity to the Workflow. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The Workflow will appear like this: &lt;/p&gt;&lt;p&gt;&lt;img border="0" height="254" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/311026231.jpg" style="width:565px;height:254px;" width="565" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Then you will create three properties that correspond to the two input parameters to concatenate and the return concatenation. &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Parameter1ToConcat { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; } &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Parameter2ToConcat { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; } &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ConcatenateReturn { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; } &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Configure the CallExternalMethodActivity properties like this: &lt;/p&gt;&lt;div style="margin-left:30pt;"&gt;&lt;table style="border-collapse:collapse;"&gt;&lt;tr&gt;&lt;td style="padding-right:7px;padding-left:7px;border:black 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;InterfaceType&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:black 0.5pt solid;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;IContract interface&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;MethodName&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;Concatenate&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;Parameter1 &amp;amp; parameter2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;Parameter1ToConcat &amp;amp; Parameter2ToConcat properties&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;(ReturnValue)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;ConcatenateReturn property&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style="margin-left:30pt;"&gt;&lt;/div&gt;&lt;div style="margin-left:30pt;"&gt;&lt;/div&gt;&lt;div style="margin-left:30pt;"&gt;&lt;/div&gt;&lt;div style="margin-left:30pt;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img border="0" height="244" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/311026232.jpg" style="width:548px;height:244px;" width="548" /&gt;&amp;nbsp; &lt;h3&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Contract implementation creation &lt;/h3&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;At the contract implementation creation, you have to create a class that implements IContract defined at the first step. &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ContractImplementation&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IContract&lt;/span&gt; &lt;br /&gt;&amp;nbsp; {&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Concatenate(&lt;span style="color:blue;"&gt;string&lt;/span&gt; parameter1, &lt;span style="color:blue;"&gt;string&lt;/span&gt; parameter2)&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;&lt;/span&gt; &lt;span style="font-size:9pt;font-family:Consolas;"&gt;&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;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; parameter1 + parameter2;&amp;nbsp;&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;&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; }&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Host configuration &lt;/h3&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;At the Host, the contract implementation is registered by using the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.workflow.activities.externaldataexchangeservice.aspx" target="_blank"&gt;ExternalDataExchangeService&lt;/a&gt; class. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The input properties can be set by using the second parameter from the CreateWorkflow method. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The return parameter can be retrieved using the OutputParameters property from the WorkflowCompletedEventArgs class, at the WorkflowCompleted event. &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;WorkflowRuntime&lt;/span&gt; workflowRuntime = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WorkflowRuntime&lt;/span&gt;()) &lt;/span&gt;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;hellip;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;workflowRuntime.WorkflowCompleted += &lt;span style="color:blue;"&gt;delegate&lt;/span&gt;(&lt;/span&gt; &lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;WorkflowCompletedEventArgs&lt;/span&gt; e)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:#00b050;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// this is where we can get the return value&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Write((&lt;span style="color:blue;"&gt;string&lt;/span&gt;)e.OutputParameters[&lt;span style="color:purple;"&gt;&amp;quot;ConcatenateReturn&amp;quot;&lt;/span&gt;]);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waitHandle.Set();&lt;/span&gt; &lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;hellip;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:#2b91af;"&gt;ExternalDataExchangeService&lt;/span&gt; externalDataExchangeService = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExternalDataExchangeService&lt;/span&gt;();&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:#00b050;"&gt;&amp;nbsp;&amp;nbsp;// add the external data exchange service to the runtime&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;workflowRuntime.AddService(externalDataExchangeService);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:#00b050;"&gt;// add the external method implementation to the local services&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;color:#00b050;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;// this is where we add the object(that implements IContract)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;color:#00b050;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;// that is going to be invoked by the CallExternalMethodActivity&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;externalDataExchangeService.AddService(&lt;span style="color:blue;"&gt;new&lt;/span&gt; ContractProject.&lt;span style="color:#2b91af;"&gt;ContractImplementation&lt;/span&gt;());&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt; parameters = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;();&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:#00b050;"&gt;&amp;nbsp;&amp;nbsp;// add&amp;nbsp;both paramenters&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;parameters.Add(&lt;span style="color:purple;"&gt;&amp;quot;Parameter1ToConcat&amp;quot;&lt;/span&gt;, &lt;span style="color:purple;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;);&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;parameters.Add(&lt;span style="color:purple;"&gt;&amp;quot;Parameter1ToConcat&amp;quot;&lt;/span&gt;, &lt;span style="color:purple;"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&lt;span style="color:#2b91af;"&gt;WorkflowInstance&lt;/span&gt; instance = workflowRuntime.CreateWorkflow(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&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;&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(WorkflowConsoleApplication1.&lt;span style="color:#2b91af;"&gt;Workflow1&lt;/span&gt;), parameters);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;instance.Start();&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;waitHandle.WaitOne();&lt;/span&gt; &lt;br /&gt;&lt;span style="font-size:9pt;font-family:Consolas;"&gt;}&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=522" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Windows+Workflow+Foundation/default.aspx">Windows Workflow Foundation</category></item><item><title>Como executar pesquisas ao estado de um Workflow de m&#225;quina de estados</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2008/03/09/Como-executar-pesquisas-ao-estado-de-um-Workflow-de-m_E100_quina-de-estados.aspx</link><pubDate>Sun, 09 Mar 2008 20:14:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:480</guid><dc:creator>tpo</dc:creator><slash:comments>1</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/480.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=480</wfw:commentRss><description>&lt;p&gt;Um Workflow de m&amp;aacute;quina de estados permite que sejam efectuadas pesquisas sobre uma inst&amp;acirc;ncia.&lt;/p&gt;&lt;p&gt;&amp;nbsp;Para tal deve-se usar um objecto da classe &lt;a href="http://msdn2.microsoft.com/en-us/library/system.workflow.activities.statemachineworkflowinstance(VS.85).aspx" target="_blank"&gt;StateMachineWorkflowInstance&lt;/a&gt; (System.Workflow.Activities), que permite por exemplo obter a seguinte informa&amp;ccedil;&amp;atilde;o de uma inst&amp;acirc;ncia:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;O estado corrente;&lt;/li&gt;&lt;li&gt;As transi&amp;ccedil;&amp;otilde;es possiveis;&lt;/li&gt;&lt;li&gt;O Hist&amp;oacute;rico das transi&amp;ccedil;&amp;otilde;es;&lt;/li&gt;&lt;li&gt;Enumerar todos os estados da m&amp;aacute;quina de estados&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Exemplo&lt;/p&gt;&lt;p&gt;StateMachineWorkflowInstance stateMachineWorkflowInstance = new StateMachineWorkflowInstance(workflowRuntime, instanceId);&lt;/p&gt;&lt;p&gt;//obter o estado corrente&lt;br /&gt;StateActivity&amp;nbsp;currentStateActivity = stateMachineWorkflowInstance.CurrentState; &lt;/p&gt;&lt;p&gt;//obter os estados poss&amp;iacute;veis de acordo com o estado corrente&lt;br /&gt;ReadOnlyCollection&amp;lt;string&amp;gt; possibleStateTransitions = stateMachineWorkflowInstance.PossibleStateTransitions;&lt;/p&gt;&lt;p&gt;//s&amp;oacute; funciona se &lt;a href="http://msdn2.microsoft.com/en-us/library/ms633870(VS.85).aspx" target="_blank"&gt;SqlTrackingService&lt;/a&gt;&amp;nbsp;est&amp;aacute; a ser usado&lt;br /&gt;ReadOnlyCollection&amp;lt;string&amp;gt; stateHistory = stateMachineWorkflowInstance.StateHistory; &lt;/p&gt;&lt;p&gt;//obter todos os estados&lt;br /&gt;ReadOnlyCollection&amp;lt;StateActivity&amp;gt; stateActivitiesList = stateMachineWorkflowInstance.States;&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=480" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Windows+Workflow+Foundation/default.aspx">Windows Workflow Foundation</category></item><item><title>Ciclo de Webcasts - Introdu&#231;&#227;o ao Windows Workflow Foundation com a Framework 3.5</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2008/03/09/Webcasts-WF-_2D00_-Materiais.aspx</link><pubDate>Sun, 09 Mar 2008 19:15:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:479</guid><dc:creator>tpo</dc:creator><slash:comments>3</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/479.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=479</wfw:commentRss><description>&lt;p&gt;Nos passados dia 3 e 4 de mar&amp;ccedil;o fiz uns webcasts para &lt;a href="http://www.microsoft.com/portugal/msdn/webcasts4share/default.mspx" target="_blank"&gt;Webcasts4share&lt;/a&gt; da&amp;nbsp;Microsoft sob o tema &amp;quot;Introdu&amp;ccedil;&amp;atilde;o ao Windows Workflow Foundation com a Framework 3.5&amp;quot;. Ainda n&amp;atilde;o est&amp;atilde;o dispon&amp;iacute;veis para download,&amp;nbsp;espero no final desta semana,&amp;nbsp;publicar os links para os mesmos.&lt;/p&gt;&lt;p&gt;Os Webcasts tal como indicado foram divididos em duas partes.&lt;/p&gt;&lt;p&gt;Podem fazer aqui o download dos slides da &lt;a href="http://tpo.fileave.com/Webcast/wwf(part1).zip"&gt;parte 1&lt;/a&gt;&amp;nbsp;e da &lt;a href="http://tpo.fileave.com/Webcast/wwf(part2).zip"&gt;parte 2&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A parte 1 foi dividida nos seguintes m&amp;oacute;dulos:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Introdu&amp;ccedil;&amp;atilde;o&lt;/li&gt;&lt;li&gt;Windows Workflow Foundation&lt;/li&gt;&lt;li&gt;Actividades&lt;/li&gt;&lt;li&gt;Workflows Sequenciais&lt;/li&gt;&lt;li&gt;Hosting e Runtime Services&lt;/li&gt;&lt;li&gt;Workflows de m&amp;aacute;quina de estados&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Foram apresentadas&amp;nbsp;as seguintes demonstra&amp;ccedil;&amp;otilde;es, que podem fazer download:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Cria&amp;ccedil;&amp;atilde;o de um Workflow sequencial simples&amp;nbsp;- &lt;a href="http://tpo.fileave.com/Webcast/SimpleSequentialWorkflow.zip"&gt;download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Passagem de par&amp;acirc;metros entre o host e um Workflow sequencial - &lt;a href="http://tpo.fileave.com/Webcast/SimpleSequentialWorkflowWithParameters.zip"&gt;download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Persistencia do estado dos Workflows para Sql-Server - &lt;a href="http://tpo.fileave.com/Webcast/PersistenceServicesWithSqlServer.zip"&gt;download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Cria&amp;ccedil;&amp;atilde;o de um Workflow de m&amp;aacute;quina de estados - &lt;a href="http://tpo.fileave.com/Webcast/SimpleStateMachineWorkflow.zip"&gt;download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Comuni&amp;ccedil;&amp;atilde;o do host com um Workflow de m&amp;aacute;quina de estados assincronamente por eventos - &lt;a href="http://tpo.fileave.com/Webcast/StateMachineCommunication.zip"&gt;download&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;A parte 2 foi dividida em&amp;nbsp;:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Cria&amp;ccedil;&amp;atilde;o de actividades &amp;agrave; medida&lt;/li&gt;&lt;li&gt;Desenvolvimento de Workflows&lt;/li&gt;&lt;li&gt;Novidades na Framework 3.5&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Foram apresentadas&amp;nbsp;as seguintes demonstra&amp;ccedil;&amp;otilde;es:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;Cria&amp;ccedil;&amp;atilde;o de uma actividade que permite escrever para ficheiro - &lt;a href="http://tpo.fileave.com/Webcast/WriteToFileActivity.zip"&gt;download&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Mostrar potencialidades do Designer, fazendo-se as seguintes modifica&amp;ccedil;&amp;otilde;es na actividade anterior (&lt;a href="http://tpo.fileave.com/Webcast/WriteToFileActivityDesigner.zip"&gt;download&lt;/a&gt;):&lt;/div&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Altera&amp;ccedil;&amp;atilde;o do layout&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Cria&amp;ccedil;&amp;atilde;o de um validator&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Acrescentar uma nova op&amp;ccedil;&amp;atilde;o no menu do bot&amp;atilde;o&amp;nbsp;dto do rato, mostrando-se um OpenFileDialog que permitia escolher a localiza&amp;ccedil;&amp;atilde;o do ficheiro&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;div&gt;Cria&amp;ccedil;&amp;atilde;o de um Workflow usando Xml - &lt;a href="http://tpo.fileave.com/Webcast/SequentialMarkupWorkflow.zip"&gt;download&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Compila&amp;ccedil;&amp;atilde;o e execu&amp;ccedil;&amp;atilde;o do Workflow criado no passo anterior por c&amp;oacute;digo - &lt;a href="http://tpo.fileave.com/Webcast/WorkflowMarkupCompileAndExecute.zip"&gt;download&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Invoca&amp;ccedil;&amp;atilde;o&amp;nbsp;de um servi&amp;ccedil;o Wcf pelo Workflow - &lt;a href="http://tpo.fileave.com/Webcast/CallWCFService.zip"&gt;download&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=479" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Windows+Workflow+Foundation/default.aspx">Windows Workflow Foundation</category></item><item><title>Set Sharepoint workflow task permissions</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2007/12/26/Set-Sharepoint-workflow-task-permissions.aspx</link><pubDate>Wed, 26 Dec 2007 22:52:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:457</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/457.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=457</wfw:commentRss><description>&lt;p&gt;I have saw many posts about this problem, many questions but few answers.&lt;/p&gt;&lt;p&gt;&amp;nbsp;So, how do we set permissions to workflow tasks:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;In workflow code behind create a HybridDictionary property something like this: &lt;p&gt;&lt;img alt="WorkflowTaskPermission - Property" height="400" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/294960176.jpg" title="WorkflowTaskPermission - Property" width="480" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Go to the CreateTask action/shape properties &lt;p&gt;&lt;img alt="WorkflowTaskPermission - TaskCreationProperties" height="400" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/294959454.jpg" style="width:480px;height:400px;" title="WorkflowTaskPermission - TaskCreationProperties" width="480" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;The hidden feature is in the SpecialPermissions property &lt;p&gt;When you click the &amp;quot;...&amp;quot; button as usual this window appears&lt;/p&gt;&lt;p&gt;&lt;img alt="WorkflowTaskPermission - wrongWindow.JPG" height="361" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/294955389.jpg" title="WorkflowTaskPermission - wrongWindow.JPG" width="499" /&gt;&lt;/p&gt;&lt;p&gt;The big secret is not to click the &amp;quot;...&amp;quot; button in the SpecialPermissions property, but in the &lt;strong&gt;round blue circle&lt;/strong&gt; near SpecialPermissions, this window appears&lt;/p&gt;&lt;p&gt;&lt;img alt="WorkflowTaskPermission - RightWindow.JPG" height="400" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/294955404.jpg" style="width:497px;height:400px;" title="WorkflowTaskPermission - RightWindow.JPG" width="497" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Choose the right property and it&amp;#39;s working &lt;p&gt;&lt;img alt="WorkflowTaskPermission - ChooseProperty.JPG" height="400" src="http://pic50.picturetrail.com/VOL460/10402378/18629414/294955469.jpg" style="width:497px;height:400px;" title="WorkflowTaskPermission - ChooseProperty.JPG" width="497" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Simple and easy.&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=457" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/MOSS+2007/default.aspx">MOSS 2007</category><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Wss/default.aspx">Wss</category></item><item><title>Microsoft Tech Ed 2007 - Barcelona</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2007/10/15/Microsoft-Tech-Ed-2007-_2D00_-Barcelona.aspx</link><pubDate>Mon, 15 Oct 2007 21:24:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:400</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/400.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=400</wfw:commentRss><description>5-9 Nov 2007, i&amp;#39;ll be there with Jota.&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=400" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Event/default.aspx">Event</category></item><item><title>Custom Property demotion - Using IDocumentSpec and IPropertyAnnotation</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2007/10/04/Custom-Property-demotion-_2D00_-Using-IDocumentSpec-and-IPropertyAnnotation.aspx</link><pubDate>Thu, 04 Oct 2007 08:50:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:398</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/398.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=398</wfw:commentRss><description>&lt;p&gt;Sometimes the property demotion rules are very difficult to apply in the Xml Assembler Pipeline. There are some limitations:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;bull;&amp;nbsp;The Biztalk context dependency forces that data must be in message context when the demote occurs;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;bull;&amp;nbsp;Orchestrations must promote all the data to be demoted, so there is a dependency orchestration -&amp;gt; pipeline;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;bull;&amp;nbsp;The data to demote cannot be accessed by the orchestration;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;bull;&amp;nbsp;The data to be demoted can only be calculated in the pipeline context;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;bull;&amp;nbsp;Little control of the process;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The problem can be solved creating a custom pipeline component. There are two interfaces that can help our job, &lt;strong&gt;IDocumentSpec&lt;/strong&gt; and &lt;strong&gt;IPropertyAnnotation&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;IDocumentSpec&lt;/strong&gt; (&lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.biztalk.component.interop.idocumentspec.aspx"&gt;http://msdn2.microsoft.com/en-us/library/microsoft.biztalk.component.interop.idocumentspec.aspx&lt;/a&gt;) can be obtained by IPipelineContext&amp;nbsp;interface methods GetDocumentSpecByName and GetDocumentSpecByType. It is used to get document or envelope schema property and distinguished fields (by IPropertyAnnotation).&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;IPropertyAnnotation&lt;/strong&gt; interface allow us to access data from property and distinguished fields. &lt;br /&gt;It can be obtained using IDocumentSpec methods GetPropertyAnnotationEnumerator (property fields) or GetDistinguishedPropertyAnnotationEnumerator (distinguished fields).&lt;br /&gt;IPropertyAnnotation has three main properties: Name, Namespace and Xpath:&lt;br /&gt;&amp;bull;&amp;nbsp;Name is the name of the property schema;&lt;br /&gt;&amp;bull;&amp;nbsp;Namespace is the property schema namespace;&lt;br /&gt;&amp;bull;&amp;nbsp;Xpath is the Xpath query to access the schema element;&lt;/p&gt;&lt;p&gt;With these properties we can set any data dynamically in messages. We can use the name and namespace to access context data, query a database or other repository and use Xpath to set the data.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;IDocumentSpec documentSpec = pipelineContext.GetDocumentSpecByName(MESSAGE_SCHEMA_NAME or MESSAGE_ENVELOPE);&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;&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;&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;IEnumerator annotations = documentSpec.GetPropertyAnnotationEnumerator();&lt;/p&gt;&lt;p&gt;while (annotations.MoveNext()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IPropertyAnnotation annotation = (IPropertyAnnotation)annotations.Current;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Use annotation.Name or Namespace to get the data to demote in message&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Make manual demoting using annotation.Xpath.&lt;br /&gt;}&lt;br /&gt;&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; &lt;br /&gt;&lt;strong&gt;Usage scenario&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1.&amp;nbsp;Use IDocumentSpec to retrieve all message schema or envelope annotations;&lt;br /&gt;2.&amp;nbsp;Use annotation Name and Namespace properties&amp;nbsp; to get data to demote (from message context, database or other source);&lt;br /&gt;3.&amp;nbsp;Use&amp;nbsp; annotation Xpath property to make message manual demotion;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=398" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Biztalk+Server/default.aspx">Biztalk Server</category></item><item><title>Dicas relativamente a event handlers de sharepoint</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2007/06/29/Dicas-relativamente-a-event-handlers-de-sharepoint.aspx</link><pubDate>Fri, 29 Jun 2007 11:29:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:370</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/370.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=370</wfw:commentRss><description>&lt;p&gt;Aqui v&amp;atilde;o algumas dicas no desenvolvimento de handlers de sharepoint:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Um event handler relativamente a items, usa as permiss&amp;otilde;es do utilizador que o submete.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ter&amp;aacute; de se ter cuidado, pois esta situa&amp;ccedil;&amp;atilde;o representa um enorme factor de bugs/problemas. Em caso de se manipular informa&amp;ccedil;&amp;atilde;o n&amp;atilde;o acessivel a todos os utilizadores, fazer impersonate. Ver &lt;a href="http://dotnetjunkies.com/WebLog/victorv/archive/category/2032.aspx"&gt;http://dotnetjunkies.com/WebLog/victorv/archive/category/2032.aspx&lt;/a&gt;&amp;nbsp;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Existe uma enorme confus&amp;atilde;o relativamente &amp;agrave;s propriedades After e BeforeProperties.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Nos testes efectuados estas propriedades n&amp;atilde;o apareciam preenchidas no evento ItemUpdated, logo n&amp;atilde;o tinha forma de obter valores anteriores ao update. A solu&amp;ccedil;&amp;atilde;o passa por escrever em properties.AfterProperties (properties.BeforeProperties &amp;eacute; read only) os dados desejados no evento ItemUpdating.&lt;/p&gt;&lt;p&gt;properties.AfterProperties[&amp;quot;xpto&amp;quot;] = properties.ListItem[&amp;quot;xpto&amp;quot;]&lt;/p&gt;&lt;p&gt;&amp;nbsp;Assim em ItemUpdated, poderemos sempre obter o &amp;quot;estado anterior&amp;quot; do item.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Para criar/editar as permiss&amp;otilde;es de qualquer item submetido, d&amp;aacute; imenso jeito&amp;nbsp;usar&amp;nbsp;o objecto Contact (Microsoft.Office.Workflow.Utility). O mesmo poder&amp;aacute; ser criado usando o seguinte m&amp;eacute;todo est&amp;aacute;tico Contact.FromName(contactName, site).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal static void SetPermissions(SPWeb web, ref SPListItem listItem, IList&amp;lt;Contact&amp;gt; itemUsers, SPRoleType roleType)&lt;br /&gt;&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; if (itemUsers != null &amp;amp;&amp;amp; itemUsers.Count &amp;gt; 0)&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;&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; //Get Role Definition from SPWeb&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; SPRoleDefinition roleDefinition = web.RoleDefinitions.GetByType(roleType);&lt;/p&gt;&lt;p&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; foreach (Contact contact in itemUsers)&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; {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPRoleAssignment roleAssignment = new SPRoleAssignment(contact.LoginName,&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;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contact.EmailAddress,&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;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contact.DisplayName,&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;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; null);&lt;/p&gt;&lt;p&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; roleAssignment.RoleDefinitionBindings.Add(roleDefinition);&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;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; listItem.RoleAssignments.Add(roleAssignment);&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;&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; }&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; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=370" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/MOSS+2007/default.aspx">MOSS 2007</category></item><item><title>Criar um webservice para aceder ao contexto do Windows SharePoint Services 3.0</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2007/04/04/Criar-um-webservice-para-Windows-SharePoint-Services-3.0.aspx</link><pubDate>Wed, 04 Apr 2007 23:12:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:327</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/327.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=327</wfw:commentRss><description>&lt;p&gt;O processo de cria&amp;ccedil;&amp;atilde;o de um webservice para aceder ao&amp;nbsp;contexto do Windows Sharepoint Services 3.0 &amp;eacute; uma tarefa de certa forma complexa, ter&amp;atilde;o de se efectuar um conjunto de passos que descrevo nos pontos seguintes:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Criar Webservice&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Assinar a assembly e registar na gac&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Colocar assembly do webservice na virtual directory &amp;quot;bin&amp;quot; da web do sharepoint (por omiss&amp;atilde;o C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Colocar .asmx na virtual directory &amp;quot;_vti_bin&amp;quot; da web do sharepoint (por omiss&amp;atilde;o em C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\isapi)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Usar a tool &amp;quot;Disco.exe&amp;quot;(por omiss&amp;atilde;o em c:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin) sobre o asmx copiado no ponto anterior. Ser&amp;atilde;o criados dois ficheiros na mesma pasta onde se encontra a tool Disco (exemplo ws.disco e ws.wsdl) &lt;br /&gt;Por exemplo &amp;quot;disco http://localhost:2214/_vti_bin/ws.asmx&amp;quot;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Renomear os ficheiros disco e wsdl criados no ponto anterior para &amp;quot;Nome do webservice&amp;quot;disco.aspx e &amp;quot;Nome do webservice&amp;quot;wsdl.aspx&lt;br /&gt;Por exemplo quando o webservice se chama ws.asmx, ter&amp;atilde;o de se renomear para wsdisco.aspx e wswsdl.aspx&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Abrir ficheiro wsdl e executar os seguintes passos:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Substituir directiva xml (&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt; )&amp;nbsp;por&lt;br /&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.UI.Page&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ Assembly Name=&amp;quot;Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt; &lt;br /&gt;&amp;lt;%@ Import Namespace=&amp;quot;Microsoft.SharePoint.Utilities&amp;quot; %&amp;gt; &lt;br /&gt;&amp;lt;%@ Import Namespace=&amp;quot;Microsoft.SharePoint&amp;quot; %&amp;gt; &lt;br /&gt;&amp;lt;% Response.ContentType = &amp;quot;text/xml&amp;quot;; %&amp;gt; &lt;/li&gt;&lt;li&gt;Onde est&amp;aacute; soap address, colocar a instru&amp;ccedil;&amp;atilde;o seguinte&lt;br /&gt;&amp;lt;soap:address location=&amp;lt;% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), &amp;#39;&amp;quot;&amp;#39;); %&amp;gt; /&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;Abrir ficheiro disco e executar o seguinte passo:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Substituir directiva xml (&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt; )&amp;nbsp;por&lt;br /&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.UI.Page&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; %&amp;gt;&lt;br /&gt;&amp;lt;%@ Assembly Name=&amp;quot;Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ Import Namespace=&amp;quot;Microsoft.SharePoint.Utilities&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ Import Namespace=&amp;quot;Microsoft.SharePoint&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;% Response.ContentType = &amp;quot;text/xml&amp;quot;; %&amp;gt; &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;Colocar o ficheiro disco e wsdl na mesma pasta do asmx (ponto 4)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Na virtual directory _vti_bin da web do sharepoint (por omiss&amp;atilde;o C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\isapi) no ficheiro spdisco.aspx acrescentar o seguinte &lt;br /&gt;&amp;lt;contractRef&amp;nbsp; ref=&amp;lt;% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + &amp;quot;/_vti_bin/&lt;strong&gt;ws&lt;/strong&gt;.asmx?wsdl&amp;quot;),Response.Output); %&amp;gt; docRef=&amp;lt;% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + &amp;quot;/_vti_bin/&lt;strong&gt;ws&lt;/strong&gt;.asmx&amp;quot;),Response.Output); %&amp;gt; xmlns=&amp;quot;http://schemas.xmlsoap.org/disco/scl/&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;discoveryRef ref=&amp;lt;% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + &amp;quot;/_vti_bin/&lt;strong&gt;ws&lt;/strong&gt;.asmx?disco&amp;quot;),Response.Output); %&amp;gt; xmlns=&amp;quot;http://schemas.xmlsoap.org/disco/&amp;quot; /&amp;gt; &lt;br /&gt;Nota, o que est&amp;aacute; a &lt;strong&gt;bold&lt;/strong&gt;, substituir pelo nome do webservice&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No projecto cliente, quando se faz a referencia para o webservice, deve-se colocar ?wsdl ap&amp;oacute;s o mesmo. Ap&amp;oacute;s a cria&amp;ccedil;&amp;atilde;o do proxy, deve-se verificar se o caminho para o webservice n&amp;atilde;o conter o &amp;ldquo;?wsdl&amp;rdquo; &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Para mais informa&amp;ccedil;&amp;otilde;es ir a &lt;a href="http://msdn2.microsoft.com/en-us/library/ms464040.aspx"&gt;Walkthrough: Creating a Custom Web Service&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=327" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/MOSS+2007/default.aspx">MOSS 2007</category></item><item><title>Terminar orquestra&#231;&#245;es suspensas usando WMI</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2006/12/03/Terminar-orquestra_E700F500_es-suspensas-usando-WMI.aspx</link><pubDate>Sun, 03 Dec 2006 18:06:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:259</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/259.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=259</wfw:commentRss><description>&lt;p&gt;Quem est&amp;aacute; farto de usar o Hat para terminar orquestra&amp;ccedil;&amp;otilde;es suspensas,&amp;nbsp;poder&amp;aacute; usar um script&amp;nbsp;WMI da seguinte forma:&lt;/p&gt;&lt;p&gt;query = &amp;quot;SELECT * FROM MSBTS_ServiceInstance where ServiceClass = 1 and &lt;font size="2"&gt;ServiceInstanceStatus = 32&lt;/font&gt;&lt;br /&gt;Set instSet = GetObject(&amp;quot;Winmgmts:!root\MicrosoftBizTalkServer&amp;quot;).ExecQuery(Query) &amp;nbsp; &lt;br /&gt;For Each inst In instSet &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; inst.Terminate&amp;nbsp;&lt;br /&gt;Next &lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;ServiceInstanceStatus&lt;br /&gt;&lt;font size="2"&gt;1-&amp;quot;Ready to run&amp;quot;, 2 -&lt;/font&gt;&lt;font size="2"&gt;&amp;quot;Active&amp;quot;,&amp;nbsp;4 - &lt;/font&gt;&lt;font size="2"&gt;&amp;quot;Suspended (resumable)&amp;quot;,&amp;nbsp;8 - &amp;quot;Dehydrated&amp;quot;, 16 - &amp;quot;Completed with discarded messages&amp;quot;, 32 - &amp;quot;Suspended (not resumable)&amp;quot;, 64 - &amp;quot;In breakpoint&amp;quot;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;Caso se pretenda suspender um determinado tipo de orquestra&amp;ccedil;&amp;atilde;o, poder&amp;aacute; usar-se a seguinte query:&lt;/p&gt;&lt;p&gt;SELECT * FROM MSBTS_ServiceInstance where ServiceClass = 1 and ServiceInstanceStatus = 32&amp;nbsp;and AssemblyName=&amp;#39;NOME DA ASSEMBLY&amp;#39;&lt;/p&gt;&lt;p&gt;Se se pretender algo mais especifico o schema do wmi para o bizatlk encontra-se em BTSWMISchema.mof na mesma pasta onde foi instalado o biztalk.&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=259" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Biztalk+Server/default.aspx">Biztalk Server</category></item><item><title>Publica&#231;&#227;o de v&#225;rios tipos de mensagens para o Biztalk por Web Service</title><link>http://blogit.create.pt/blogs/tiagooliveira/archive/2006/11/20/Publica_E700E300_o-de-v_E100_rios-tipos-de-mensagens-para-o-Biztalk-por-Web-Service.aspx</link><pubDate>Mon, 20 Nov 2006 13:13:00 GMT</pubDate><guid isPermaLink="false">82e6d864-cc1c-4326-bdf8-b027608494f4:249</guid><dc:creator>tpo</dc:creator><slash:comments>0</slash:comments><comments>http://blogit.create.pt/blogs/tiagooliveira/comments/249.aspx</comments><wfw:commentRss>http://blogit.create.pt/blogs/tiagooliveira/commentrss.aspx?PostID=249</wfw:commentRss><description>&lt;p&gt;A publica&amp;ccedil;&amp;atilde;o de&amp;nbsp;mensagens de diversos schemas para&amp;nbsp;o Biztalk, envolve um conjunto de quest&amp;otilde;es.&lt;/p&gt;&lt;p&gt;Normalmente segue-se&amp;nbsp;a abordagem de criar Web Services com os Schemas das mensagens usando o &amp;ldquo;Web Service Publishing Wizard&amp;rdquo;. Essa abordagem&amp;nbsp;deve ser logo&amp;nbsp;posta de parte, pois devido a um&amp;nbsp;elevado n&amp;uacute;mero de tipos de mensagens, faz com que a cria&amp;ccedil;&amp;atilde;o de um Webservice por tipo de schema&amp;nbsp;se torne impratic&amp;aacute;vel.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Assim colocam-se dois problemas:&lt;/p&gt;&lt;ol style="margin-top:0cm;"&gt;&lt;li&gt;Como criar um webservice gen&amp;eacute;rico para publicar qualquer tipo de mensagem. &lt;/li&gt;&lt;li&gt;Como fazer o &amp;ldquo;cast&amp;rdquo; da mensagem gen&amp;eacute;rica para o tipo de mensagem propriamente dita, para poder ser consumida pelo subscritor respectivo. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;Para criar um Web Service gen&amp;eacute;rico, para qualquer tipo de mensagem: &lt;/p&gt;&lt;ol style="margin-top:0cm;"&gt;&lt;li&gt;Executar o &amp;ldquo;Web Service Publishing Wizard&amp;rdquo; &lt;/li&gt;&lt;li&gt;Seleccionar &amp;ldquo;Publish Schema as A Web Service&amp;rdquo; &lt;/li&gt;&lt;li&gt;Remover &amp;ldquo;WebService1&amp;rdquo; &lt;/li&gt;&lt;li&gt;Com o bot&amp;atilde;o direito do rato, seleccionar &amp;ldquo;Add Web Service&amp;rdquo; &lt;/li&gt;&lt;li&gt;Com o bot&amp;atilde;o direito do rato, seleccionar WebService1 e seleccionar &amp;ldquo;web method, One-Way&amp;rdquo; &lt;/li&gt;&lt;li&gt;Com o bot&amp;atilde;o direito do rato, seleccionar o parametro &amp;ldquo;Request&amp;rdquo; e &amp;ldquo;Schema Type&amp;rdquo; &lt;/li&gt;&lt;li&gt;Seleccionar qualquer dll com um schema (pode ser qualquer schema)&lt;/li&gt;&lt;li&gt;Seleccionar &amp;ldquo;Next&amp;rdquo; &lt;/li&gt;&lt;li&gt;Seleccionar &amp;ldquo;Create Biztalk Receive Locations&amp;rdquo; &lt;/li&gt;&lt;li&gt;Seleccionar &amp;ldquo;Next&amp;rdquo; &lt;/li&gt;&lt;li&gt;Seleccionar &amp;ldquo;Create&amp;rdquo; &lt;/li&gt;&lt;li&gt;O Web Service &amp;eacute; criado &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;O Wizard cria um Webservice para o Schema especificado, no pr&amp;oacute;ximo passo, ir&amp;aacute; alterar-se o mesmo para receber um tipo de mensagem gen&amp;eacute;rico.&lt;/p&gt;&lt;p&gt;Editar o Web Service&lt;/p&gt;&lt;ol style="margin-top:0cm;"&gt;&lt;li&gt;Abrir o Web Service criado &lt;/li&gt;&lt;li&gt;Editar a assinatura do mesmo para parecer da seguinte forma: public void WebMethod1(System.Xml.XmlDocument part) &lt;/li&gt;&lt;li&gt;Procurar pela linha que tem a cria&amp;ccedil;&amp;atilde;o da vari&amp;aacute;vel inParamInfos e alterar o typeof para System.Xml.XmlDocument. &lt;br /&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Caso se tenha alterado o nome do par&amp;acirc;metro de entrada, tamb&amp;eacute;m ter&amp;aacute; de se alterar o nome do mesmo ap&amp;oacute;s a instru&amp;ccedil;&amp;atilde;o typeof &lt;/li&gt;&lt;li&gt;Alterar a vari&amp;aacute;vel bodyTypeAssemblyQualifiedName para string.empty &lt;/li&gt;&lt;li&gt;Apagar os ficheiros DataTypes.cs e WsdlExtension.cs &lt;/li&gt;&lt;li&gt;Compilar, invocar com um xml exemplo e verificar se a mensagem entra na MessageBox&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Principal fonte &lt;a href="http://geekswithblogs.com/sthomas/" title="blocked::http://geekswithblogs.com/sthomas/
http://geekswithblogs.com/sthomas/"&gt;http://geekswithblogs.com/sthomas/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ap&amp;oacute;s o primeiro problema resolvido, resta-nos criar um processo de fazer &amp;quot;cast&lt;em&gt;&amp;quot;&lt;/em&gt; das mensagens publicadas para um tipo conhecido, para facilitar o processo de subscri&amp;ccedil;&amp;atilde;o.&lt;/p&gt;&lt;p&gt;A ideia partiu do meu colega Jo&amp;atilde;o Martins (Jota), para tal s&amp;oacute; ter&amp;aacute; de se criar uma pipeline de receive, colocar na mesma uma Componente &amp;ldquo;Xml disassembler&amp;rdquo; e nas propriedades da mesma em &amp;ldquo;Document Schemas&amp;rdquo; colocar todos os Schemas de todos os tipos de mensagens que ir&amp;atilde;o ser publicadas por este Web Service.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; para evitar a publica&amp;ccedil;&amp;atilde;o de tipos de mensagens n&amp;atilde;o desejados, poder&amp;aacute; tamb&amp;eacute;m colocar-se a propriedade &amp;ldquo;Allow unrecognized message&amp;rdquo; a &amp;ldquo;false&amp;rdquo;.&lt;/p&gt;&lt;p&gt;Ap&amp;oacute;s a configura&amp;ccedil;&amp;atilde;o e deploy da pipeline, s&amp;oacute; ter&amp;aacute; de se colocar o receive location do WebService a usar esta pipeline.&lt;/p&gt;&lt;p&gt;Ap&amp;oacute;s a implementa&amp;ccedil;&amp;atilde;o anterior, temos um Webservice que suporta a publica&amp;ccedil;&amp;atilde;o de N tipos de mensagens.&lt;/p&gt;&lt;img src="http://blogit.create.pt/aggbug.aspx?PostID=249" width="1" height="1"&gt;</description><category domain="http://blogit.create.pt/blogs/tiagooliveira/archive/tags/Biztalk+Server/default.aspx">Biztalk Server</category></item></channel></rss>
