Request a topic or
contact an Arke consultant
404-812-3123
All posts by eric stoll

Arke Systems Blog

Useful technical and business information straight from Arke.

About the author

Author Name is someone.
E-mail me Send mail

Recent comments

Archive

Authors

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2022

DotNetNuke Endless Redirects

I just wanted to post a little tidbit about the newer versions of DNN.  Specifically, I just installed DNN 4.8.4.  It went through the install process just fine and after that I tried to open the home page of the default portal.  I got stuck in an endless loop of redirects back to the home page.  In previous versions of DNN, this behavior was usually a result of a misconfigured PortalAlias table.  After spending time troubleshooting it from that angle I had to just start debugging the code.  I found a gem in the Page_Error handler in PageBase.vb that was causing my issue.

 

If objBasePortalException.Message.Contains("System.Web.Extensions") Then
    ' suppress AJAX error in Medium Trust
    Response.Redirect(strURL)

 

Googling for the exception message led me to this post http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/111/threadid/200731/scope/posts/Default.aspx.  Because I am using VS2008, my solution was to change the web site build settings to target the 3.5 framework instead of 2.0 so that the build would include references to ASP.NET AJAX.  Changing the build target to 3.5 fixed the problem.


Posted by eric stoll on Thursday, June 19, 2008 6:18 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Windows XP SP3 Released

You can now download Windows XP SP3 from http://technet.microsoft.com/en-us/windowsxp/0a5b9b10-17e3-40d9-8d3c-0077c953a761.aspx.  The last service pack released for XP was 3 years ago and since then Microsoft has released hundreds of hot fixes.  SP3 wraps all of those fixes together and introduces a couple new features that will improve Windows Server 2008 compatibility.  SP3 will be available on Windows Update shortly but in the meantime, you can download it directly from TechNet.

Windows® XP Service Pack 3 (SP3) includes all previously released updates for the operating system. This update also includes a small number of new functionalities, which do not significantly change customers’ experience with the operating system. This white paper summarizes what is new in Windows XP SP3.  http://www.microsoft.com/downloads/details.aspx?FamilyID=68c48dad-bc34-40be-8d85-6bb4f56f5110&displaylang=en


Posted by eric stoll on Sunday, May 4, 2008 5:00 PM
Permalink | Comments (0) | Post RSSRSS comment feed

FCKEditor 404

I'm using the FCKEditor ASP.NET control on a web application that's deployed to a virtual directory.  When my app is deployed to the root of a web site, FCKEditor works great.  When I'm deployed in a virtual directory, I get an HTTP 404 error in the FCKEditor IFRAME.  One quick look at the IFRAME properties shows that the URL is missing the virtual directory path.  All prepared to hack on the FCKEditor.cs file, I discovered that some one else already thought of this scenario.  I either overlooked a step in the documentation or this is an undocumented feature.  Regardless, here is a universal solution to the problem...  Just add the following key to the appSettings section of your web.config...

<add key="FCKeditor:BasePath" value="~/fckeditor/"/>

That's it!  By default, FCKEditor uses /fckeditor/ and doesn't try to ResolveUrl to discover your virtual directory scenario.  Only when you add this to your appSettings will FCKEditor look for the ~ and upon finding that will it run the path through ResolveUrl.  That said, adding the above key to your appSettings should solve this problem for 99% of the people dealing with this issue.


Posted by eric stoll on Saturday, May 3, 2008 5:44 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Auto Generate Sequence Diagrams from a .NET DLL

I just ran across a very useful Reflector.NET add-in and just wanted to spread the word about SequenceViz.  It's still beta and the comments on their page indicate there are some bugs but I was able to get it working right away and this tool is really helpful.  I hope you find it useful also...

http://www.codeplex.com/sequenceviz/Wiki/View.aspx?title=ReflectorPlugin

SVReflector.png


Posted by eric stoll on Tuesday, April 29, 2008 12:35 AM
Permalink | Comments (0) | Post RSSRSS comment feed

How to move SharePoint sites around

I found an incredibly useful article about deploying and migrating SharePoint content.

http://sharepointnutsandbolts.blogspot.com/2007/10/stsadm-export-content-deployment.html


Categories: SharePoint
Posted by Eric Stoll on Monday, March 17, 2008 10:31 AM
Permalink | Comments (0) | Post RSSRSS comment feed

Creating a Horizontal Tabbed Menu with the Menu Control

I needed to create a quick horizontal tabbed menu with the Menu control.  The tabs have rounded corners so we're using image backgrounds.  We also have different images for the selected tab and when you hover.

image

<asp:Menu runat="server" ID="Menu1" SkinID="MenuHorizontalTabs">
    <Items>
        <asp:MenuItem Text="Tab 1" Value="Tab1" Selected="true" />
        <asp:MenuItem Text="Tab 2" Value="Tab2" />
        <asp:MenuItem Text="Tab 3" Value="Tab3" />
        <asp:MenuItem Text="Tab 4" Value="Tab4" />
    </Items>
</asp:Menu>

Then I added MenuHorizontalTabs to my skins file. 

<asp:Menu runat="server" SkinID="MenuHorizontalTabs" Orientation="Horizontal">
    <StaticItemTemplate>
        <div>
            <span>
                <asp:Literal runat="server" ID="Literal1" Text='<%# Eval("Text") %>' />
            </span>
        </div>
    </StaticItemTemplate>
    <StaticSelectedStyle CssClass="MenuHorizontalTabsSelectedMenuItem" />
    <StaticHoverStyle CssClass="MenuHorizontalTabsHoverMenuItem" />
    <StaticMenuItemStyle CssClass="MenuHorizontalTabsMenuItem" />
</asp:Menu>

Now, let's look at the CSS file.

.MenuHorizontalTabsMenuItem * div
{
    background:url(/images/header/left_both.gif) no-repeat left top; 
    height: 22px; 
    padding-left: 9px; 
    cursor: pointer;
}
.MenuHorizontalTabsMenuItem * span
{
    background:url(/images/header/right_both.gif) no-repeat right top; 
    padding: 5px 15px 4px 6px; 
    font-size: 10px; 
    color: #333; 
    height: 22px;
}
.MenuHorizontalTabsSelectedMenuItem * div
{
    background-position: 0px -150px;
}
.MenuHorizontalTabsSelectedMenuItem * span
{
    background-position: 0px -150px;
}
.MenuHorizontalTabsHoverMenuItem * div
{
    background-position: 0px -150px;
    color: Blue;
    text-decoration: none;
}
.MenuHorizontalTabsHoverMenuItem * span
{
    background-position: 0px -150px;
    color: Blue;
    text-decoration: none;
}

And finally, let's see the images.

left_both

left_both.gif

right_both

right_both.gif


Categories: ASP.NET
Posted by eric stoll on Thursday, January 31, 2008 10:07 AM
Permalink | Comments (0) | Post RSSRSS comment feed

LinqDataSource with uniqueidentifier Primary Key

I tend to use uniqueidentifiers for my primary key columns with a default value of newid() so the database will generate a Guid for me.  I created a LinqDataSource and bound that to a DetailsView control.  I was able to insert my first row within 10 minutes of writing all this code but subsequent inserts would always throw a unique constraint exception.  After looking at the database, I saw my first row's Id was Guid.Empty so I knew that Linq was pushing this as a default value to the database instead of letting the database create a newid() for me.  It turns out the solution is very simple.  Open your DBML file, select the primary key column and change the Auto Generated Value property to true.  So far, I'm still impressed with Linq.

Categories: LINQ
Posted by Eric Stoll on Sunday, January 20, 2008 2:18 PM
Permalink | Comments (0) | Post RSSRSS comment feed

DNN Performance Troubleshooting

I was troubleshooting a client's DNN site today because the response time was horrible.  Their site was relatively small and every page load was taking up to 30 seconds.  By logging in to the production server, I could see that the CPU would spike to 100% on the sqlsrvr.exe process during the entire page load so that gave me a starting point.  Then I dug in to SQL Profiler to identify the problematic query.  The resolution was to delete everything from the ScheduleHistory table.  I purged the data and the website immediately became fast again.  If you notice SELECT queries on the ScheduleHistory table taking a long time, this may be the solution to your problem.


Posted by eric stoll on Thursday, January 3, 2008 6:13 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Extending LINQ to SQL

We have been experimenting with LINQ to SQL on a couple projects lately and I am constantly impressed.  I'll post some tidbits as I come across some neat features.

Today I had to display the last 4 digits of a customer's credit card number on the UI.  I already have a DBML file in my project and the Customer table has been added to the designer.  Customer has a CreditCardNumber property (ignoring encryption for purposes of this example).  Of course business logic layers aren't new but all too often, you would find logic in the UI that displays the right 4-digits.  But now implementing the BLL is even easier by simply implementing a partial class.

Partial Public Class Customer
    Public Readonly Property Last4 as String
        Get
            Return Right(Me.CreditCardNumber, 4)
        End Get
    End Property
End Class

You can take it one step further and override the CreditCardNumber property and change the Get to return ************XXXX instead of the clear text credit card number, which will make your business logic even more secure.


Posted by Eric Stoll on Wednesday, January 2, 2008 1:40 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Serving PDF Reports from ASP.NET using SQL Reporting Services

I recently had to create a PDF on the server-side and deliver it to the client via ASP.NET.  There are several open source PDF APIs out there so the options are vast.  But I chose to leverage SQL Reporting Services instead of learning another API.  Plus, why program a report when you can design it using proven tools?

Using SQL Server Business Intelligence Development Studio, I created a reports project, developed a report called Report1, and deployed to SQL Reporting Services.  Here is a great article if you want help creating your first report.  Tutorial: Designing Your First Report in SQL Server Reporting Services.

Next, in my ASP.NET application, I added a Web Reference to http://server/Reportserver/reportservice.asmx and named it ReportsWS, which generates all the proxy classes needed to interface with Reporting Services from my code.  Now I just have to write a little bit of code to generate the report and deliver the PDF.  In the example below, you can also see how to pass parameters to the report named StartDate and EndDate.

Using rs As New ReportsWS.ReportingService()
    rs.Credentials = New System.Net.NetworkCredential(ConfigurationManager.AppSettings("RSUser"), ConfigurationManager.AppSettings("RSPassword"), ConfigurationManager.AppSettings("RSDomain"))
   
Dim sReportPath As String = ConfigurationManager.AppSettings("RSReportPath")
   
Dim sReportName As String = "Report1"

   
Dim ResultStream() As Byte

   
Dim StreamIdentifiers() As String = Nothing

   
Dim optionalParams(2) As ReportsWS.ParameterValue

   
Dim OptionalParam As String = Nothing

   
Dim optionalWarnings As ReportsWS.Warning() = Nothing
 
   
optionalParams(0) = New ReportsWS.ParameterValue

   
optionalParams(0).Name = "StartDate"

   
optionalParams(0).Value = "1/1/2007"

   
optionalParams(1) = New ReportsWS.ParameterValue

   
optionalParams(1).Name = "EndDate"

   
optionalParams(1).Value = "12/31/2007"

   
' Create and set the content type string
   
Dim contentType As String = "application/pdf"

   
ResultStream = rs.Render("/" & sReportPath & "/" & sReportName, "PDF", Nothing, "<DeviceInfo><StreamRoot>/RSWebServiceXS/</StreamRoot></DeviceInfo>", optionalParams, Nothing, Nothing, OptionalParam, OptionalParam, optionalParams, optionalWarnings, StreamIdentifiers)

   
Response.Clear()
   
Response.ContentType = "application/octet-stream"

   
Response.AddHeader("Content-Type", contentType)

   
Response.AddHeader("Content-Disposition", "attachment;filename=" & sReportName & ".pdf")
               
    Response.BinaryWrite(ResultStream)

   
Response.Flush()
               
   
Response.End()
           
End Using

 


Posted by Eric Stoll on Wednesday, January 2, 2008 9:39 AM
Permalink | Comments (0) | Post RSSRSS comment feed