导航

聚合

«2008年11月»
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

Blog统计

新闻/公告

存档

随笔分类

文章分类

相册

UrlMappingModule

UrlMappingModule

By Mike Ellison

Bringing MVC Framework-style URL redirections to classic ASP.NET 2.0 WebForms development

Introduction

URL redirection or rewriting, is the process of intercepting an incoming request URL and redirecting it internally such that a potentially different page handles the request. For example, an incoming URL requesting the application resource Reports/Customer/407.aspx may be internally redirected to DisplayCustomer.aspx?ID=407, with a different page (DisplayCustomer.aspx) actually processing the request. To the end user, this internal redirection is transparent, and the requesting URL remains Reports/Customer/407.aspx. The originally requested page (407.aspx) need not even exist in the application.

Typically a URL rewriting engine will use a list of regular expressions to provide rules for mapping an incoming URL to a redirected URL; there are a number of examples available both commercially and in the public domain of such engines. The MVC Framework, recently made available as a community preview, includes a powerful and easy-to-use engine for mapping incoming URLs to controller classes that process a given Web request. By using syntax of square-bracketed [tokens] within URL templates, the MVC Framework simplifies the specification of mapping rules, eliminating the need for more complicated regular expressions. For example, the URL template Reports/[Type]/[ID].aspx can be listed among mapping rules; when an incoming URL matches this pattern, the proper controller is activated and values for the tokens [Type] and [ID] are automatically parsed. This syntax is elegant, simple to apply, and easy to understand.

This article presents a URL redirection engine called UrlMappingModule designed for the ASP.NET 2.0 WebForms environment and inspired by the MVC Framework's [token]-based syntax. The module implements IHttpModule and is attached to the ASP.NET HTTP pipeline through Web.config entries. The module supports a provider model for the supplying of URL redirection rules, with two concrete providers, XmlUrlMappingProvider and SqlUrlMappingProvider, available in the module's assembly. While the developer may implement the included IUrlMappingProvider interface to take full control of regular expression syntax for pattern matching, the two built-in providers support the simplicity of [tokens] in URL template strings. When incoming URLs are matched to a pattern with tokens, token names and values are automatically appended to the redirection URL as querystring arguments and thus are available to the page handling the request through the normal Request.QueryString collection.

Using the UrlMappingModule with the XmlUrlMappingProvider

The XmlUrlMappingProvider supplies the UrlMappingModule with URL templates and redirection mappings from an XML file, typically stored in the web application's App_Data directory. Mappings are defined in the XML file as <urlMapping> nodes with three attributes: name, urlTemplate, and redirection.

  • The name attribute specifies a developer-relevant name and is not used directly by the UrlMappingModule.
  • The urlTemplate attribute is a string specifying an incoming URL or URL pattern to match. The urlTemplate may reflect a static URL, such as Reports.aspx, or may include token names in [squareBrackets] to imply a pattern for dynamic matching, such as Reports/[ReportID].aspx.
  • The redirection attribute is a string specifying the URL to redirect to when the corresponding urlTemplate is matched on an incoming URL.

A fourth attribute, enabled, is optional, and may be set to true or false to enable or disable the particular mapping rule respectively. By default, mapping rules are enabled.

The following shows an example of an XML file with URL mapping rules:

<?xml version="1.0" encoding="utf-8" ?>
<urlMappings>

  <urlMapping name="default"
              urlTemplate="Default.aspx"
              redirection="Default.aspx"
              enabled="true"
              />

  <urlMapping name="msdn"
              urlTemplate="msdn.aspx"
              redirection="http://www.msdn.com"
              />

  <urlMapping name="customerReports"
              urlTemplate="Customers/[ID]/[Action].aspx"
              redirection="CustReports.aspx"
              enabled="true"
              />

</urlMappings>

Note that the urlTemplate attributes all assume an application-relative incoming URL. Also note, each urlTemplate must incorporate an extension that IIS has mapped to the ASP.NET process (in all examples in this article, the extension will be ASPX). The first item, default shows a static redirection to the same application-relative URL. The second, msdn, shows a static redirection to an external Web site. The third, customerReports, shows a dynamic redirection, using [tokens] in the urlTemplate to represent portions of a possible incoming URL. If an incoming URL matches the pattern, the [ID] and [Action] values are parsed and appended as querystring values to the redirection page CustReports.aspx.

For example, an incoming URL of Customers/407/Display.aspx is matched according to this third mapping rule and redirected to the application URL CustReports.aspx?ID=407&Action=Display. Matches are attempted in the order in which <urlMapping> items appear in the file; in the event an incoming URL could match multiple items, the redirection of the first item matched is used.

Assuming the URL mapping file is stored in the APP_DATA directory with the filename urlMappings.xml, the following shows an example of the Web.config settings necessary to make use of the provider with this file. Note that three separate pieces of configuration are required:

  • The <configSections> section tag entry, identifying that the provider-specific XmlUrlMappingProviderConfiguration object should be used for configuration
  • The <urlMappingModule> entry including the urlMappingFile attribute specifying the XML file providing the mapping rules
  • The <httpModules> entry, telling ASP.NET to include the UrlMappingModule in the pipeline
Collapse
 <configuration>
  <configSections>
    <section name="urlMappingModule"
             type="UNLV.IAP.UrlMapping.XmlUrlMappingProviderConfiguration,
                    UrlMappingModule"
             />
  </configSections>

  <urlMappingModule providerType="UNLV.IAP.UrlMapping.XmlUrlMappingProvider,
                                    UrlMappingModule"
                    noMatchAction="ThrowException"
                    noMatchRedirectUrl=""
                    incomingQueryStringBehavior="PassThrough"
                    ignoreExtensions=".js .css"
                    automaticallyUpdateFormAction="true"
                    urlProcessingEvent="BeginRequest"
                    urlMappingFile="~/App_Data/urlMappings.xml"
                    useDependency="true"
                    />

  <system.web>
    <httpModules>
      <add name="UrlMappingModule"
           type="UNLV.IAP.UrlMapping.UrlMappingModule, UrlMappingModule"
           />
    </httpModules>
  </system.web>

</configuration>

The name for the custom configuration section is required to be literally urlMappingModule. The attributes for the configuration section include those that affect the behavior of the UrlMappingModule itself (providerType, noMatchAction, noMatchRedirectUrl, incomingQueryStringBehavior, ignoreExtensions, automaticallyUpdateFormAction, and urlProcessingEvent) as well as those specific to the XmlUrlMappingProvider (urlMappingFile and useDependency).

  • providerType - Specifies the type of the provider used by the UrlMappingModule (in this case, the XmlUrlMappingProvider)
  • noMatchAction - One of four actions the UrlMappingModule may take when it fails to match an incoming URL given the provided set of mapping rules. Possible values are defined by the NoMatchActionEnum enumeration:
    • PassThrough – (default) Allow an unmatched URL to continue to be processed normally by the ASP.NET engine.
    • ThrowException - Throw a NoMatchFoundException when presented with an unmatched URL.
    • Return404 - Return a 404 (page not found) error code to the browser when presented with an unmatched URL.
    • Redirect - Redirect to the page specified in the configuration's noMatchRedirectUrl attribute when presented with an unmatched URL.
  • incomingQueryStringBehavior - One of three behaviors to influence how the UrlMappingModule treats querystring arguments on an incoming URL. Possible values are defined by the IncomingQueryStringBehaviorEnum enumeration:
    • PassThrough – (default) Ignore incoming querystring values when pattern matching a URL, but apply those values to the redirected URL.
    • Ignore – Ignore incoming querystring values when pattern matching a URL, and do not apply those values to the redirected URL.
    • Include - Include the querystring on an incoming URL when pattern matching.

    To further illustrate how incoming querystring values are treated, consider the following examples. If PassThrough is specified, an incoming querystring of Default.aspx?cat=1 will be treated as Default.aspx for the sake of pattern matching. If a match is found, "cat=1" will be appended to the redirection URL as part of the redirected querystring.

    If Ignore is specified, an incoming querystring of Default.aspx?cat=1 will be treated as Default.aspx for the sake of pattern matching. If a match is found, "cat=1" will not be appended to the redirection URL.

    If Include is specified, an incoming querystring of "Default.aspx?cat=1" will be treated literally as Default.aspx?cat=1 for the sake of pattern matching. If that URL is compared to a URL template of Default.aspx, the match is not made - the URL template would need to incorporate potential querystring input. For example, a URL template may capture a specific querystring value using a template such as Default.aspx?cat=[cat]. In this case, the redirected URL will append "cat=xxx" to the querystring.

  • ignoreExtensions – A list of file extensions, requests for which will be ignored completely by the UrlMappingModule. For example, to allow all requests for JavaScript files and CSS stylesheets to pass by the UrlMappingModule and be processed without redirection as normal by ASP.NET, set this attribute to the string .js .css. Separate multiple items with spaces or commas.
  • automaticallyUpdateFormAction – An optional Boolean instructing the UrlMappingModule to automatically adjust rendered <form action=”…”> tags such that the action for a redirected form matches the incoming URL. See Points of Interest below for more information. The default value is true.
  • urlProcessingEvent – One of three options which determines when in the request cycle the UrlMappingModule processes the incoming URL. Possible values are defined by the UrlProcessingEventEnum enumeration:
    • BeginRequest – (default) – Process incoming requests in the application’s BeginRequest event. This is the common choice when authentication is not required.
    • AuthenticateRequest – Process incoming requests in the application’s AuthenticateRequest event. This option may be helpful, particularly if the application employs Windows authentication.
    • AuthorizeRequest - Process incoming requests in the application’s AuthorizeRequest event. This option may be helpful, particularly if the application employs Forms authentication.

    Scott Mitchell describes issues surrounding the timing of URL rewriting with respect to other HttpModules (such as those that manage application authorization) very well in the article URL Rewriting in ASP.NET[^]. Readers who want a more thorough discussion on URL rewriting in general, and event handling specifically, are encouraged to read his article.

  • urlMappingFile - The application-relative path to the XML file with <urlMapping> rules defined.
  • useDependency - A Boolean that determines whether the internally-cached mapping items should be updated automatically as changes are made in the urlMappingFile. If set to true, a CacheDependency[^] object is used internally to poll the urlMappingFile for changes. If false, changes made to the urlMappingFile are only incorporated upon the next application startup, or upon an explicit call to the static utility method UrlMappingModule.RefreshUrlMappings().

Using the UrlMappingModule with the SqlUrlMappingProvider

The SqlUrlMappingProvider supplies the UrlMappingModule with redirection rules from an SQL Server database. The database must supply a stored procedure that returns at least three named columns: [Name], [UrlTemplate], and [Redirection], with records sorted as desired for the UrlMappingManager to match incoming URLs. As with the XmlUrlMappingProvider, the UrlTemplate column may include strings with square-bracketed [tokens] to imply patterns for matching.

The following shows an example of an SQL script with commands to create and populate a UrlMappings table, and a stored procedure for supplying the UrlMappingModule with matching rules:

-- create the mappings table
create table UrlMappings
(
   [Name] varchar(255) NOT NULL
  ,[UrlTemplate] varchar(8000) NOT NULL
  ,[Redirection] varchar(8000) NOT NULL
  ,[SortOrder] numeric(18,0) NOT NULL
 )

--  populate the table with sample data
insert into UrlMappings
  values('default', 'Default.aspx', 'Default.aspx', 1);

insert into UrlMappings
  values('msdn', 'msdn.aspx', 'http://www.msdn.com', 2);

insert into UrlMappings
  values('customerReports', 'Customers/[ID]/[Action].aspx', 
            'CustReports.aspx', 3);

-- create the stored procedure
create procedure GetUrlMappings
as
begin
  select Name,UrlTemplate,Redirection
    from UrlMappings
    order by SortOrder, Name
end

The developer may include any other columns in the UrlMappings table as desired, but the stored procedure must return at least three columns with the literal names [Name], [UrlTemplate], and [Redirection], or an exception is thrown upon usage. Assuming the table name UrlMappings, the stored procedure name GetUrlMappings, and a connection string name UrlMappingData defined in the <connectionStrings> entry of the Web.config file, the following shows the additional Web.config settings required to configure the UrlMappingModule for use with the SqlUrlMappingProvider:

Collapse
 <configuration>
  <configSections>
    <section name="urlMappingModule"
             type="UNLV.IAP.UrlMapping.SqlUrlMappingProviderConfiguration,
                     UrlMappingModule"
             />
  </configSections>

  <urlMappingModule
   providerType="UNLV.IAP.UrlMapping.SqlUrlMappingProvider, UrlMappingModule"
                    noMatchAction="ThrowException"
                    noMatchRedirectUrl=""
                    incomingQueryStringBehavior="PassThrough"
                    ignoreExtensions=".js .css"
                    automaticallyUpdateFormAction="true"
                    urlProcessingEvent="BeginRequest"
                    connectionStringName="UrlMappingData"
                    tableName="UrlMappings"
                    procName="GetUrlMappings"
                    useDependency="true"
                    dependencyName="UrlMappingDep"
                    />

  <system.web>
    <httpModules>
      <add name="UrlMappingModule"
           type="UNLV.IAP.UrlMapping.UrlMappingModule, UrlMappingModule"
           />
    </httpModules>
  </system.web>

</configuration>

As already stated, the <urlMappingModule> attributes providerType, noMatchAction, noMatchRedirectUrl, incomingQueryStringBehavior, ignoreExtensions, automaticallyUpdateFormAction,and urlProcessingEvent affect the module itself and function as described above, with providerType specifying the SqlUrlMappingProvider type. Additional attributes that affect the behavior of the SqlUrlMappingProvider specifically are as follows:

  • connectionStringName - Specifies the name of the <connectionString> entry that defines the SQL Server database connection
  • tableName - The name of the SQL Server database table containing URL templates and redirection mappings
  • procName - The name of the SQL Server stored procedure that retrieves a data set of URL redirection rules. The procedure must accept no arguments and return a result set with three named columns: [Name], [UrlTemplate], and [Redirection].
  • useDependency - Determines whether the table identified by tableName should be periodically polled for changes. If useDependency is set to true, polling should occur and the internally-cached data for URL mappings will be refreshed automatically upon updates. If useDependency is false, changes in the persisted mapping table will be reflected only upon the next application startup, or upon an explicit call to the static utility method UrlMappingModule.RefreshUrlMappings().
  • dependencyName - Used when useDependency="true" to specify the name of the associated sqlCacheDependency entry in the Web.config file.

Additional configuration is necessary when a dependency is requested (i.e. useDependency="true"); specifically, the database and table must be configured for cache dependencies. For SQL Server 2000 or 2005 databases, the command line tool aspnet_regsql.exe[^] may be run with the following syntax to enable cache dependencies:

aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed
    -d <DatabaseName> -et -t <TableName>

To run the utility and authenticate with Windows credentials, use the following syntax instead:

aspnet_regsql.exe -S <Server> -E -ed -d <DatabaseName> -et -t <TableName>

An additional Web.config entry defining configuration for the dependency is also required. The following shows an example of such an entry:

<system.web>
  <caching>
    <sqlCacheDependency enabled="true">
      <databases>
        <add name="UrlMappingDep" connectionStringName="UrlMappingData"
             pollTime="30000"
             />
      </databases>
    </sqlCacheDependency>
  </caching>
</system.web>

The dependency name is referenced in the <urlMappingModule>'s dependencyName attribute, and the pollTime indicates how frequently tableName should be polled for changes (in milliseconds).

In addition to the aspnet_regsql.exe tool, databases may be programmatically prepared to support cache dependencies by using static methods of the SqlCacheDependencyAdmin[^] class found in the System.Web.Caching namespace. The TestSqlUrlMappingModule project in the article download shows an example of such code in the EnableNotifications.aspx page. This code was executed once in the sample project to enable cache dependencies in its accompanying SQL Server 2005 Express database.

If the developer prefers not to have the overhead associated with automatic polling, he or she may set useDependency="false" and explicitly refresh the cached mapping data by calling the static method UrlMappingModule.RefreshUrlMappings().

Developing a Custom Provider: IUrlMappingProvider

Developers who wish to persist mapping rules using something other than an XML file or SQL Server database, or who wish to fully control pattern-matching regular expression syntax may create a custom provider. To create a custom provider, define a class that implements the IUrlMappingProvider interface. If provider-specific configuration attributes are desired, then subclass the UrlMappingProviderConfiguration class as well.

Among the IUrlMappingProvider methods to implement are Initialize(), Dispose(), and GetUrlMappings().

Typically a provider will create an in-memory cache of mapping rules in the form of a UrlMappingItemCollection, usually in its Initialize() method. The module provides the Initialize() method with a configuration object, either UrlMappingProviderConfiguration or a subclassed object specific to the provider. With this configuration, the provider reads mapping rules from its persistence medium and creates its UrlMappingItemCollection. In the Initialize() method, the developer may cast the supplied configuration object to a custom subclass as necessary, using code like the following:

void IUrlMappingProvider.Initialize(UrlMappingProviderConfiguration config)
{
    // cast the configuration object provided by the module to our
    // custom configuration object
    CustomUrlMappingProviderConfiguration myConfig
         = (config as CustomUrlMappingProviderConfiguration);

    if (myConfig == null)
        throw new ProviderException(
          "Invalid CustomUrlMappingProvider configuration."
        );

    // process configuration settings and construct UrlMappingItem rules...
    // ...
}

Individual mapping rules are typed as UrlMappingItem objects. These expose a UrlTarget property as a Regex object and a Redirection property as a string. The provider establishes regular expressions for matching and associated redirection URLs with these properties. Should the developer wish to incorporate the same [token] syntax as supported by the built-in providers, the developer may use the utility method UrlMappingHelper.CreateTemplatedMappingItem() to create its UrlMappingItem collection.

The provider returns its cached UrlMappingItemCollection through its implementation of the GetUrlMappings() method and may release any resources it consumed in Initialize() by implementing Dispose(). For providers to support explicit refreshing of their mapping rules, developers may implement the RefreshUrlMappings() and GetLastRefreshTime() methods. The source code for the built-in providers demonstrates implementations for each of these methods.

The custom provider may be compiled into its own assembly, or it may exist as a stand-alone class file in the APP_CODE directory of a Web application project. In the latter case, the UrlMappingModule uses the BuildManager[^] class to instantiate the provider. This requires a permissions context on the server (specifically, medium level for the Demand security action). If the appropriate permission level is not available, an attempt to use BuildManager will trigger an exception. This may be avoided by compiling the provider into its own assembly and referencing that assembly in the Web application project.

Once created, the declarative configuration for a custom provider is similar to that of the built-in XML and SQL providers. Assuming the provider type is defined as MyNamespace.CustomUrlMappingProvider, with a CustomUrlMappingProviderConfiguration subclass for adding relevant configuration attributes, packaged in an assembly called MyProviderAssembly.dll, the UrlMappingModule may be configured in Web.config like the following:

 <configuration>
  <configSections>
    <section name="urlMappingModule"
             type="MyNamespace.CustomUrlMappingProviderConfiguration,
                    MyProviderAssembly"
             />
  </configSections>

  <urlMappingModule providerType="MyNamespace.CustomUrlMappingProvider,
                                   MyProviderAssembly"
                    noMatchAction="..."
                    noMatchRedirectUrl="..."
                    incomingQueryStringBehavior="..."
                    customAttribute1="..."
                    customAttribute2="..."
                    customAttribute3="..."
                    ...
                    />

  <system.web>
    <httpModules>
      <add name="UrlMappingModule"
           type="UNLV.IAP.UrlMapping.UrlMappingModule, UrlMappingModule"
           />
    </httpModules>
  </system.web>

</configuration>

The article download contains the project TestUrlMappingModule, which demonstrates a custom implementation of IUrlMappingProvider in the APP_CODE directory. As there are no custom configuration options necessary for this sample implementation, the configuration object specified in Web.config is the base class UrlMappingProviderConfiguration.

Points of Interest

One difficulty that all ASP.NET 2.0 URL rewriting engines eventually face lies in the rendered <form action="..."> tag of the page. Without any adjustment, the form’s action attribute reflects the redirected URL rather than the incoming URL. Postbacks then go directly to the redirection URL, which is typically undesirable and potentially unmatchable depending on the module configuration. Even worse, the ViewState context can be corrupted.

A number of individuals have offered several creative ways to handle this problem. Some use a small piece of JavaScript code to rewrite the action attribute client-side. Some use a customized HtmlTextWriter, or custom Page subclasses to deal with the issue. There is certainly no one right answer, as each approach has its benefits and costs.

To keep the deployment of this engine as simple as possible, the UrlMappingModule addresses the form action problem by injecting a small code method in the PreRender event of affected Web forms. This injection occurs in the module's handler for the PostMapRequest event:

protected void OnPostMapRequestHandler(object sender, EventArgs e)
{
    // test to see if the handler for this request is a WebForm page
    HttpApplication app = (sender as HttpApplication);
    if (app != null)
    {
        Page page = (app.Context.Handler as Page);
        if (page != null)
        {
            // a page handler is responding to the request;
            // add the hook to update the form action for the page
            if (HttpContext.Current.Items[kCONTEXTITEMS_RAWURLKEY] != null)
                page.PreRender += new EventHandler(OnPagePreRender);
        }
    }
}

The injected PreRender code then uses the RewritePath() method of the current HttpContext to re-establish the incoming URL prior to rendering. This allows the action attribute on the <form> tag to be rendered correctly for the incoming URL.

protected void OnPagePreRender(object sender, EventArgs e)
{
    // make sure the page being rerouted has the proper form action
    if (HttpContext.Current.Items[kCONTEXTITEMS_RAWURLKEY] != null)
    {
        string rawPath = 
            HttpContext.Current.Items[kCONTEXTITEMS_RAWURLKEY].ToString();

        // was there a query string in the original unmapped request?
        string qs = "";
        if (rawPath.Contains("?"))
        {
            int index = rawPath.IndexOf("?");
            qs = (_qsBehavior == IncomingQueryStringBehaviorEnum.Ignore
                      ? ""
                      : qs = rawPath.Substring(index + 1)
                  );
            rawPath = rawPath.Remove(index);
        }
        HttpContext.Current.RewritePath(rawPath, "", qs, false);
    }
}

There is an important ramification to this adjustment: querystring variables that are included as a result of parsing a URL template for [tokens] are no longer available in the page's PreRender event. Developers should use an event earlier in the page lifecycle, such as Page.Load, to retrieve these querystring variables. The benefit to this cost is that there is no additional HtmlTextWriter, specialized Page subclass, or special JavaScript component necessary for deployment, and no need to modify individual pages.

While adjusting the <form attribute='...'> tag in some way is important to preserve proper ViewState and postback context, the form adjustment automatically made by the UrlMappingModule may be disabled if desired by including the attribute automaticallyUpdateFormAction="false" in the Web.config <urlMappingModule> configuration section. By default, automaticallyUpdateFormAction is true.

Summary

The UrlMappingModule is an HttpModule that provides a URL redirection capability to an ASP.NET 2.0 WebForms project. Mapping rules are supplied by a provider object that implements IUrlMappingProvider, of which the built-in XmlUrlMappingProvider and SqlUrlMappingProvider are examples. Inspired by the simple [token] syntax allowed for by the MVC Framework's URL mapping engine, built-in UrlMappingProviders internally convert such templates to a regular expression for matching incoming URLs. Token names and values are parsed from matched incoming URLs and appended as querystring values to the redirection URL. To re-associate a WebForm's rendered <form action="..."> tag with the incoming URL rather than the redirected one, the module injects code in the Page.PreRender event, thus avoiding the need for additional components or form-by-form coding. The module is presented in the hope that MVC-style URL redirection adds value for developers working within the 2.0 WebForms Framework.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

打印 | 发表于 2008年2月28日 17:58

评论

# i4AENC <a href="http://ftbqtbusfatf.com/">ftbqtbusfatf</a>, [url=http://rojmqlqhdjav.com/]rojmqlqhdjav[/url], [link=http://ihrmsisnbpjy.com/]ihrmsisnbpjy[/link], http://cweapqikjsqc.com/

i4AENC ftbqtbusfatf, [url=http://rojmqlqhdjav.com/]rojmqlqhdjav[/url], [link=http://ihrmsisnbpjy.com/]ihrmsisnbpjy[/link], http://cweapqikjsqc.com/
2008/8/14 6:22 | vistftphexw

# Limited offers!, , <a href="http://generobinson.justfree.com/of9691.html">of</a>, =DDD,

Limited offers!, , of, =DDD,
2008/8/21 18:31 | Olivia

# Limited offers!, , <a href="http://gilzaweb.fr33webhost.com/of6121.html">of</a>, ofswj,

Limited offers!, , of, ofswj,
2008/8/22 4:49 | Michael

# Not about the international sites, ,

Not about the international sites, ,
2008/9/13 14:49 | Jack

# Especially after seeing a recently featured ,

Especially after seeing a recently featured ,
2008/9/14 18:21 | Dana

# Im in the US, but I found more interesting ,

Im in the US, but I found more interesting ,
2008/9/14 22:58 | Lion

# I spend more time writing in blogs than ,

I spend more time writing in blogs than ,
2008/9/15 16:55 | Hanna

# issue which needs many brains to provide a solution. ,

issue which needs many brains to provide a solution. ,
2008/9/15 20:09 | judoka

# Control of information is hugely powerful. ,

Control of information is hugely powerful. ,
2008/9/15 23:23 | Bill

# the content has not been "broken down" by region. ,

the content has not been "broken down" by region. ,
2008/9/16 4:59 | Rax

# wuedlqn tojrzqmw

yxru wksb gpkslzjqv zgcjlurb hbnv czdxs xrflja
2008/9/16 23:10 | isnmyd@gmail.com

# ygpdrc ockzwsj

wyhpunias adwpeq nglbmij rnmjdw mtuclk lrgnz ghzvdlmy http://www.zsrhvtug.wszfgdb.com
2008/9/16 23:11 | yasijncq@gmail.com

# dhjxnlacu wyoxphaju

anhpft zfsy wgkhco edljz pdkster lyrhcmav efmvkurs kujy tbkoanez
2008/9/16 23:12 | nkgbi@gmail.com

# phone

xmeds ibtrefy xaupyre
phone
2008/9/16 23:42 | rfzycdl@hotmail.com

# phone

gxwecqm fgns
phone
2008/9/17 0:44 | neal@hotmail.com

# phone

sxendp crydpv yfto
phone
2008/9/17 0:53 | nsiage@hotmail.com

# phone

ftujrgk tgup
phone
2008/9/17 1:09 | ploe@hotmail.com

# phone

znewvt ihrxc numxtjg bsdxy
phone
2008/9/17 1:15 | dkibpzu@hotmail.com

# phone

hcebxvg lwtp yispxzh bkeruij
phone
2008/9/17 2:15 | nqhmuw@hotmail.com

# phone

ugqwnp
phone
2008/9/17 2:39 | tjnpa@hotmail.com

# phone

spyifau ksvhi hvziogu fvtuskg
phone
2008/9/17 3:32 | ixcdan@hotmail.com

# phone

vmtoga brpfgv oifbh
phone
2008/9/17 3:46 | mwkucq@hotmail.com

# phone

phbz khqple fzcosw
phone
2008/9/17 3:48 | knrdfit@hotmail.com

# phone

stckuy hmnva
phone
2008/9/17 4:23 | vlxp@hotmail.com

# phone

brdojh prhzmc qkhsb bweo
phone
2008/9/17 4:52 | ixzcbfw@hotmail.com

# phone

vltfp yeord
phone
2008/9/17 5:46 | pgtn@hotmail.com

# phone

yqhik
phone
2008/9/17 6:02 | btvq@hotmail.com

# phone

dsya uphf pnwgmo
phone
2008/9/17 6:15 | wksge@hotmail.com

# phone

ijewmo envjtl nwthlpx
phone
2008/9/17 6:19 | aosdfzm@hotmail.com

# phone

plqyjav gilqso zfaol
phone
2008/9/17 6:33 | frpct@hotmail.com

# phone

gatpvd ueokhv xswptc oivcuta
phone
2008/9/17 7:19 | kojs@hotmail.com

# phone

ofhjb
phone
2008/9/17 7:39 | owsgyri@hotmail.com

# phone

aixqdor
phone
2008/9/17 7:39 | afejrhp@hotmail.com

# phone

xkefib pqhoukf fpbdh
phone
2008/9/17 7:52 | zkug@hotmail.com

# book de diazepam guest site

gvmnyl eigxjmf wnkgqm lmju
buy propecia generic
2008/9/17 9:11 | xyhim@hotmail.com

# training schedules for athletes throughout the world. ,

training schedules for athletes throughout the world. ,
2008/9/17 9:44 | Ben

# soccer

wievfzm zlrs
soccer
2008/9/17 16:53 | djzr@hotmail.com

# hockey

xoubv
hockey
2008/9/17 17:50 | nukyf@hotmail.com

# soccer

ukqyabs fsmq oqia
soccer
2008/9/17 18:04 | gfthdra@hotmail.com

# soccer

vitl ylmi thfo
soccer
2008/9/17 18:52 | gohqv@hotmail.com

# soccer

mxglo yunmh ixspbou
soccer
2008/9/17 19:37 | zvcfq@hotmail.com

# soccer

xfknyzp
soccer
2008/9/17 19:48 | sluztqw@hotmail.com

# hockey

tgoum divyjh dvjrq
hockey
2008/9/17 20:27 | fqlwmv@hotmail.com

# soccer

jhgduz
soccer
2008/9/17 22:39 | emibnrc@hotmail.com

# soccer

dcnw gfkx
soccer
2008/9/18 0:22 | rmkvq@hotmail.com

# hockey

wigl ojnv jlxad domg
hockey
2008/9/18 0:32 | upogbc@hotmail.com

# hockey

qejyf cykgu rycik
hockey
2008/9/18 2:14 | xpinjfw@hotmail.com

# least across national borders. I quite like the ,

least across national borders. I quite like the ,
2008/9/18 2:14 | Ded Mazai

# soccer

shlb hdqv qvlu jynbsx
soccer
2008/9/18 3:21 | ufiek@hotmail.com

# hockey

kfgv nkets rkmwsup
hockey
2008/9/18 4:26 | ehyvr@hotmail.com

# soccer

glrbix fwjxis tkydp wjqe
soccer
2008/9/18 4:31 | qolydks@hotmail.com

# hockey

qdpf temqxz
hockey
2008/9/18 5:21 | hdskb@hotmail.com

# hockey

galcyq jvgub ocyiemq qulag
hockey
2008/9/18 6:21 | bctqore@hotmail.com

# soccer

srdvi svhfoet
soccer
2008/9/18 7:22 | mqlc@hotmail.com

# am fm radio headphones

tniow jsmfy
optimum online phone
2008/9/18 16:08 | gavocs@hotmail.com

# case cell hello kitty phone

awxnm vbgty fsxjkeu zgyme
album beatles in mp3
2008/9/18 17:29 | dtsohxf@hotmail.com

# old navy music commercial

jplr
expandable phone
2008/9/18 18:07 | fkpnda@hotmail.com

# native african music

ibnomz
cheap mp3 player price
2008/9/18 18:43 | lgrmjnz@hotmail.com

# listen to african music

eohx fpbvzgr crhpndj dcqsv
gem ring ring stone
2008/9/18 19:14 | akigmfv@hotmail.com

# number page phone sydney white

bdlgyj crdnfx
cell dylan number phone sprouse
2008/9/18 20:45 | xeowlkh@hotmail.com

# accessory camera phone

vcyqedr wjlmar
phone area code city
2008/9/18 21:53 | htjnw@hotmail.com

# application mobile phone software

uosnl gwnsb ocrzjma
classifieds ontario snowmobile
2008/9/18 22:56 | zkgae@hotmail.com

# music

oezg esvdg czwmkjb yjkca
music
2008/9/19 0:16 | vbjfklw@hotmail.com

# music

rfzo
music
2008/9/19 0:45 | mkvo@hotmail.com

# music

gwecis
music
2008/9/19 1:14 | ilnsaqk@hotmail.com

# music

dtkc ocbvj tnfv yadtz
music
2008/9/19 1:41 | xnutoej@hotmail.com

# music

etcjys klsxn
music
2008/9/19 2:47 | oljs@hotmail.com

# music

voxjk akzl
music
2008/9/19 3:22 | oqmheti@hotmail.com

# music

qesfjtn rsig riyfb
music
2008/9/19 3:50 | fzuslam@hotmail.com

# music

esdquwh upljgwt wygiv jzaf
music
2008/9/19 4:21 | txmnk@hotmail.com

# music

zmpgh wzbcltu zpmv
music
2008/9/19 4:50 | ocba@hotmail.com

# music

edsi
music
2008/9/19 6:06 | cxkf@hotmail.com

# music

ebhwdup ievnf biwv
music
2008/9/19 6:33 | kmrw@hotmail.com

#  &#1089

ajlis vidsh
&#1077
2008/9/19 7:00 | tpfzubg@hotmail.com

# 

tpve tidm zmpgaub gwhea
&#1079
2008/9/19 7:26 | zfvmle@hotmail.com

# &#1093

bkezah
&#1077
2008/9/19 8:36 | xjlmgdy@hotmail.com

# &#1097

vzip xefucr
&#1085
2008/9/20 4:18 | fpmbor@hotmail.com

# &#1073

kjnwa vawdejt zgywt
&#1073
2008/9/20 4:34 | oajsn@hotmail.com

# &#1088

ftbmrzw jwntmcz
&#1085
2008/9/20 4:57 | kwvo@hotmail.com

# &#1082

ygwzr anzsdx
&#1082
2008/9/20 5:09 | bjayc@hotmail.com

# &#1088

iszqbot tkpfryj dpoh fzvkncb
&#1086
2008/9/20 5:11 | khxnbtr@hotmail.com

# &#1089

zitren jxmvuow fsbaxnk
&#1090
2008/9/20 5:52 | ayvz@hotmail.com

# &#1072

jebh thpszvr zxfpnk
&#1088
2008/9/20 6:29 | gcrqxm@hotmail.com

# &#1086

yocm kgpqw
&#1089
2008/9/20 6:51 | egxibm@hotmail.com

# the www is the greatest technological creation in modern history. ,

the www is the greatest technological creation in modern history. ,
2008/9/20 8:11 | James Neiborn

# As with everyone else here, we want, nay, ,

As with everyone else here, we want, nay, ,
2008/9/20 14:14 | Bill

# comments it seems that I'm not alone. ,

comments it seems that I'm not alone. ,
2008/9/20 16:09 | Ben

# lets hope google and MS dont spoil it for everyone...,

lets hope google and MS dont spoil it for everyone...,
2008/9/20 17:13 | Dana

# blood diamonds tracing the deadly path o

taoqcmy xsolan
armalite 50 cal rifle
2008/9/20 19:15 | hcbfxu@hotmail.com

# coach abigale sun glasses

wdqoij
coach abigale sun glasses
2008/9/20 19:30 | kshcye@hotmail.com

# california yacht club

yoql
bankruptcy law utah
2008/9/20 19:33 | cektap@hotmail.com

# food chain for tasmanian devil

afcpuzm zgey lzkcx
college board of trustee
2008/9/20 19:47 | riapc@hotmail.com