<?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">Brad Bont's Tales from a Road Warrior</title><subtitle type="html" /><id>http://blogs.msdn.com/bbont/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/bbont/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/bbont/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2008-05-30T10:32:32Z</updated><entry><title>Constructor on type 'CustomOrderForm’ Not Found</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/bbont/archive/2009/02/27/constructor-on-type-customorderform-not-found.aspx" /><id>http://blogs.msdn.com/bbont/archive/2009/02/27/constructor-on-type-customorderform-not-found.aspx</id><published>2009-02-28T03:06:54Z</published><updated>2009-02-28T03:06:54Z</updated><content type="html">&lt;p&gt;I have been working with the Commerce Server 2009 RTM (Mojave) codebase.&amp;#160; While upgrading a site from the previous Mojave CTP I came across an interesting error.&amp;#160; It appeared the .net reflection subsystem was not able to find the constructor on my CustomOrderForm object.&amp;#160; This had always worked in the past, so I reflected on the Commerce Server 2009 API and found the offending method in the Microsoft.Commerce.Providers.Utility.CommerceServerClassFactory object:&lt;/p&gt;  &lt;p&gt;public static TBaseCommerceServerClass CreateInstance   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TBaseCommerceServerClass&amp;gt;(string mojaveModelName, CommerceServerArea? commerceArea, object[] args)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; where TBaseCommerceServerClass: class    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ParameterChecker.CheckForNullOrEmpty(mojaveModelName, &amp;quot;mojaveModelName&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; EntityMapping mapping = CommerceEntityMetadata.Get(mojaveModelName, commerceArea)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; .EntityMappings.Items&amp;lt;EntityMapping&amp;gt;().Single&amp;lt;EntityMapping&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Type type = Type.GetType(mapping.CommerceServerClass + &amp;quot;, &amp;quot; +    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mapping.CommerceServerAssembly, true);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; TBaseCommerceServerClass local = Activator.CreateInstance(type, &lt;strong&gt;args&lt;/strong&gt;) as TBaseCommerceServerClass;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (local == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidCastException(ProviderResources.ExceptionMessages    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .GetMessage(&amp;quot;InvalidClassToInstantiate&amp;quot;, new object[] { type,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(TBaseCommerceServerClass) }));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return local;    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;The args array contained a single “default” string member.&amp;#160; This didn’t make sense because I knew that Commerce Server Orderform base class has no constructor which accepts a type string.&amp;#160; After spending considerable time reviewing the code in the stack trace I thought I might have uncovered a bug.&amp;#160; It turns out that this was implemented by design.&amp;#160; So what this means is you now have to add a new constructor which accepts a string to all your types which inherit from Orderform.&amp;#160; The really strange thing is that the string serves no purpose in the CustomOrderForm type.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9449933" width="1" height="1"&gt;</content><author><name>bbont</name><uri>http://blogs.msdn.com/members/bbont.aspx</uri></author></entry><entry><title>Mojave - Creating custom Operation</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/bbont/archive/2008/11/10/mojave-creating-custom-operation.aspx" /><id>http://blogs.msdn.com/bbont/archive/2008/11/10/mojave-creating-custom-operation.aspx</id><published>2008-11-10T23:48:23Z</published><updated>2008-11-10T23:48:23Z</updated><content type="html">&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/bbont/WindowsLiveWriter/MojaveCreatingcustomOperation_CFEA/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="349" alt="image" src="http://blogs.msdn.com/blogfiles/bbont/WindowsLiveWriter/MojaveCreatingcustomOperation_CFEA/image_thumb_1.png" width="535" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This diagram is taken from the PDC 2008 session &amp;quot;Commerce Server - Mojave&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I included the above diagram because I think it help visualize where Operations and OperationSequences fit into the overall solution.&amp;#160; Mojave provides CRUD type operations at the entity level through the implementation of operations.&amp;#160; So, for example, when you want to retrieve products from Mojave you would call the &amp;quot;QueryOperation_Product&amp;quot; operation.&amp;#160; You will inevitably find a need to create your own Operations based on constructs which don't directly relate to entities in Commerce Server.&amp;#160; In some cases I am finding it useful to create operations in terms of Use Cases not simply Commerce Entities.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Business Problem&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Information is stored in several disparate systems which is required by the web to provide a feature rich shopping experience.&amp;#160; The decision was made not to create a series of night synchronizations to keep this information up to date.&amp;#160; Instead, during the execute of a use case we need to get this information and store it in Commerce Server.&amp;#160; Then as the customer continues to browse the site, calls for this information will go directly against Commerce Server. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There are a couple of ways this solution could be implemented with Mojave.&amp;#160; The first would be to create a series of operationsequences to perform CRUD operations against each disparate system.&amp;#160; I think this would be good if you were going to be CRUD heavy to those systems.&amp;#160; The second option would be to create a single operation sequence called &amp;quot;QueryOperation_UseCase&amp;quot;.&amp;#160; Then inside the QueryOperation, create a component for each call to the disparate systems.&amp;#160; More often than not in a SOA enabled environment, you are calling a web service to perform an operation against a system and those operations aren't tied to direct CRUD operations on an entity.&amp;#160; So for this solution we will follow option 2.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/bbont/WindowsLiveWriter/MojaveCreatingcustomOperation_CFEA/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="32" alt="image" src="http://blogs.msdn.com/blogfiles/bbont/WindowsLiveWriter/MojaveCreatingcustomOperation_CFEA/image_thumb_2.png" width="331" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;1. First, you need to create or update an existing Channel in the MetadataDefinitions.xml.&amp;#160; If you are using the SampleSite available on the Connect site, you can update the &amp;quot;TestChannel&amp;quot;.&amp;#160; Add a CommerceEntity node for your Use Case (EntityName).&lt;/p&gt;  &lt;p&gt;&amp;lt;CommerceEntity name=&amp;quot;UseCase&amp;quot;&amp;gt;&amp;lt;/CommerceEntity&amp;gt;&lt;/p&gt;  &lt;p&gt;2. Add a Channel child node to the Channels node in the ChannelConfiguration.config.&amp;#160; The channel name is set to &amp;quot;TestChannel&amp;quot;, the sitename is set to &amp;quot;SampleSite&amp;quot; based on SampleSite.pup, and the language is set to english.&lt;/p&gt;  &lt;p&gt;3. Add a &amp;quot;MessageHandlers&amp;quot; child node to the Channel node then add a &amp;quot;MessageHandler&amp;quot; child node to the &amp;quot;MessageHandlers&amp;quot; node.&amp;#160; In the &amp;quot;MessageHandler&amp;quot; node, set the name to &amp;quot;OperationQuery_UseCase&amp;quot;.&amp;#160; If this were a different operation type, you would set this appropriately.&amp;#160; Set the &amp;quot;ResponseType&amp;quot; to the standard &amp;quot;QueryOperationResponse&amp;quot;.&lt;/p&gt;  &lt;p&gt;4. Add a &amp;quot;OperationPipeline&amp;quot; child node to the &amp;quot;MessageHandler&amp;quot; node then add a &amp;quot;Component&amp;quot; child node to the &amp;quot;OperationPipeline&amp;quot; node.&amp;#160; In a previous blog article I talk about creating custom components.&lt;/p&gt;  &lt;p&gt;&amp;lt;Channels&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Channel name=&amp;quot;TestChannel&amp;quot; sitename=&amp;quot;SampleSite&amp;quot; language=&amp;quot;English&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;MessageHandlers&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;MessageHandler name=&amp;quot;QueryOperation_UseCase&amp;quot; responseType=&amp;quot;Microsoft.Commerce.Contracts.Messages.QueryOperationResponse, Microsoft.Commerce.Contracts, Version=1.0.0.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;OperationPipeline&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Component name=&amp;quot;DisparateSystemProvider&amp;quot; type=&amp;quot;DisparateSystemMojaveLib.GetCustomerInfo, DisparateSystemMojaveLib, Version=1.0.0.0, Culture=neutral,PublicKeyToken=404bf9ce77dd9381&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/OperationPipeline&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/MessageHandler&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/MessageHandlers&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Channel&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/Channels&amp;gt;&lt;/p&gt;  &lt;p&gt;5. Create the Custom component defined in the Component node above.&lt;/p&gt;  &lt;p&gt;6. Create a class which inherits from CommerceEntity.&amp;#160; Assign the ModelName to the UseCase.&amp;#160; The class needs to be visible in the code which is going to call into the QueryOperation.&lt;/p&gt;  &lt;p&gt;public class UseCase: CatalogEntity   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// Initializes a new instance of the &amp;lt;see cref=&amp;quot;UseCase&amp;quot;/&amp;gt; class.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public Login()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : base()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._commerceEntity = new CommerceEntity(&amp;quot;UseCase&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public Login(CommerceEntity commerceEntity)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : base(commerceEntity)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._commerceEntity = commerceEntity;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;7. Create the business logic to call the operation which executes the OperationalSequence.&lt;/p&gt;  &lt;p&gt;// Create a Operation Service Agent   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OperationServiceAgent _operationService = new OperationServiceAgent(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Query for a UseCase   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Query&amp;lt;UseCase&amp;gt; queryBuilder = new Query&amp;lt;UseCase&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Process the Request   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Response response = _operationService.ProcessRequest(Utility.CreateRequestContext(), queryBuilder.ToRequest());    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; QueryOperationResponse queryBuilderResponse = (QueryOperationResponse)response.OperationResponses[0]; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UseCase UC= new UseCase(queryBuilderResponse.CommerceEntities[0]);&lt;/p&gt;  &lt;p&gt;At this point you should be ready to test the solution.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9058667" width="1" height="1"&gt;</content><author><name>bbont</name><uri>http://blogs.msdn.com/members/bbont.aspx</uri></author></entry><entry><title>Mojave Overview</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/bbont/archive/2008/11/10/mojave-overview.aspx" /><id>http://blogs.msdn.com/bbont/archive/2008/11/10/mojave-overview.aspx</id><published>2008-11-10T22:24:52Z</published><updated>2008-11-10T22:24:52Z</updated><content type="html">&lt;p&gt;In my last blog I explained how to create a custom OperationalSequence component.&amp;#160; It occurred to me that people might want a little more insight into Mojave.&amp;#160; PDC 2008 had a great session on Mojave which was led by Tom Schultz and Kerry Havas.&amp;#160; &lt;/p&gt;  &lt;p&gt;Here is the link: &lt;a title="http://channel9.msdn.com/pdc2008/PC59/" href="http://channel9.msdn.com/pdc2008/PC59/"&gt;http://channel9.msdn.com/pdc2008/PC59/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9058527" width="1" height="1"&gt;</content><author><name>bbont</name><uri>http://blogs.msdn.com/members/bbont.aspx</uri></author></entry><entry><title>Creating a Custom Mojave OperationalSequence Component</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/bbont/archive/2008/10/29/creating-a-custom-mojave-operationalsequence-component.aspx" /><id>http://blogs.msdn.com/bbont/archive/2008/10/29/creating-a-custom-mojave-operationalsequence-component.aspx</id><published>2008-10-29T18:48:21Z</published><updated>2008-10-29T18:48:21Z</updated><content type="html">&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In many enterprises product/catalog information is stored across many disparate systems.&amp;#160; One of the big challenges was finding an effective way to aggregate that information on the web to facilitate the customers buying experience.&amp;#160; This caused many Commerce Server engagements to be heavy on the integration side as you worked to get all the necessary information into the Commerce Server Catalog.&amp;#160; For this example lets assume our enterprise stored custom product description information in an ERP system.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mojave Solution&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mojave is implemented using&amp;#160; Operational Sequences to service requests.&amp;#160; An operational pipeline is implemented using a pipeline style pattern similar to ASP.NET.&amp;#160; The pipeline represents a sequence of operations.&amp;#160; Each component in the Operational Sequence is a discrete unit of work.&amp;#160; Mojave gives you the ability to extend its pipelines through configuration files and custom component development.&amp;#160; &lt;/p&gt;  &lt;p&gt;For querying product information we would use the QueryOperation_Product (pipeline).&amp;#160; In our scenario, we will create a custom OperationalSequence, ProductDescriptionQuery, which is a&amp;#160; component to call out to our ERP system to grab additional product description information.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The following example assumes you have installed the Mojave October CTP and have downloaded the SampleSite.pup available on the Connect site.&amp;#160; Also, this code could change based on the next release of Mojave.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;1. Unpup the SampleSite. I typically do a custom unpup and set all the properties myself.&lt;/p&gt;  &lt;p&gt;2. Using Commerce Server Catalog Schema Manager, extend the Commerce Server catalog schema and add the &amp;#8220;AdditionalDescription&amp;#8221; property definition.&lt;/p&gt;  &lt;p&gt;a. Property Type : Text&lt;/p&gt;  &lt;p&gt;b. Property Name: AdditionalDescription&lt;/p&gt;  &lt;p&gt;c. Display On Site: Checked&lt;/p&gt;  &lt;p&gt;d. Assign To All Product Types: Checked&lt;/p&gt;  &lt;p&gt;3. Open SampleSite web site in Visual Studio.&lt;/p&gt;  &lt;p&gt;4. Set a reference to the following libraries Mojave libraries located at \Program Files\Microsoft Commerce\Assemblies:&lt;/p&gt;  &lt;p&gt;a. Microsoft.Commerce.Broker.dll&lt;/p&gt;  &lt;p&gt;b. Microsoft.Commerce.Contracts.dll&lt;/p&gt;  &lt;p&gt;c. Microsoft.Commerce.Providers.dll&lt;/p&gt;  &lt;p&gt;6. Add a new Class Library project to the solution. I called mine Commerce.Providers.Components to match the naming structure provided by Mojave.&lt;/p&gt;  &lt;p&gt;7. Add a class file called ProductDescriptionQuery&lt;/p&gt;  &lt;p&gt;8. Add the following using statements:&lt;/p&gt;  &lt;p&gt;a. Microsoft.Commerce.Providers&lt;/p&gt;  &lt;p&gt;b. Microsoft.Commerce.Providers.Components&lt;/p&gt;  &lt;p&gt;c. Microsoft.Commerce.Providers.Exceptions&lt;/p&gt;  &lt;p&gt;d. Microsoft.Commerce.Providers.Utility&lt;/p&gt;  &lt;p&gt;e. Microsoft.Commerce.Providers.Broker&lt;/p&gt;  &lt;p&gt;f. Microsoft.Commerce.Contracts&lt;/p&gt;  &lt;p&gt;g. Microsoft.Commerce.Contracts.Messages&lt;/p&gt;  &lt;p&gt;h. Microsoft.Commerce.Contracts.CommerceEntities&lt;/p&gt;  &lt;p&gt;9. Set the ProductDescriptionQuery class to inherit from PipelineComponent (Microsoft.Commerce.Providers.Components.PipelineComponent)&lt;/p&gt;  &lt;p&gt;10. Override the ExecuteQuery Method:&lt;/p&gt;  &lt;p&gt;Public class ProductDescriptionQuery : PipelineComponent&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;Public override void ExecuteQuery(QueryOperation queryOperation,&lt;/p&gt;  &lt;p&gt;OperationCacheDictionary operationCache,&lt;/p&gt;  &lt;p&gt;QueryOperationResponse response)&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;// The queryOperation provides the inputs to the method&lt;/p&gt;  &lt;p&gt;CommerceEntity searchModel = queryOperation.GetSearchModel(&amp;#8220;Product&amp;#8221;);&lt;/p&gt;  &lt;p&gt;If(!searchModel.Properties.ContainsProperty(&amp;#8220;Id&amp;#8221;))&lt;/p&gt;  &lt;p&gt;Throw new OperationNotSupportedException(&amp;#8220;This is invalid&amp;#8221;);&lt;/p&gt;  &lt;p&gt;// response is used to return values through the process&lt;/p&gt;  &lt;p&gt;Response.CommerceEntities[0].Properties[&amp;#8220;AdditionalDescription&amp;#8221;] &lt;/p&gt;  &lt;p&gt;= GetAdditionalDescription(searchModel.Id); &lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;// Simulate a call to ERP&lt;/p&gt;  &lt;p&gt;Private string GetAdditionalDescription(string productId)&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;Return &amp;#8220;More Content&amp;#8230;.&amp;#8221;);&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;11. Strong name the assembly and register in the GAC. All PipelineComponents need to be in the GAC because the Mojave assemblies are in the GAC.&lt;/p&gt;  &lt;p&gt;12. Set a reference to the new assembly in the web project.&lt;/p&gt;  &lt;p&gt;13. Open the ChannelConfiguration.config located in the web project. The ChannelConfiguration is responsible for maintaining the OperationalSequences and the mappings between Commece Server and Mojave Types. We need to make a couple additions here:&lt;/p&gt;  &lt;p&gt;a. Search for the &amp;#8220;QueryOperation_Product&amp;#8221; MessageHandler. Add a child node at the end of the &amp;#8220;Product Query Processor&amp;#8221; component node which looks like this:&lt;/p&gt;  &lt;p&gt;&amp;lt;Component name=&amp;#8221;Addional Product Query&amp;#8221; type=&amp;#8221;Components.Providers.Components.ProductDescriptionQuery, Components.Providers.Components, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxx&amp;#8221;&amp;gt;&lt;/p&gt;  &lt;p&gt;b. In the &amp;#8220;ToExternalEntities&amp;#8221; node add the following child node:&lt;/p&gt;  &lt;p&gt;&amp;lt;Translator sourceModelName=&amp;#8221;Product&amp;#8221; destinationType=&amp;#8221;Microsoft.CommerceServer.Catalog.Product, Microsoft.CommerceServer.Catalog, Version=6.0.1.0, Culture=neutral, PublicKeyToken=31bf385ad364e35&amp;#8221; type=&amp;#8221;Microsoft.Commerce.Products.Translators.ProductTranslator, Microsoft.Commerce.Providers, Version=1.0.0.0, Culture=neutral,PublicKeyToken=31bf385ad364e35&amp;#8221; /&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;The publictokenkey can be found on the Component in the GAC&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;14. The MetadataDefinitions.xml file manages the relationships between the Commerce Server types and Mojave types. We need to add a couple lines so the AdditionalDescription will be available to us.&lt;/p&gt;  &lt;p&gt;a. Under the CommerceEntity[&amp;#8220;product&amp;#8221;]/EntityMappings/EntityMapping/PropertyMappings node add the following:&lt;/p&gt;  &lt;p&gt;&amp;lt;PropertyMapping property=&amp;#8221;AdditionalDescription&amp;#8221; csProperty=&amp;#8221;AdditionalDescription&amp;#8221; /&amp;gt;&lt;/p&gt;  &lt;p&gt;15. The sample web solution has types similar to what would be created for a real project, just not deployed in the same manner. Open Product.cs in the App_Code folder of the web application. Create a new property to hold the AdditionalDescription.&lt;/p&gt;  &lt;p&gt;Public string AdditionalDescription&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;Get{ return this._commerceEntity.GetPropertyValue(&amp;#8220;AdditionalDescription&amp;#8221;) as String; }&lt;/p&gt;  &lt;p&gt;Set{ this._commerceEntity.SetPropertyValue(&amp;#8220;AdditionalDescription&amp;#8221;, value); }&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;16. Product.cs also contains a class called PropertyName which holds a list of properties exposed by the Product Class. The class already has a property name for InventoryCondition. Add the following life to the PropertyName class:&lt;/p&gt;  &lt;p&gt;Public const string AdditionalDescription= &amp;#8220;AdditionalDescription&amp;#8221;;&lt;/p&gt;  &lt;p&gt;17. Now we need to add the property to the queryBuilder.model so we will have access to it inside of our ExecuteQuery method.&lt;/p&gt;  &lt;p&gt;queryBuilder.Model.Properties.Add(Product.PropertyName.AdditionalDescription);&lt;/p&gt;  &lt;p&gt;18. Add the following line at the Page_Load method for Default.aspx.cs&lt;/p&gt;  &lt;p&gt;Response.Write(product.AdditionalDescription);&lt;/p&gt;  &lt;p&gt;19. Build the solution.&lt;/p&gt;  &lt;p&gt;20. In the web application set a break point at:&lt;/p&gt;  &lt;p&gt;Response response = _operationService.ProcessRequest(Utility&amp;#8230;&amp;#8230;&amp;#8230;&lt;/p&gt;  &lt;p&gt;This is the call which processes the QueryOperation_Product OperationalSequence (OpSec).&lt;/p&gt;  &lt;p&gt;21. In the ProductDescriptionQuery class set a breakpoint at the top of the ExecuteQuery method.&lt;/p&gt;  &lt;p&gt;22. Debug the Default.aspx page. At this point you should be able to step into the ProductDescriptionQuery.ExecuteQuery method.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9022460" width="1" height="1"&gt;</content><author><name>bbont</name><uri>http://blogs.msdn.com/members/bbont.aspx</uri></author></entry><entry><title>Configuring Commerce Server 2007 with Host Headers and SSL</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/bbont/archive/2008/05/30/configuring-commerce-server-2007-with-host-headers-and-ssl.aspx" /><id>http://blogs.msdn.com/bbont/archive/2008/05/30/configuring-commerce-server-2007-with-host-headers-and-ssl.aspx</id><published>2008-05-30T17:32:32Z</published><updated>2008-05-30T17:32:32Z</updated><content type="html">&lt;p&gt;I had the pleasure recently of assisting a customer in setting up SSL on a Commerce Server 2007 site configured with Host Headers.&amp;#160; Let me start by saying, it is NOT accomplished via the same approach as normal SSL certificate installation.&amp;#160; This became apparent when the sites began shutting down and they were receiving the following error in event log:&lt;/p&gt;  &lt;p&gt;Cannot register the URL prefix '&lt;a href="http://hostheader:443/'"&gt;http://hostheader:443/'&lt;/a&gt; for site 'xxxxxxx'. The necessary network binding may already be in use. The site has been deactivated.&amp;#160; The data field contains the error number.&lt;/p&gt;  &lt;p&gt;The following the link directs you to a Technet article which explains in detail how to do this.&amp;#160; Once they followed the article everything worked perfectly.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://technet2.microsoft.com/windowsserver/en/library/b5999267-fc46-4430-a6af-e0b483886c8a1033.mspx?mfr=true" href="http://technet2.microsoft.com/windowsserver/en/library/b5999267-fc46-4430-a6af-e0b483886c8a1033.mspx?mfr=true"&gt;http://technet2.microsoft.com/windowsserver/en/library/b5999267-fc46-4430-a6af-e0b483886c8a1033.mspx?mfr=true&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;* If you tried it the traditional way first and had problems remember to remove those bad settings, or you will still have problems.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8563289" width="1" height="1"&gt;</content><author><name>bbont</name><uri>http://blogs.msdn.com/members/bbont.aspx</uri></author></entry></feed>