Welcome to AspAdvice Sign in | Join | Help

SmarterStats: Get To Know You Web Site In Depth

SmarterStats v3.x from SmarterTools Incorporated

If you have not seen or heard of SmarterStats and you are interested in tracking the stats of your web site or even a site for a client then give this application a look, you will not be disappointed. There are three editions of the application:

  1. Free
  2. Professional
  3. Enterprise

At the time of this post a license starts at $249.00 for 50 sites which from my point of view is a very reasonable price considering the cost. As we all know being able to clearly understand the visitors that hit a web site by browser type, geographic region, or even by referrer is extremely important if we wish to make sense of the hidden data that can produce valuable information if you just understand what that data means. This is where SmarterStats does all the work for you thus allowing you to reap the benefits of all that information with ease.

Installing this product is just as simple as using the product itself. I have installed in on Windows Vista SP1 without any issues. The one thing to take note of is this product employs the .NET 1.1 Framework so in my case I did not have this framework installed but the install process pick up this dependency and prompted me to install the framework which of course I did. In just a few clicks I had this product installed and now I was ready for the configuration.

Recall earlier when I said there is a great deal of data that SmarterStats provides. Just consider the following:

Impressed? I know I am and while there are a great number of tools out there this is one of the best…

Sponsor

Add Web Form Option Completely Disappeared

Has anyone ever ran into the option of adding a web form not being available?

Sponsor
Posted by sswafford | 1 Comments

Generate Zip Files With MSBuild and Web Deployment Projects

Create your Class Library. This is not any different than any class library with the exception that you reference the Microsoft.Build.Utilities and Microsoft.Build.Framework and your class must inherit Task Class. You will need ShapZibLib as well.

Example CreateZipFile Class:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using ICSharpCode.SharpZipLib.Zip;

namespace RadDev.MSBuildClassLibrary
{
    public class CreateZipFile : Task
    {
        private const string STR_TheSpecifiedPathWasNotFound = "The specified path was not found!";
        private string _pathToZipFile = string.Empty;
        private string _ziFileName = string.Empty;

        [Required]
        public string PathToZipFile
        {
            get
            {
                return _pathToZipFile;
            }
            set
            {
                _pathToZipFile = value;
            }
        }

        [Required]
        public string ZiFileName
        {
            get
            {
                return _ziFileName;
            }
            set
            {
                _ziFileName = value;
            }
        }

        public override bool Execute()
        {
            bool shouldReturn;
            bool result = ValidateDirectoryExist(out shouldReturn);
            if (shouldReturn)
                throw new Exception(STR_TheSpecifiedPathWasNotFound);

            try
            {
                string[] fileNames = Directory.GetFiles(_pathToZipFile);
                ZipOutputStream stream = new ZipOutputStream(File.Create(_pathToZipFile + _ziFileName));
                stream.SetLevel(9); // Max Compression

                byte[] bufferSize = new byte[4096];

                foreach (string file in fileNames)
                {
                    ZipEntry zipEntry = new ZipEntry(Path.GetFileName(file));
                    zipEntry.DateTime = DateTime.Now.ToUniversalTime();
                    stream.PutNextEntry(zipEntry);

                    try
                    {
                        FileStream fileStream = File.OpenRead(file);
                        int sourceBytes;
                        do
                        {
                            sourceBytes = fileStream.Read(bufferSize, 0, bufferSize.Length);
                            stream.Write(bufferSize, 0, sourceBytes);
                        }
                        while(sourceBytes > 0);
                        PerformCleanUp(fileStream);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
                PerformCleanUp(stream);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return true;
        }

        /// <summary>
        /// Validates the directory exist.
        /// </summary>
        /// <param name="shouldReturn">if set to <c>true</c> [should return].</param>
        /// <returns>true or false</returns>
        private bool ValidateDirectoryExist(out bool shouldReturn)
        {
            shouldReturn = false;
            if (!Directory.Exists(_pathToZipFile))
            {
                shouldReturn = true;
                return true;
            }
            return false;
        }

        /// <summary>
        /// Performs the clean up.
        /// </summary>
        /// <param name="fileStream">The file stream.</param>
        private static void PerformCleanUp(FileStream fileStream)
        {
            fileStream.Close();
            fileStream.Dispose();
        }

        /// <summary>
        /// Performs the clean up.
        /// </summary>
        /// <param name="stream">The stream.</param>
        private static void PerformCleanUp(ZipOutputStream stream)
        {
            stream.Finish();
            stream.Close();
            stream.Dispose();
        }
    }
}

Next open the Web Deployment Project file for editing with Visual Studio 2005 and at the following:

<UsingTask TaskName="RadDev.MSBuildClassLibrary.CreateZipFile" AssemblyFile="RadDev.MSBuildClassLibrary.dll"/>
    <Target Name="AfterBuild">
        <CreateZipFile PathToZipFile="C:\MyDevelopment\RadDev\RadDev_deploy\Release" ZiFileName="currentbuild.zip" />
    </Target>
Sponsor
Posted by sswafford | 1 Comments

Oracle Developer Tools

Oracle has recently released a beta version of ODT. While betas can be a pain in the rear at time I felt it was work the effort to check this out. I ran into problems from the begining as soon as I fired up Visual Studio .NET. I simply can not get ODT to load properly.

Package 'Oracle Developer Tools for Visual Studio .NET' has failed to load properly ( GUID = {D601BB95-E404-4A8E-9F24-5C1A462426CE} ). Please contact package vendor for assistance. Application restart is recommended, due to possible environment corruption. Would you like to disable loading this package in the future? You may use 'devenv /resetskippkgs' to re-enable package loading.

I am not sure why this is occuring so I have post this issue at the Oracle ODP.NET forums. In the meatime if anyone has experience this and was able to resolve the issue I would love to hear from you.

I am really looking forward to getting this release working! Take a look at the features:

Oracle Developer Tools for Visual Studio .NET Beta Features

  1. Visual Studio 2005 integration with Server Explorer, Data Sources Window, Dataset Designer, TableAdapter Configuration Wizard and more
  2. Improved ASP.NET web developer support
  3. Oracle Database script project to provide source control of Oracle scripts
  4. SQL script editor
  5. Built in support for executing SQL*Plus scripts
  6. Explain plan support
  7. Integration with Query Designer
  8. New designer for granting/revoking privileges on schema objects
  9. User-Defined Types: Create, explore and modify UDTs; custom class code generation for .NET applications
  10. Data Window and Query Window enhancements

Oracle Data Provider for .NET Beta Features

  1. Instant Client Support: Smaller ODP.NET client installation
  2. User-Defined Types: Map Oracle objects and collections to .NET custom types and support REFs to object types
  3. Process Database Down Events: ODP.NET automatically frees connections of a downed Data Guard instance
  4. Windows-Authenticated User Connection Pooling: Windows-authenticated connections can now be pooled
  5. Connection Pool Performance Counters: Monitor connection pool status

Oracle Providers for ASP.NET Beta Features

  1. Membership Provider
  2. Role Provider
  3. Profile Provider
  4. Site Map Provider
  5. Session State Provider
  6. Web Events Provider
  7. Web Parts Personalization Provider
  8. Cache Dependency Provider
Sponsor
Posted by sswafford | 1 Comments
Filed under:

Generate Email Notifications With MSBuild and Web Deployment Projects

If you are not familiar with MSBuild I suggest you take the time to read over the reference and overview. I use Web Deployment Projects to automate my build process to include the build release type as well as deployments to the testing and staging servers, this in itself is an entire new topic.

Once I completed my build and deployment I previously turned to Outlook and sent an email to the development team notifing them the build has been completed and to be honest this was a process that was easily overlooked and redundant. To overcome this manual process I turned to using a custom MSBuild task. The purpose of this task was to provide an automated mechanism of generating the email to the development team.

First thing is to create a Class Library. This is not any different than any class library with the exception that you reference the Microsoft.Build.Utilities and Microsoft.Build.Framework and your class must inherit Task Class.

Example BuildNotificationByEmail Class:

using System;
using System.Collections.Generic;
using System.Net.Mail;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace RadDev.MSBuildClassLibrary
{
    public class BuildNotificationByEmail : Task
    {
        private string _smtpHost = string.Empty;
        private string _from = string.Empty;
        private string _to = string.Empty;
        private string _cc = string.Empty;
        private string _subject = string.Empty;
        private string _body = string.Empty;
        private string _attachments = string.Empty;
        private string _userName = string.Empty;
        private string _password = string.Empty;
        private int _timeout = 30 * 1000;
        private Nullable<int> _portNumber;

        /// <summary>
        /// Gets or sets the SMTP host.
        /// </summary>
        /// <value>The SMTP host.</value>
        [Required]
        public string SmtpHost
        {
            get { return _smtpHost; }
            set { _smtpHost = value; }
        }

        /// <summary>
        /// Gets or sets the SMTP port.
        /// </summary>
        /// <value>The SMTP port.</value>
        public string SmtpPort
        {
            get
            {
                string s;
                if (_portNumber.HasValue)
                    s= _portNumber.ToString();
                else
                    s = "";
                return s;
            }
            set
            {
                int port;
                if (Int32.TryParse(value, out port))
                {
                    _portNumber = port;
                }
            }
        }

        /// <summary>
        /// Gets or sets the timeout.
        /// </summary>
        /// <value>The timeout.</value>
        public int Timeout
        {
            get { return _timeout; }
            set { _timeout = value; }
        }

        /// <summary>
        /// Gets or sets from.
        /// </summary>
        /// <value>From.</value>
        [Required]
        public string From
        {
            get { return _from; }
            set { _from = value; }
        }

        /// <summary>
        /// Gets or sets to.
        /// </summary>
        /// <value>To.</value>
        [Required]
        public string To
        {
            get { return _to; }
            set { _to = value; }
        }

        /// <summary>
        /// Gets or sets the CC.
        /// </summary>
        /// <value>The CC.</value>
        public string CC
        {
            get { return _cc; }
            set { _cc = ((value == null) ? "" : value); }
        }

        /// <summary>
        /// Gets or sets the subject.
        /// </summary>
        /// <value>The subject.</value>
        public string Subject
        {
            get { return _subject; }
            set { _subject = ((value == null) ? "" : value); }
        }

        /// <summary>
        /// Gets or sets the body.
        /// </summary>
        /// <value>The body.</value>
        [Required]
        public string Body
        {
            get { return _body; }
            set { _body = value; }
        }

        /// <summary>
        /// Gets or sets the attachments.
        /// </summary>
        /// <value>The attachments.</value>
        public string Attachments
        {
            get { return _attachments; }
            set { _attachments = value; }
        }

        /// <summary>
        /// Gets or sets the name of the user.
        /// </summary>
        /// <value>The name of the user.</value>
        public string UserName
        {
            get { return _userName; }
            set { _userName = value; }
        }

        /// <summary>
        /// Gets or sets the password.
        /// </summary>
        /// <value>The password.</value>
        public string Password
        {
            get { return _password; }
            set { _password = value; }
        }

        /// <summary>
        /// When overridden in a derived class, executes the task.
        /// </summary>
        /// <returns>
        /// true if the task successfully executed; otherwise, false.
        /// </returns>
        public override bool Execute()
        {
            MailMessage message = new MailMessage();

            message.From = new MailAddress(_from);

            string[] toAddresses =
                _to.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            foreach (string address in toAddresses)
            {
                message.To.Add(address);
            }

            string[] ccAddresses =
                _cc.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            foreach (string address in ccAddresses)
            {
                message.CC.Add(address);
            }

            string[] attachments =
                _attachments.Split(";".ToCharArray(),
                                          StringSplitOptions.RemoveEmptyEntries);
            foreach (string attachment in attachments)
            {
                message.Attachments.Add(new Attachment(attachment.Trim()));
            }

            message.Subject = _subject;
            string _dateTime = DateTime.Now.ToUniversalTime().ToString() + "\r\n";

            message.Body = "Build completed at " + _dateTime + _body;

            SmtpClient smtpClient = new SmtpClient(_smtpHost);
            smtpClient.Timeout = _timeout;

            if (_portNumber.HasValue)
            {
                smtpClient.Port = _portNumber.Value;
            }

            smtpClient.Send(message);

            return true;
        }
    }
}

Once you have compiled you assembly simply drop it directly into the folder that contains you web deployment project.

Next open the Web Deployment Project file for editing with Visual Studio 2005 and at the following:

<UsingTask TaskName="RadDev.MSBuildClassLibrary.SmtpMail" AssemblyFile="RadDev.MSBuildClassLibrary.dll"/>
<SmtpMail SmtpHost="radicaldev"
                    To="someone@somewhere.com"
                    From="someone@somewhere.com"
                    Subject="Build Complete and Deployed to Server One"
                    Body="Version 1.0 is ready for testing." />

Here is a short snippet of my project file:

<!-- 
  Microsoft Visual Studio 2005 Web Deployment Project 
  http://go.microsoft.com/fwlink/?LinkId=55111
-->
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="RadDev.MSBuildClassLibrary.SmtpMail" AssemblyFile="RadDev.MSBuildClassLibrary.dll"/>
    .....
    <Target Name="AfterBuild">
        <SmtpMail SmtpHost="radicaldev"
                    To="someone@somewhere.com"
                    From="someone@somewhere.com"
                    Subject="Build Complete and Deployed to Server One"
                    Body="Version 1.0 is ready for testing." />
    </Target>
</Project>

Now all that remains is to build your web deployment project. Once the build completes suucessfully the email address you defined will recieve an automated email.

Sponsor
Posted by sswafford | 1 Comments

ODP.NET Developer's Guide Due Out July 2007

If you program with ODP.NET from Oracle you may find this book useful. I was fortunate enough to be honored as a technical editor for this book, now I just need to make the step up to author.

Details 

The Oracle Data Provider for .NET (ODP.NET) features optimized data access to the Oracle database from a .NET environment and allows developers to take advantage of advanced Oracle database functionality, including Real Application Clusters, XML DB, and advanced security. It can be used from any .NET language, including C# and VB.NET.

This book is a practical guide that will give you the in-depth information you need to work with the Oracle 10g v10.2 database from Visual Studio .NET 2005, using the Oracle Developer Tools and ODP.NET.

After introducing ODP.NET, we move on to dealing with SQL, PL/SQL, and XML DB using ODP.NET. Next we look at application development with ODP.NET: Web Applications, Web Services, and Mobile Applications. The last chapter covers Oracle Developer Tools for Visual Studio .NET. All the code examples are in Visual Basic.NET 2005.

Pre-order at http://www.packtpub.com/ODP-dot-net-oracle-data-provider/book#indetail

Sponsor
Posted by sswafford | 1 Comments

Skills versus Passion, are they the same?

I would like to take the time to address a problem that we all probably have encountered and maybe been guilty of ourselves from time to time. This subject is performance.

During my time as working as a software developer I have been honored to have worked side-by-side with knowledgeable and passionate people. The flip side of the coin is I have also worked side-by-side with people who have the skill set but lack passion to produce quality code and to revisit problematic areas. I have heard many times over, “what does it matter, it works!”. Well draining the oil from your vehicle then driving it down the road will work also but sooner than later you will lock down your engine. With that stated I am not saying I am perfect and no one is, but there are times that we must and should swallow our pride and take a hard look at poorly wrote code. Here is an example.

try
{
 myValue = Convert.ToString(Context.Session["objectId"]);
}
catch
{
 myValue = "0";
}
Example: 1

How many problems do you see in example 1?

In my opinion while a try/catch statement has its place, example one is not one of these cases. Rather in my opinion this statement would better be served as indicated in example 2.

if (!String.IsNullOrEmpty(Context.Session["objectId"].ToString()))
 _success = int.TryParse(Context.Session["objectId"].ToString(), out myValue);
else
 myValue = 0;
Example: 2

Interestingly enough most seasoned developers understand the performance cost of exception handling and at times it can be very expensive. Case in point; take a look at the following console application. (Note: I previously found a blog entry the presented this demonstration but for the life of me I can not located the URL.)

using System;
using System.Collections.Generic;

public class MyClass
{
 public static void Main()
 {
  ExceptionPerformance();
 }

 private static void ExceptionPerformance()
 { 
  const int _iterations = 50000;
  Console.WriteLine("Standby... Running " + _iterations + " iterations. This may take 30 to 60 seconds!");

  DateTime start = DateTime.UtcNow;
        for (int i=0; i < _iterations; i++)
        {
            try
            {
                throw new ApplicationException();
            }
            catch (ApplicationException)
            {
            }
        }
        DateTime end = DateTime.UtcNow;
        long _millis = (long) (end-start).TotalMilliseconds;
       
        Console.WriteLine("Total time taken: {0}", end-start);
        Console.WriteLine("Exceptions per millisecond: {0}", _iterations/_millis);

 }
}
Example: Console Application

As I executed this console application take note of the results and decide what you think.

Standby... Running 50000 iterations. This may take 30 to 60 seconds!
Total time taken: 00:00:02.2984959
Exceptions per millisecond: 21

Assuming my math skills are still sharp which is saying a lot, my conclusion is it took 2.3 seconds to execute at a total of 48,300 exceptions raised.

Also another mistake that I see all to often is swallowing an exception. Take a look at the following.

try
{
 ddlControl.DataSource = object.Tables[0].DefaultView;
 ddlControl.DataTextField = "myValue";
 ddlControl.DataValueField = "myId";
 ddlControl.DataBind ();
}
catch{}
Example: 3

There have been many times over the years that I have seen these types of issues and at times I simply want to throw my hands up in the air. As I previously stated, I make mistakes as does everyone but the key is to learn from your mistakes and not make them in the future. I admit that I still have a great deal to learn and I firmly believe that my passion drives me to become a better developer. There are many people within the .NET community who I would be honored to be able to work with one day and in my opinion a junior or mid level developer with a strong passion for bettering themselves could become a top level developer with the correct mentors.

In conclusion, I would be very interested in your thoughts on this matter both on the points of code performance and from the perspective of mentoring junior or mid level developers.

References:

Exceptions and Performance
Benchmarking IsNumeric Options

I have spoken on this topic with a variety of people with the .NET community and I wanted to thank you all for your viewpoints.

Sponsor
Posted by sswafford | 2 Comments

Move the ViewState off the client and cache it on the server

Recently Wally McClure did a PodCast titled ASP.NET 2.0 Page Persistence. I thought I would take Wally's idea and utilize the Microsoft Enterprise Library 3.0 and persist the ViewState to a cache object.

To implement this method you must of course download and install Enterprise Library 3.0 and establish the appropriate references within your project. In the case of this example I have simply created a base class that the web pages will inherit.

Here is a screenshot with the ViewState that is persisted to the client:

Next I have created a cache manager specifically to handle the ViewState:

Now for the base page. 

public class CachePageStatePersister : Page
{
    CacheManager viewStateCacheManager = CacheFactory.GetCacheManager("ViewState Cache Manager");

    /// <summary>
    /// Loads any saved view-state information to the <see cref="T:System.Web.UI.Page"></see> object.
    /// </summary>
    /// <returns>The saved view state.</returns>
    protected override object LoadPageStateFromPersistenceMedium()
    {
        object viewStateBag;

        try
        {
            viewStateBag = viewStateCacheManager.GetData(GetSessionId());
        }
        catch
        {
            throw new HttpException("The View State is empty");
        }

        return viewStateBag;
    }

    /// <summary>
    /// Saves the page state to persistence medium.
    /// </summary>
    /// <param name="viewStateBag">The view state bag.</param>
    protected override void SavePageStateToPersistenceMedium(object viewStateBag)
    {
        viewStateCacheManager.Add(GetSessionId(), viewStateBag);
        return;
    }

    /// <summary>
    /// Gets the session id.
    /// </summary>
    /// <returns></returns>
    public string GetSessionId()
    {
        return Session.SessionID.ToString();
    }
}

At this point the ViewState is cached on the server and you can see the difference first hand.

You can clearly see the original page size was 44KB and now the page saize is 27KB.

Be sure to listen to Wally's PodCast if you are intersted in employing SQL Server for managing the ViewState.. Good luck!

Sponsor
Posted by sswafford | 2 Comments

NetAdvantage for WPF

NetAdvantage for WPF is absolutely free if you meet the ciriteria! Read more at http://blogs.infragistics.com/blogs/eblankenship/archive/2007/04/20/cats-out-of-the-bag-netadvantage-for-wpf.aspx
Sponsor

Code Analysis in Visual Studio 2005

Recently the application I have been working on for some time now had code analysis ran on the source from a third party. For the most part the report was good but this got me to thinking about developing proper code. If you're not familiar with this feature of Visual Studio 2005 be sure to jump over to The Visual Studio Code Analysis Team Blog to learn more.

One rule violation I am seeing turning up in many of our projects is "CA1062 : Microsoft.Design : Validate parameter..." and I have tried two seperate attempts in correcting this rule violation with no success what so ever. Here are the two distince methods i have tried.

As you can see in the method AddDateToJulian() two parameters are being passed in and the first thing I do is call the static method CheckParameter() to validate the parameter theDate is not null or emtpy. Yet this warning still appears.

public static string AddDateToJulian(string theDate, int numDays)
{
 if (!UtilityBelt.CheckParameter(ref theDate, true, true, "Date"))
 {
  throw new ArgumentException(StringResources.PARAMETER_UTILITYBELT_THEDATE_IS_EMPTY );
 }
 else
 {
  ValidateJulian(theDate);
  //Works for 5 or 7 length Julian Date ('03XXX' or '2003XXX')
  int Length = theDate.Length - 3; //Day last 3 chars
  string Day = theDate.Substring(Length, theDate.Length - Length);
  Day = Convert.ToString(Convert.ToInt32(Day) + numDays);
  if (Day.Length == 2)
  {
   Day = "0" + Day;
  }
  if (Day.Length == 1)
  {
   Day = "00" + Day;
  }
  return theDate.Substring(0, Length) + Day;
 }
}

public static bool CheckParameter(ref string param, bool checkForNull, bool checkIsEmpty, string paramName)
{
 if (param == null)
  return false;
 if (checkIsEmpty && param.Length < 1)
  return false;
 return true;
}

In the next method named DateTime() I have taken a different avenue which is simply using string.IsNullOrEmpty() and the same violation occures here.

public static DateTime FormatTime(string theTime, DateTime theDate)
{
 if (string.IsNullOrEmpty(theTime) || string.IsNullOrEmpty(theDate.ToString()))
 {
  throw(new Exception(StringResources.DATE_AND_TIME_NOT_SPECIFIED_EXCEPTION_MESSAGE ));
 }
 else
 {
  if (theTime == "2400")
  {
   theTime = "0000";
  }
  if (theTime.Length < 4)
  {
   theTime = theTime.PadLeft(4, Convert.ToChar("0")); //< 10 AM (length=3) or < 1AM (length=2)
  }
  return DateTime.Parse(theDate.ToShortDateString() + " " + theTime.Substring(0,2) + ":" + theTime.Substring(2,2));
 }
}

I would love to hear you thoughts on this matter. Maybe it is just me but it seems my code above does in fact validate the parameter in question is not null within both instances.

Sponsor

Save that bandwidth and download times

Here is a tip that I thought I would share.

I believe we all as software developers want to turn out the best product we possibly can and one way we can do this is in the area of performance. Let us assume you have many javascript libraries that are part of your project and you want to compress these libraries at the time you deploy your project. I found a great tool to accomplish exactly this named ESC.

"ESC is an ECMAScript pre-processor written in JScript, enabling an unlimited number of external scripts to be compressed/crunched into supertight, bandwidth-optimized packages. Featuring several compression-techniques such as comment removal, whitespace stripping, newline stripping and variable substitution ESC can reduce the overall size of your code with up to ~45%. Single, multiple scripts and even directories with scripts can be merged together at the compression level you decide."

I use Visual Studio 2005 Web Deployment Projects for my build and deployment process.

All you need to do in place the ESC script in you solutions root directory and created a batch file to perform the compression of your JavaScript files.

Example batch file:
cscript C:\MyDevelopment\SourceCode\MyProject\esc.wsf -l 3 -ow C:\MyDevelopment\SourceCode\MyProject\v1.0\V1.0_Release\Release\scripts\ThemePreview.js "C:\MyDevelopment\SourceCode\MyProject\v1.0_Release\Release\scripts\ThemePreview.js"

Now all that remains is to add this action to the deployment project. I accomplish this step in the action "AfterBuild".

Example:
<Message Text="Standby... Compressing JavaScript." Importance="high"></Message>
<Exec Command="C:\MyDevelopment\SourceCode\MyProject\v1.0\compress_js.bat"></Exec>

Now all that remains is to deploy the project itself with the tightly compressed JavaScript files. However deployment is another topic in itself. Good luck and I hope you find this tip useful.

Sponsor

Thanks goes out to Packt Publishing

I must say that I was honored when Packt Publishing contacted me to determine if I was interested in being a technical editor for a soon to be published book dealing with ODP.NET. While I do not nor cannot go into details about the book itself, I find this opportunity an honor and fitting since I use ODP.NET and Oracle in my day job.
Sponsor
Posted by sswafford | 1 Comments

Very cool dock - and it is FREE!

While surfing the web I ran across Punk Software and a product named RocketDock.

I have to admit I would have loved to see something like this built directly into Vista. While I am on the subject of Vista I want to step up on my soapbox for a minute.

Mid 2006 I purchased a HP DV5120US AMD64 Laptop that is Vista capable and as of today I am still waiting for HP to release a stable graphics driver for the ATI XPress 200M graphics card. What makes matters worse in my opinion is I can download drivers for the network card, sound card, and even flash the BIOS so that the buttons to contol the DVD and sound work properly on Vista. How can I even determine if any of the drivers or BIOS upgrade work if I can not run Vista due to no graphics driver. Seems to me the carriage is being placed in from of the horse.

Yes, I realized Microsoft ships a driver as part of the Vista install and I can download the sofware directly from ATI, however it seems the HP hardware and Vista do not play well together. The BSOD occurs so much that it is pointless to even attempt to run Vista on this laptop. Come on HP, get a working graphics driver out there.

Now back to the original topic of this post. If you like RocketDock, please donate or purchase a t-shirt. While it is great that this product is free it takes $$$ to keep it free.

Sponsor

Is Microsoft ever going to address the select tag bleed-thru problem?

Like a lot of other folks I could not wait to get my hands on ASP.NET AJAX 1.0 and the updated Control Toolkit. Today I wanted to incorporate the Animation control and the control itself works as intended however those darn select tags are still bleeding thru.

I am going to jump over to the Control Toolkit at CodePlex and report this "Bug". Anyone have any thoughts on this continuing problem?

Sponsor
Posted by sswafford | 7 Comments

ASP.NET AJAX v1.0 Sys is undefined error

I have seen many blog entries and forum threads on this error however I was curious if anyone has any insight as to why this error seems to occur on Windows 2003 Server SP1 and not XP Pro SP2. I have not tested on Windows 2000 or 2003 without SP1.

 When I deployed my application to the production server which is Windows Server 2003 SP1, I received this error after the ASP.NET AJAX 1.0 installation. Now I have never used a beta or RC release so this is the first time using ASP.NET AJAX in my application.

I turned to Google and I found the following:

if you are using Windows 2003 as web server then you'll face this "sys is undefined" error .to get rid of this weird problem follow the following steps:

  1. Open IIS and right click on your web site virtual directory and then click properties
  2. Then on virtual directory tab click on configuration button
  3. In mappings tab set the configuration like this.

    Executable: "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" - locate this dll file
    Extension: .axd
    Verbs: All Verbs
    Script Engine: checked
    Check that file exists: do not check this.
  4. Finally click OK.

The axd extension was in fact registered on the server but the Verbs was not set to allow all.

 

Once I made this change everything was fine. What makes this confusing to me is I do not have to select all verbs on XP PRO SP2.

My question is has others had this problem and is the above fix accurate?

Sponsor
Posted by sswafford | 5 Comments
Filed under:
More Posts Next page »