ScioSoft's Community Blogs Optimized IT musings for the technically inclined

Google, HTML5 and SEO

by James Fielding 31. March 2011 11:15

To use HTML5, or not use HTML5, that is the question...especially when you’re considering Google and SEO.

There are lots of people on both sides of the debate:

PROS & CONS

PROS: Moves the semantic web one step closer, which should help my search rankings (in the long run), and some of the new tags, like <video> and <canvas>, can leave users and clients awestruck, to say the least.

CONS: Not a standard, yet... so I risk having my search rankings and user experience ending up in the crapper.

THE RISKS

In reality, the risks of using HTML5 boil down to three separate issues:

  1. Google will not rank my site properly, because it can’t find my content.
  2. Internet Explorer users with <IE9 will ditch my site, because it won’t look right, or worse, won’t show up at all.
  3. Mobile users with older devices will have a really bad experience when they visit my site.

We’re going to look at all three issues, and how to mitigate them. More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , , ,

Web Development | SEO

Google SEO Checklist

by James Fielding 14. March 2011 08:00

Here's a quick checklist to improve your Google ranking:

  • A great SEO plan starts with choosing the right keywords. Develop a good keyword list for each page that will lead searchers to your site. Two good resources are Google’s Keyword Tool and Microsoft Advertising Intelligence. Both tools are actually for search engine marketing (i.e. Pay-per-Click advertising), but the keyword information they provide is invaluable to SEO, too.

  • Use the keywords list from above to pepper your <title> and <meta name="description"> tags. NOTE: Both these tags should be human-readable descriptive statements; don’t use these as keyword dumping grounds. Don’t use any more than 80 characters in the title tag and 200 characters maximum in the description tag.

  • If you feel you must list keywords in your head section, use the <meta name="keywords"> tag; its SEO usefulness is questionable, but you’re not going to be penalized for it as long as you use a small, targeted list (10 words or less).

  • Moving into the <body> of your document, make sure your page’s one <h1> tag has your most important keywords and use <h2> tags to support your keywords, where appropriate.

  • If you have an existing site, fire up your favourite browser, and do the following search (of course, substituting your site's name) using your targeted search engine:

    SITE:yoursite.com -SITE:www.yoursite.com

    This search queries specifically for your site and uses an exclusion filter (“-SITE:”) to remove all indexed results that include the "www." subdomain in your URL. More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , ,

Web Development | SEO

Meta Keyword & Description in ASP.NET MVC via Master Pages

by James Fielding 30. November 2010 21:00

As of late, we've been trying to do some optimization on our ASP.NET MVC base projects that are the starting point for client builds. It is obvious that having META tags, particularly "Description" and "Keywords", on the .aspx pages of our sites is important.  Moreover, the content of the tags has to be easily added to and/or updated on any given view's .aspx page.

As you're undoubtedly aware after Googling this topic, most online help will have you instantiate an BaseViewData class on your Master page or write tags by implementing some variance of a base Page/Interface/Abstract class.

After experimenting with a number of these methods, I concluded that the KISS (Keep it Simple Stupid) principle should apply.

The bottom line is this: Save your sanity, and be thanked by the next guy that has to work on your project. Add a MetaContent <asp:ContentPlaceHolder> to your Site.Master page and be done with it.

When you start a new MVC site, the Site.Master head section should look like this:

<head runat="server">
    <title>
        <asp:ContentPlaceHolder ID="TitleContent" runat="server" />
    </title>
</head>

We're going to add another <asp:ContentPlaceHolder> that contains some default values, More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , , , , , , , ,

MVC | Web Development | ASP.NET | SEO

Feed Control: Redirect RSS feeds to FeedBurner and AdSense using CNAME

by James Fielding 25. March 2010 11:02

If you are anything like me, then you spend a significant amount of your professional life thinking about "what ifs". What if a system's user does this? What if a hacker does that? What if the good people at Google mistakenly sell FeedBurner to some evil people, who in-turn take my redirected RSS (or ATOM) blog or news feed hostage?

Whether your using Wordpress, BlogEngine.NET, or another syndication CMS, many administrators look at moving their feeds to FeedBurner to monetize their feed using AdSense, or to gain access to some great syndication and analysis tools.  Some of these people happily redirect their subscribers directly to FeedBurner's feeds at http://feeds.feedburner.com, without a second thought. 

BE FOREWARNED: If at some point you are unhappy, and decide to leave, you can't simply redirect your feed elsewhere, again. This would be known as "committing blogicide", as you won't be taking your old subscribers with you; you're just redirecting the new subscribers. This is obviously less than ideal.

As it stands today: Don't worry, you may be OK. If you decide to leave FeedBurner, as of this post's publish date, the good people at Google have provided tools to transfer your feed elsewhere. Having said this, if you've linked directly, you'll be relying on their system to exist in the future to do the transfer. Everything else being equal, I'd prefer to have control, rather than give it away and rely on someone else. After all, it's my feed. I should own it.

Here's how you keep control of your feed:

  1. Determine if your hosting provider will allow you to create a CNAME entry in your site's DNS records. This may sound complicated, but it's not. If you're using a shared hosting account, you may be able to do this through your control panel, or you may have to email your helpdesk to do it for you. Check you provider's knowledge base, or email their helpdesk directly to get a straight answer.
  2. You'll also need to be able to add subdomains to your site. It is common to name your feed subdomain something like "feeds.mysite.com" or "rss.mysite.com". You don't need to add the subdomain, yet. We'll do this in step 5. But, if you are in doubt about if/how to do this, check it out with your helpdesk, too.
  3. If step 1 & 2 are doable, log into your Google's FeedBurner account. If you haven't already set up a FeedBurner feed for each of your existing feeds, do so now. Just so there is no confusion, I'm going to rephrase what we're doing here: In this step we're telling FeedBurner where you currently publish your xml feed files on your site.
  4. While still logged into FeedBurner,  go to My Account > Services > MyBrand. Here you'll find the critical CNAME entry snippet. It will look something like:

    feeds CNAME xxxxxx.feedproxy.ghs.google.com

    where "xxxxxx" will be replaced by your FeedBurner account's unique ID. More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , , , , , , , , , ,

Server | Syndication | Web Development

Build an AJAX Contact Us Form using network callbacks in ASP.NET

by James Fielding 18. March 2010 13:53

Intro | Part 1 | Part 2

So we're on the third instalment of this three-part tutorial series, where you and I are building an AJAX Contact Us form in ASP.NET, a couple of different ways. If you need a recap, here are the links to the introduction and the partial-page updates method. In this article we’re going to put the "less is more" principle into action by initiating our network callbacks directly from client-side JavaScript code, and we'll also build an AJAX-enabled web service to handle our call. As in Part 1, I’m going to assume that you are comfortable using Visual Studio.

You can download the source files for this project AJAXEnabledContactForm.zip (45.6 kb).

So we're going from partial-page updates using the asp:UpdatePanel, to network callbacks through a web service using HTML controls. The main reason you'd go this way is to drastically reduce your data transfer between the client and server. And why is this? Well, for two reasons: First, unlike partial-page updates, we're not passing all the form's data back to the server, just the required parameters in an XML wrapper. Second, we're not executing the page's full life-cycle back on the server from the postback, either. So if you're looking for efficiency, this is the way to go.

We'll be continuing on with the project that we created in Part 1, which we called “AjaxEnabledContactForm”. Let's start with the our web service, which is going to provide the service methods that our Contact Us form calls. So I`ve created a new web service called "ContactUs.asmx". Since we've already seen the some of this code in Part 1, I'll give you the full page first, and then we'll walk through it.

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel

<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://xmlforasp.net")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
Public Class ContactUs
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function Submit(ByVal strEmail As String, ByVal strComment As String) As Boolean
        System.Threading.Thread.Sleep(5000)
        Return SendMail(strEmail, strComment)
    End Function

    Private Function SendMail(ByVal strEmail As String, ByVal strComment As String) As Boolean
        Dim mailMessage As System.Net.Mail.MailMessage = New System.Net.Mail.MailMessage()

        mailMessage.From = New System.Net.Mail.MailAddress("myserver@mysite.com")
        mailMessage.To.Add(New System.Net.Mail.MailAddress("me@mysite.com"))
        mailMessage.ReplyTo = New System.Net.Mail.MailAddress(strEmail.Trim())

        'Set additional options
        mailMessage.Priority = Net.Mail.MailPriority.Normal
        mailMessage.IsBodyHtml = False

        'Set the subjet and body text
        mailMessage.Subject = "Contact Us Form from: " & strEmail.Trim
        mailMessage.Body = strComment

        'Create an instance of the SmtpClient class for sending the email
        'using web.config settings
        Dim smtpClient As System.Net.Mail.SmtpClient = New System.Net.Mail.SmtpClient()

        Try
            smtpClient.Send(mailMessage)
        Catch ex As System.Net.Mail.SmtpException
            Return False
        Catch ex As Exception
            Return False
        Finally
            mailMessage.Dispose()
        End Try

        Return True
    End Function
End Class

The nice thing about doing our Contact Us form through a web service is that we can have both as a separate applications in our production evironment, so if there is a problem in our main application, the service is still available for other applications, or vice-versa. More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , , , , , ,

AJAX | Web Development | ASP.NET

Build an AJAX Contact Us Form using partial-page updates in ASP.NET

by James Fielding 12. March 2010 20:13

Intro | Part 1 | Part 2

As promised in the intro of this three-part series, you and I are going to build an AJAX Contact Us form in ASP.NET, a couple of different ways. Today we’re going to look to Visual Studio’s built in ASP.NET AJAX controls to do dynamic partial-page updates, and we’ll leave client-side network callbacks through a web service for a future post. To keep things moving, I’m going to assume that you are comfortable using Visual Studio. If you need to brush up, there are some great tutorials at ASP.NET.

You can download the source files for this project AJAXEnabledContactForm.zip (46 kb).

To start, I created a new AJAX Enabled Web Application in Visual Studio (you can find the free Visual Studio Express Edition here). I called the project “AjaxEnabledContactForm”, but you can call it whatever you want.

Next, I implement a Specified Pickup Directory method to test our contact form, and allow our web app to save notification emails to our c:\Temp\ folder. You can find the specifics of adding this to your own project in my post on The SMTP Alternative, but to keep this short, the code you need to add to your web.config file is as follows:


<configuration>
    ....
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="SpecifiedPickupDirectory">
                <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
            </smtp>
        </mailSettings>
    </system.net>
    ....
</configuration>

Now, we need a page for our Contact Us form. I created a new page, called it "PartialPageUpdate.aspx", and added the following content to the body. More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , , , , ,

AJAX | Web Development | ASP.NET

Test sending email on Localhost in ASP.NET: The SMTP server alternative

by James Fielding 4. March 2010 09:43

Out of the box, Visual Studio is a wonderful environment for creating and testing ASP.NET applications. This includes Microsoft's free Express Edition, which is, as some of you know, a great place to start building sites. One thing that can be challenge to test are a site's email related subroutines. A standard and effective approach is to configure the SMTP server on your test machine. Unfortunately, if you send a project to somebody that doesn't have the identical SMTP test environment set up (which is pretty much never), you're going to have problems.

If you only need to test that your project can create an email, an alternative is to use the Specified Pickup Directory method, which simply has your test environment save the email, instead of actually sending it. To accomplish this, you need to add or replace the default mail settings in your project's web.config file:


<configuration>
    ....
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="SpecifiedPickupDirectory">
                <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
            </smtp>
        </mailSettings>
    </system.net>
    ....
</configuration>

As you can probably guess, you can change the pickup directory for your email to anything you want, but take note: The directory has to exist, otherwise you'll get an error. This is particularly important if you are sending your project to somebody else, and don't want them to be stuck debugging your application. So, the temp folder is actually a decent place to store and access test emails.

The great thing about using the Specified Pickup Directory method is that you can use your production email settings throughout the project, and simply swap out the web.config mailSettings when your done testing. You can also send your email enabled projects to somebody else and have it work as expected.

Specified Pickup Directory is not a silver bullet, because sometimes you actually do want to do a test send, as opposed to just saving the email. However for most situations, particularly preliminary testing, this method will probably fit your needs.

Happy emailing,
James Fielding

kick it on DotNetKicks.com
Shout it

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , , , , , , ,

Web Development | ASP.NET

Build an AJAX Contact Us form in ASP.NET

by James Fielding 26. February 2010 13:47

Intro | Part 1 | Part 2

When it comes to building a Contact Us page in ASP.NET, then a page with a form tag, some text boxes, and a submit button is the classic and straightforward way to go. If this isn’t what you want to hear, then you’ve come to the right place.

Sure, a simple form may be the easiest, and arguably a more secure way of collecting user feedback, but it just doesn’t have that AJAX sparkle...and what’s the fun in that?!! Over the next two blogs, I’m going to be building an AJAX Contact Us form in ASP.NET using two different methods:

  1. Using Visual Studio’s built in ASP.NET AJAX controls to do dynamic partial-page updates.
  2. Using client-side network callbacks through a web service.

Just a couple of disclaimers before we start: I’m going to keep this as simple as possible, so let’s just say that the UI design is basic, the database/email hookup will be incompete, and we won’t be dealing with any major security concerns. So you’ll obviously want to bolster things before you drop this into a production environment. The point of this is not to provide an enterprise-class solution, but to give you a step-off point to building a great system. More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , , , ,

Web Development | ASP.NET

Referencing external URLs in your web.sitemap in ASP.NET

by James Fielding 23. February 2010 09:57

In ASP.NET, we often use site maps to set up navigation, particularly for menus. By default, the ASP.NET  site-map provider  uses the "Web.sitemap" file. Here is an example of this file for a simple site:


<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
    <siteMapNode title="Home" description="Home" url="~/default.aspx">
        <siteMapNode title="Services" description="Services we offer" url="~/Services.aspx">
            <siteMapNode title="Consulting" description="Consulting services" url="~/Consulting.aspx" />
            <siteMapNode title="Support" description="Supports plans" url="~/Support.aspx" />
        </siteMapNode>
        <siteMapNode title="About Us" description="About Us" url="~/AboutUs.aspx">
            <siteMapNode title="Company" description="Our people and offices" url="~/Company.aspx" />
            <siteMapNode title="Blogs" description="Blogs from us to you"
              url="http://blogs.mysite.com/default.aspx" />
        </siteMapNode>
    </siteMapNode>
</siteMap>

So our basic menu will look like this: More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , ,

Web Development | ASP.NET

Stop Web.Config settings inheritance in ASP.Net

by James Fielding 7. February 2010 19:16

Have you ever been left scratching your head after getting an error like this:

Configuration Error
Parser Error Message: Could not load file or assembly 'MyUnrequiredAssembly' or one of its dependencies. The system cannot find the file specified. (C:\Inetpub\wwwroot\child\web.config line 89)

It’s common to have child sub-applications under the root application in an ASP.NET web site. It’s also common to have inheritance problems in a child because of what’s in the root application’s web.config file. To stop the child application from throwing a configuration error, you’ll often find that the previous developer has added assemblies to the GAC, or to every child application’s /bin folder in addition to the root folder’s /bin. You’ll also see similar stop-gap fixes with other resources, particularly in the App_Theme folder. Fortunately, if you are running at least .NET 2.0, or better, there’s a number of ways to fix things that won't throw the next guy working on the site for a loop.

The simplest way to handle this is to:

1. Remove the offending assembly in the system.web section of the child application's web.config file.


<compilation>
    <assemblies>
        <remove assembly="MyUnrequiredAssembly" />
    </assemblies>
</compilation>

If you can't seem to get rid of the offending assembly, check for httpModules:


<httpModules>
    <remove name="MyUnrequiredAssembly" />
</httpModules>

Sometimes, it is easier to start the child application with a clean slate. In that case: More...

Sciosoft Systems is a Canadian web design & development company based in Muskoka, which is in central Ontario. We provide ASP.NET website & Windows Server application development services to small and medium-sized business, as well as local government and not-for-profit groups. If you have a website project you’d like to discuss, please visit us at www.sciosoft.com.

Share |

Tags: , ,

Web Development | ASP.NET

RecentComments

Comment RSS

The opinions expressed herein are the personal opinions of the contributors and do not necessarily represent the views of Sciosoft Systems Inc.