DotNetNuke changes in Web.Config from 4.0.3 to 4.4

I moved from DNN 4.0.3 to DNN 4.4 and noticed that there are significant web.config changes (actually as a part of 4.3 Membership Services Provider Abstraction ).

However I didn’t find any clear documentation about Web.Config changes.
From my understanding the folowing changes happened:
1. Microsoft ASP.NET  membership  defaultProvider changed from “DNNSQLMembershipProvider” to standard MS AspNetSqlMembershipProvider –System.Web.Security.SqlMembershipProvider.
2.roleManager and profile providers sections were deleted from system.web section of web.config.
3. New sections members“,roles“,profiles” were added to  dotnetnuke sectionGroup


Parser Error Message: Access to the path is denied. caused by SourceSafe merge.

I’ve used Visual SourceSafe Merge method to merge changes from different brunches of the ASP.NET site project. VSS created merged file, as well as renamed original file with .org extension.
(By the way, it is not widely known, that VSS creates a backup copy of the original file filename.ext.ORG, that can be used to restore file, if merge unsucceded by some reason).

However when I started to run the ASP.NET application in IIS, it caused “Access to the path” errors, e.g.

Parser Error Message: Access to the path ‘C:ProjectsFuncSolnFSDNNDefault.aspx.vb’ is denied.

I found that merged files  have in security properties the Inherit from parent the permission entries that apply to child objects. Include these with entries explicitly defined here check box cleared.

And I had to manually change back to Inherit permission entries for Network Service account for each file that was merged.
It looks (I didn’t try ) that SetACL utility can propagate of inherited permissions to all files and subfolders.

Site Note: I have to use Web Site Project(because I wasn’t able to convert DNN to WAP) and all files with .ORG extension are considered as content and copied to published web site. We don’t distribute source code, so it is not desirable. It is recommended to manually delete all .ORG files after the merge was completed.

DotNetNuke.Services.Upgrade.ExecuteScripts method

DotNetNuke function Upgrade.ExecuteScripts(ByVal strProviderPath As String)
actually doesn’t use strProviderPath, but always uses ApplicationMapPath & “InstallScripts” folder.

It reads all files in the folder and deletes them after execution.

It is also triggered only by InstallDNN.
The behavior is different to installmodules folder, where modules are installed also during UpgradeDNN.

The issue reported  here(in comments).

I’ve also asked a question in DNN Forums “Is “installscripts” folder obsolete?


My JScriptHelper class

I’ve posted a few code snippets and some people noticed that there are references to unresolved methods.I am using a few helper classes. This post describes my JScriptHelper class


      /// <summary>

      /// The JScriptHelper class should be a replacer of VB ClientScriptsHelper.

      /// However VB ClientScriptsHelper has calls to embedded resources, so it is not too easy to move

      /// TODO move VB methods to JScriptHelper in stages.

      /// </summary>

      public class JScriptHelper


            public JScriptHelper()



                  // TODO: Add constructor logic here



            public static string JScript(string sScript)


                  string[] textArray1 = new string[3] { “”, sScript, “” } ;

                  return string.Concat(textArray1);


            public static string JSToString(bool bValue)


                  return bValue.ToString().ToLower();


            public static string NullIfFalse(bool bValue)


                  if (bValue==false) return “null”;

                  return bValue.ToString().ToLower();


            public static string QuotedClientId(Control ctrl)


                  if (ctrl==null) return “null”;

                  return DataHelper.Quoted(ctrl.ClientID);


            //created based on ResSrvHandler.cs 29/11/2005

            public static void RegisterStartupScriptUrl(System.Web.UI.Page page, string srcUrl)


                  StringBuilder sb = new StringBuilder(/span);o:p/o:p/span/pp%20class=MsoNormal%20style=MARGIN:%200in%200in%200pt;%20mso-layout-grid-align:%20nonespan%20style=FONT-SIZE:%2010pt;%20FONT-FAMILY:);

            page.ClientScript.RegisterStartupScript(TypeForClientScript(), srcUrl, sb.ToString());


            public static bool RegisterFunctionToPostBack(string sFunctionName,Control ctrl)

            { //from How postback works in ASP.NET

                  if (IsJavaScriptSupported())


                        //                            debugger;

                        //call the postback function with the right ID __doPostBack(‘” + UniqueIDWithDollars(ctrl) + @”‘,”);

                        string sJS =    function “ + sFunctionName + @”()


                        + ctrl.Page.ClientScript.GetPostBackEventReference(ctrl,“”) +@”



                ctrl.Page.ClientScript.RegisterStartupScript(TypeForClientScript(), sFunctionName, sJS);

                        return true;


                  return false;


        public static bool IsJavaScriptSupported()


            return (HttpContext.Current.Request.Browser.EcmaScriptVersion.Major > 0);



            // Call Page.GetPostBackEventReference instead (

            //          //from

//          public static string UniqueIDWithDollars(Control ctrl)

//          {

//                      string sId = ctrl.UniqueID;

//                      if (sId == null)

//                      {

//                            return null;

//                      }

//                      if (sId.IndexOf(‘:’) >= 0)

//                      {

//                            return sId.Replace(‘:’, ‘$’);         

//                      }

//                      return sId;

//          }



            public static void SetRefresh(Page  page,int nDelaySec)

            { // from

        // or


                  //NOTE: Often the __doPostBack function is inserted into your page by .NET. If not, put the code in manually, or add a dummy LinkButton and set it’s style to be “display:none”.

                  //     from


                  int nMilliSec=nDelaySec*1000;

                  StringBuilder sb = new StringBuilder();

                  sb.Append(“setTimeout(myRefresh,”+ nMilliSec.ToString()+ “);”);

                  sb.Append( @” function myRefresh()



                        } “);

                  page.ClientScript.RegisterClientScriptBlock(TypeForClientScript(),“SetRefresh”, JScript(sb.ToString()));


            public static void SetRefresh(System.Web.UI.HtmlControls.HtmlGenericControl mtaRefresh,int nDelay)

            { //DIsadvantage- not postback, but just get, possible workaround -add url with spetial flag, e.g &bRefreshed


                  //                ‘ use META REFRESH to start loading next page

                  mtaRefresh.Attributes.Add(“http-equiv”, “refresh”);

                  mtaRefresh.Attributes.Add(“content”,nDelay.ToString());//”0;url=” & sRefreshURL)



        private static Type  TypeForClientScript()


            return typeof(JScriptHelper);