<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Nima Kamoosi</title><subtitle type="html">Dynamics AX Services and Integration Tips</subtitle><id>http://blogs.msdn.com/b/nima_kamoosi/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nima_kamoosi/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/nima_kamoosi/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2013-01-05T01:15:00Z</updated><entry><title>Using CallContext with System Services</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/nima_kamoosi/archive/2013/01/05/walkthrough-of-using-callcontext-with-system-services.aspx" /><id>http://blogs.msdn.com/b/nima_kamoosi/archive/2013/01/05/walkthrough-of-using-callcontext-with-system-services.aspx</id><published>2013-01-05T01:15:00Z</published><updated>2013-01-05T01:15:00Z</updated><content type="html">&lt;p&gt;Callers of a Custom X++ Service can specify CallContext as part of the operation signature&amp;nbsp;on the generated service reference proxy. See &lt;a href="http://technet.microsoft.com/en-us/library/hh582244.aspx"&gt;http://technet.microsoft.com/en-us/library/hh582244.aspx&lt;/a&gt;. However the operation signatures for AX System services, like the Query Service and Metadata Service, do not include a CallContext parameter. The call context needs to be passed in manually as an operation header using a few WCF tricks.&lt;/p&gt;
&lt;p&gt;The linked sample code walks through the scenario of listing the companies for a given AX partition. This requires the caller to specify the PartitionKey value as part of the CallContext operation header.&amp;nbsp;&amp;nbsp;Similar approach can be used for&amp;nbsp;other CallContext scenarios including setting of Company context or&amp;nbsp;specifying a LogOnAs value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Access the code sample here&lt;/strong&gt;: &lt;a href="http://code.msdn.microsoft.com/Walkthrough-of-using-73c07391"&gt;http://code.msdn.microsoft.com/Walkthrough-of-using-73c07391&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After downloading the sample code run through the following steps:&lt;/p&gt;
&lt;div&gt;1. Create a new Parition. &lt;a href="http://technet.microsoft.com/EN-US/library/jj677455.aspx"&gt; http://technet.microsoft.com/EN-US/library/jj677455.aspx&lt;/a&gt;&lt;br /&gt; 2. Open the AX client to show created partition. &lt;a href="http://technet.microsoft.com/EN-US/library/jj670112.aspx"&gt; http://technet.microsoft.com/EN-US/library/jj670112.aspx&lt;/a&gt;&lt;br /&gt; 3. Create company accounts. &lt;a href="http://technet.microsoft.com/en-us/library/dd362102.aspx"&gt; http://technet.microsoft.com/en-us/library/dd362102.aspx&lt;/a&gt;&lt;br /&gt; 4. Set value of PartitionKey in code as&amp;nbsp;appropriate.&lt;/div&gt;
&lt;div&gt;5. Run the application in debug mode.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;Since the CallContext data contract is not available for these services,&amp;nbsp;the following data contract&amp;nbsp;can be used to code against.&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-family: courier new,courier;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;/// Call Context data contract to be used as header with system service calls.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;[DataContract(Name = CallContext.Name, Namespace = CallContext.Namespace)]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;public class CallContext&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const string Name = "CallContext";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const string Namespace = "&lt;a href="http://schemas.microsoft.com/dynamics/2010/01/datacontracts"&gt;http://schemas.microsoft.com/dynamics/2010/01/datacontracts&lt;/a&gt;";&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Company { get; set; }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Language { get; set; }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string LogonAsUser { get; set; }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string MessageId { get; set; }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string PartitionKey { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;em&gt;&lt;em&gt;The code required for adding the call context to the operation header is as follows:&lt;/em&gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-family: courier new,courier;"&gt;&lt;em&gt;&lt;span class="cs__com"&gt;//&amp;nbsp;Get&amp;nbsp;client&amp;nbsp;channel&amp;nbsp;and&amp;nbsp;the&amp;nbsp;equivalent&amp;nbsp;object&amp;nbsp;cast&amp;nbsp;to&amp;nbsp;service&amp;nbsp;interface&lt;/span&gt;&amp;nbsp;&lt;br /&gt;var&amp;nbsp;channel&amp;nbsp;=&amp;nbsp;queryClient.InnerChannel;&amp;nbsp;&lt;br /&gt;var&amp;nbsp;queryChannel&amp;nbsp;=&amp;nbsp;(QueryService.IQueryService)channel;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="cs__com"&gt;//&amp;nbsp;Create&amp;nbsp;an&amp;nbsp;operation&amp;nbsp;context&amp;nbsp;scope&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="cs__keyword"&gt;using&lt;/span&gt;&amp;nbsp;(OperationContextScope&amp;nbsp;operationContextScope&amp;nbsp;=&amp;nbsp;&lt;span class="cs__keyword"&gt;new&lt;/span&gt;&amp;nbsp;OperationContextScope(channel))&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="cs__com"&gt;//&amp;nbsp;Add&amp;nbsp;Call&amp;nbsp;Context&amp;nbsp;header&amp;nbsp;to&amp;nbsp;current&amp;nbsp;operation&amp;nbsp;context&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;header&amp;nbsp;=&amp;nbsp;MessageHeader.CreateHeader(CallContext.Name,&amp;nbsp;CallContext.Namespace,&amp;nbsp;callContext);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OperationContext.Current.OutgoingMessageHeaders.Add(header);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="cs__com"&gt;//&amp;nbsp;Execute&amp;nbsp;service&amp;nbsp;operation&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QueryService.Paging&amp;nbsp;paging&amp;nbsp;=&amp;nbsp;&lt;span class="cs__keyword"&gt;null&lt;/span&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataSet&amp;nbsp;=&amp;nbsp;queryChannel.ExecuteQuery(query,&amp;nbsp;&lt;span class="cs__keyword"&gt;ref&lt;/span&gt;&amp;nbsp;paging);&amp;nbsp;&lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10382519" width="1" height="1"&gt;</content><author><name>Nima Kamoosi</name><uri>http://blogs.msdn.com/nkamoosi_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Dynamics AX" scheme="http://blogs.msdn.com/b/nima_kamoosi/archive/tags/Dynamics+AX/" /><category term="WCF" scheme="http://blogs.msdn.com/b/nima_kamoosi/archive/tags/WCF/" /><category term="System Services" scheme="http://blogs.msdn.com/b/nima_kamoosi/archive/tags/System+Services/" /><category term="CallContext" scheme="http://blogs.msdn.com/b/nima_kamoosi/archive/tags/CallContext/" /></entry></feed>