Saturday, January 23, 2016

Issue with IIS Express Only Starts First Defined Site in applicationhost.config

Today, when I try to visit a website defined in IIS Express, it returned "Unable to connect" error in the browser.

 

But, I had everything configured correctly
1) hosts file entry was added
        127.0.0.1    sc81.local
2) site is defined in applicationhost.config
               <site name="sc81.local" id="3" serverAutoStart="true">
                <application path="/">
                    <virtualDirectory path="/" physicalPath="D:\Sitecore\Prototype\sc81.local\Website" />
                </application>
                <bindings>
                    <binding protocol="http" bindingInformation=":8070:sc81.local" />
                </bindings>
              </site>

And this is how my <sites> section in the applicationhost.config looks like

         <sites>
             <site name="sc70.local" id="1" serverAutoStart="true">
                <application path="/">
                    <virtualDirectory path="/" physicalPath="D:\Sitecore\Prototype\sc70.local\Website" />
                </application>
                <bindings>
                    <binding protocol="http" bindingInformation=":8080:sc70.local" />
                </bindings>
              </site>

               <site name="sc81.local" id="3" serverAutoStart="true">
                <application path="/">
                    <virtualDirectory path="/" physicalPath="D:\Sitecore\Prototype\sc81.local\Website" />
                </application>
                <bindings>
                    <binding protocol="http" bindingInformation=":8070:sc81.local" />
                </bindings>
              </site>
     ....
             <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
             <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

After few minutes of struggle, I decide to search this issue on internet. And, I found the answer. :-)

http://stackoverflow.com/questions/7142792/iis-express-7-5-only-loading-one-site-even-though-2-sites-defined

The reason for this is, I just ran the "iisexpress.exe" without "/apppool " parameter.
So, when we just run the "iisexpress.exe", IIS Express will only start the first define site that they can find in the applicationhost.config file.

So, solution for this issue is run the command as follows
iisexpress.exe /apppool:Clr4IntegratedAppPool

You might think, how this is working, since you I don't have specifically define the "applicationPool" setting in anywhere in the configs.

But, if you take a look at the above applicationhost.config file, you see following line, and there we have given the default applicationPool setting.

<applicationDefaults applicationPool="Clr4IntegratedAppPool" />
 
You can also define applicationPool setting in site definition level also as follows

<sites>
             <site name="sc70.local" id="1" serverAutoStart="true">
                <application path="/" applicationPool="customAppPool">
                    <virtualDirectory path="/" physicalPath="D:\Sitecore\Prototype\sc70.local\Website" />
                </application>
                <bindings>
                    <binding protocol="http" bindingInformation=":8080:sc70.local" />
                </bindings>
              </site>
...







Tuesday, January 12, 2016

Log4net Logging in ASP.NET MVC Application with Autofac IoC Container

In this blog post, I'm trying to discuss log4net logger module integration with ASP.NET MVC application and how it can be integrated with Autofac (an IoC container) to automatic injection of ILog object into Controllers.

Configurations :

  • ASP.NET MVC 5
  • Autofac 3.4.0
  • log4net 2.0.5


Adding log4net into ASP.NET MVC Application


I found following article which discribes the configuration of log4net into ASP.NET MVC application.

http://www.codeproject.com/Articles/823247/How-to-use-Apache-log-net-library-with-ASP-NET-MVC

The steps that included in the above article in short,

Step 1 : Install log4net NuGet package into MyMvcProject.Website
Step 2 : Configure application to use log4net logging configuration by adding to startup.cs file
Step 3 : Add log4net configuration to web.config file
Step 4 : Add logger declaractions to classes which we want to use log4net
Step 5 : Use log.Error to write logging message

In the above "Step 4", we are getting the logger from LogManager.

But, If you are using Autofac as your IoC container for this project, we can do this using Autofac.

Integrating log4net with Autofac


Step 1 : Write Autofac Module

http://docs.autofac.org/en/latest/examples/log4net.html
MyMvcApplication.Website.App_Start.AutofacLoggingModule.cs

Step 2 : Register module into Autofac Config

public static class AutofacConfig {
    public static void ConfigureContainer() {
        var builder = new ContainerBuilder();
        .....
        builder.RegiserModule(new AutofacLoggingModule());
...

Step 3 : Passing ILog into Controller constructor

public class MyController : Controller {
    private readonly log4net.ILog _logger;
    public MyController(ILog logger) {
        _logger = logger;
    }
    public ActionResult MyAction() {
        _logger.Error("Error Message");
    }
}

Monday, November 30, 2015

WFFM Enrol in Engagement Plans save action cannot be added when Analytics is Disabled

Recently, our product owner complaint to us about an issue in WFFM form.

Issue was, when he try to add a "Enrol in Engagement Plans" save action into a particular WFFM form, it returns following error message.

Error Message : This action cannot be added. Your configuration does not support it.


After a some investigation, it turns out to be that analytics is disabled for this particular WFFM form

"Disable analytics for this page" checkbox was checked



After enabling Analytics (i.e. UnCheck "Disable analytics for this page" checkbox), we were able to add "Enrol in Engagement Plans" save action into WFFM form.



 Happy Sitecore !! :-)

Friday, November 6, 2015

Using Add Contact to contact List WFFM Save Action with Sitecore 8

Yesterday, I saw a question posted into Sitecore Community form related to "Add Contact to Contact List" WFFM save action.

The issue was, when "Add the contact to a contact list" save action was used in a WFFM form.



when the user submits the form, he receives following error message in the page.

We experienced a technical difficulty while processing your request. Your data may not have been correctly saved.



And when checked in the error logs, we can see following error message

11668 09:38:20 WARN  Null ids are not allowed.
Parameter name: userName
Exception: System.ArgumentNullException
Message: Null ids are not allowed.
Parameter name: userName
Source: Sitecore.Kernel
   at Sitecore.Security.Accounts.User.FromName(String userName, Boolean isAuthenticated)
   at Sitecore.Form.Submit.AddContactToContactList.Execute(ID formid, AdaptedResultList fields, Object[] data)
   at Sitecore.Form.Core.Submit.SubmitActionManager.ExecuteSaving(ID formID, ControlResult[] list, ActionDefinition[] actions, Boolean simpleAdapt, ID sessionID)

11668 09:38:20 WARN  The 'Add Contact to Contact List[id={C5E1D916-2476-4BE4-AE90-7B419B55C9E1}]' save action failed: We experienced a technical difficulty while processing your request. Your data may not have been correctly saved.
11668 09:38:20 WARN  Web Forms for Marketers: an exception: We experienced a technical difficulty while processing your request. Your data may not have been correctly saved. has occured while trying to execute an action.

Then, I tried to add "Create User" save action into the WFFM form Save actions as shown below



And then when try to fill the form and submit it, it worked.  :-)



Reason for this is, to add a user into a Contact List using "Add contact to Contact List", he should be already created in Sitecore as a user.

Update : User is now added into Contact List



Will dig deep into code how and why this happens in a later blog post.

Happy Sitecore :-)


Wednesday, October 28, 2015

Multiple versions of an Item for a Language in Web database possible with Sitecore 8.1


In earlier versions of Sitecore (i.e.  Sitecore 8.0 or ealier), WEB database could only contain single item for a given language of an item.

In the hangout session done by Sitecore for Sitecore 8.1 release, I heard that it is possible to have more than one version of an item from given language in WEB database.


But, this is not possible to all the items. To allow multiple items be published to web database, an item must satisfy (or should contain) certain conditions.

One situation that allows multiple item versions for given language item is, item should have an Active Test running for different versions of the same language of that item




When the test successfully ends, Sitecore automatically creates a new version with the matching winning item version and published to Web database





NOTE: Web database will be only containing single item after the Test ends


So, next time when you teach Sitecore to a junior developer, remember NOT to say "Web database contain only one item version for a given language" :-D

Monday, October 19, 2015

rootPath and startItem attribute usege in Sites configuration in Sitecore

Recently, one of my colleagues asked me a question which questioned my knowledged in Sites configuration attributes in Sitecore web.config file

Question:

We have a content tree as follows




When a user visits the http://scfootsteps.local/ , user will be presented with the /sitecore/content/home item, which is the combination of rootPath + startItem in the <sites> configuration

<site name="website" rootPath="/sitecore/content" startItem="/home" ... />


But, what happens if user visits http://scfootsteps.local/aboutus url ?

Answer :

Before degging deeper into this, first refresh our minds with definitions of rootPath & startItem attributes in <sites> configuration

rootPath
The path to the root item of the site in terms of Sitecore content tree. For example, it is set to /sitecore/content for the “website” site.

Quote : https://sdn.sitecore.net/SDN5/Articles/Administration/Configuring%20Multiple%20Sites/Adding%20New%20Site/site%20Attribute%20Properties/rootPath.aspx
startItem
The path to the start Item of the site. This Item will be opened by default when the site is requested. All relative URL paths will be relative to the startItem.

Quote : https://sdn.sitecore.net/SDN5/Articles/Administration/Configuring%20Multiple%20Sites/Adding%20New%20Site/site%20Attribute%20Properties/startItem.aspx

So, that means, anything under the "rootPath" is accessible from typing url.


Question :

Then the next question is, what happens if there are two items with the same name as follows
1) /sitecore/content/aboutus
2) /sitecore/content/home/aboutus



Answer :

Answer is, if item with the same name exists in under both nodes, item inside the /home (i.e. startItem) will get priority






When we delete/remove the item inside the home node (i.e. "sitecore/content/home/aboutus"), item outside the /home node (i.e. "sitecore/content/aboutus" will be displayed for the same url (http://scfootsteps.local/aboutus)





In the next post, we will dig deep into code to see how this above mentioned functionality is handled by Sitecore

happy Sitecore Footsptes  :-)

Friday, October 9, 2015

My Experience on Sitecore IP Geolocation service

Recently we had a task of configuring Sitecore IP Geolocation service with our existing Sitecore website. Even though the configuration is straight forward with good documentation, we were NOT able to configure Personalization to work properly.

i.e.
When we try to add a personalization with GEO IP rules, it didn't detect the country/IP information fro IP Geolocation service
Some sample configurations can be found in the following document
https://doc.sitecore.net/sitecore%20experience%20platform/ip%20geolocation/getting%20started%20with%20sitecore%20ip%20geolocation%20service


INSTALLATION


Follow the installation steps in the following document
https://doc.sitecore.net/Sitecore%20Experience%20Platform/IP%20Geolocation/Setting%20up%20Sitecore%20IP%20Geolocation#_Install_and_enable

NOTE :
If you don't have a way to configure your firewall settings to allow requests to the service by domain names, then you need to allow all the IPs for Microsoft Azure Datacenter, defined in the following document

https://msdn.microsoft.com/en-us/library/azure/dn175718.aspx

That contains larger number of IPs and they can be changed time to time

TROUBLESHOOTING


If your IP is not getting resolved correctly (or your personalizations are not working correctly), then try to use the 'TestIp.aspx' file in the following kb.sitecore.net artible and try to see if your IP is correction detected by Sitecore IP Geolocation services.

https://kb.sitecore.net/articles/798498


NOTE:
This TestIp.aspx page directly contacts/users GeoIP service and get the necessary data for the requested IP.

That is not the case when this service used in Sitecore website

Quote from doc.sitecore.net
When IP information is requested, the following steps are performed:
  • Lookup of IP information in the memory cache;
  • Lookup of IP information in the database;
  • Request to the Geolocation service.

Quote from Sitecore Support
When IP is resolved, the Geo Data (Country, City, etc) corresponded to the IP is searched in cache and then analytics database. If these storage contain data even incorrect, the service won't be used at all.

So, if you are continuously receiving incorrect information, then it is good to do following steps

1) Check whether the correct IP information is stored in the Analytics database:
  • Sitecore 7.5 - Sitecore 8.x: the "GeoIps" collection, Collection database (MongoDB)
  • Sitecore 6.4.1 - Sitecore 7.2: the "GeoIps" table, Analytics database (SQL)
And if incorrect Geo location information stared for a given IP, deleted that incorrect IP info from the GeoIps table/collection and do an app pool reset (to clear application cache). 
Correct Geo information will be cached/stored again in the next request.

2) Use proxy client (like Hide My Ass) to change your IP and try with a new IP