Archive
Live Blogging – MSDN Mid-Atlantic Roadshow
Today I am in Roanoke, VA at the MSDN Mid-Atlantic Roadshow. This Microsoft event highlights Web development and .NET 3.5.
Web Development Basics – 9am
Presented by Andrew Duthie, Microsoft Technology Evangelist. Andrew presents a nice history and overview of web development, from HTML/XHTML, Classic ASP, and up to ASP.NET. It definitely confirms my opinion that I am glad I never was a Classic ASP developer!
He discussed Postback and ViewState, (my least favorite features of ASP.NET and hence my appreciation of ASP.NET MVC.) I know this is not a popular ASP.NET view point, but it makes it difficult for traditional web developers like myself to step into an ASP.NET role. One thing he mentioned was that you can disable ViewState for particular controls, for performance reasons. You would only do this if the element was for display only.
He also discussed one of my favorite features, Master Pages. I have long used this same concept in PHP development and I immediately recognized it in ASP.NET.
Note to self: learn about Membership Profiles. I’ve been developing my own because I am connecting to a non-standard data source (IBM iSeries DB2). Andrew said you can write your own custom backend but still use the built in Profile features.
DataBinding Demo: he showed a typical GridView Control bound to a SqlDataSource. “Declarative Data Binding” – there is no executable code that drives the GridView, it is all expressed in the ASPX. It is fast and easy to develop, but you still have the option to develop your own binding for more control.
Web Services: ASMX and WCF Services both supported. ASMX is simpler, and hosted on IIS, but harder to make cross platform capable. WCF is more complex to configure and can be hosted by any .NET process. ADO.NET Data Services uses WCF. WCF can be used to communicate between servers and applications. “ABC”s of WCF: Address, Binding, Contract. I think it’s time I learned about WCF…
What’s New in the .NET 3.5 Framework for Web Developers and Intro to ASP.NET MVC – 10:40am
Zhiming Xue, Architect Evangelist.
New features introduced in .NET 3.5 SP1: ADO.NET Entity Framework, ASP.NET Dynamic Data, ADO.NET Data Services, ASP.NET Routing.
ADO.NET Entity Framework
Microsoft’s 1st ORM offering for .NET. Designed for providing a UI for ORM development.
- Entity Data Modle (EDM) separates objects from their Data Structures. Objects are mapped to their physical data store via three things: Conceptual Schema Definition (CSDL), Storage Schema Definition (SSDL), and the Mapping Specification (MSL). This approach decouples the DB Schema from the Application Model. This provides flexibility and can be platform independent (requires an Entity Data Provider.)
- Entity Framework is a set of services that allow you to consume EDM from within your applications. It includes Object Services, Entity Client, EntitySQL, and Linq-to-Entities.
- Visual Studio Support is supposed to make the development seamless and simple.
DataSets are raw data store connections. Linq To SQL provides an ADO.NET connection to SqlServer. Entity Framework is going to allow ORM connections to most any database.
DEMO: Z wrote live a WPF application that consumes EDM. Create a WPF solution. Add a DLL project and add a new ADO.NET Entity Model item to the project. Select the data connection and store it in the Web.config file. The database is diagrammed in Visual Studio, complete with relationships. It also creates a Mapping Details window, which he did not demonstrate, but it looks like that is where you change the mapping. The EDMX file contains the XML definition of the SSDL and CSDL. Copy the App.Config file from the EDM project to the WPF project – this links the WPF to the correct Data Store. Add an xxxEntities model object to instantiate the connection. Very fast development, very impressive results in less than 5 minutes!
ASP.NET Dynamic Data
Data driven web application scaffolding. If you are unfamiliar, scaffolding, popularized by Ruby on Rails, provides default pages for Insert, Update, Delete, etc. DD is based on an object model with full controls, metadata, validation, etc. This is expressed in two new ASP.NET project types: Entity Data Model and Linq To SQL.
DEMO: Z added a Dynamic Data Web Application to the above demo so that he could tie in to the same EDM code he already produced. Set the connection stream in the Web.config file to connect the site to the EDM data store. Apparently DD is set up assuming Linq, so Z had to make changes to the Page Templates to use the EDM instead. He had to change LinqDataSource to EntityDataSource. Then he had to register the EDM assembly within the individual pages. (Couldn’t you do this once in Web.config?)
The default scaffolding is very nice and has all the features you would expect. I saw a Routing mechanism, but he did not really discuss how it is used. He demonstrated custom validation. It uses System.ComponentModel.DataAnnotations and implements events for validation.
Overall it looks interesting, but I’m not sure yet how it would be used in a real world setting.
ADO.NET Data Services
Formerly “Astoria”, this technology exposes data in a secure fashion over the web or network. It is a combination of patterns and libraries that enable the creation and consumption of data services for the web as “feeds”. This does not have to be a database: it can be any data source.
- Implemented as ATOM – tables = feeds, rows = entities. Includes CRUD, is RESTful, and a URI points to a resource.
- Uses common URL syntax
- Capable of exposing any object model that contains IQueryable<T>, such as Linq to SQL and EDM.
- Locked down by default and supports Operation Batching
- Supports optimistic concurrency
DEMO: Z added a ADO.NET Data Service item to the above Web project. You have to update the service code to indicate what the model is and set some rules. It was a lot of copy and paste and went by too quickly to document. At this point he basically lost me. He hard coded the port the service executed on. He generated a file using DataServiceUTIL.exe (but never executed the app that I saw) and then copied the file into the WPF solution. He added a reference in the XAML to the service and a pointer to the service in App.config. He did finally get it working, and it is interesting, but again I’m not sure how I would use it.
ASP.NET Routing
Routing maps an application URL to specific handlers. I have been using this in ASP.NET MVC for a while, and they have always said that this was not limited to MVC. His example used DynamicDataRoute() instances. At this point his time was running short, so he didn’t really go into a lot of details.
ASP.NET MVC
As we know, MVC has been in my sights for a while now, and I have been very pleased with the implementation. To be fair to Z, he was really rushing to get through this because of time. Unfortunately, I think he skipped a lot of important basics, but he did at least demo the default and the Task List projects. He really skimmed over the project types, and in the long run I think he just confused anyone who was not already familiar with MVC. Last but not least, he only mentioned that you could use Unit Testing, but did not demo it at all.
AJAX Development and Troubleshooting – 1pm
Andrew Duthie presenting. AJAX is a system of lightweight calls to the server without having to repost the entire web page. I have used AJAX extensively in ASP.NET MVC using jQuery.
ASP.NET AJAX
- Simple Development Framework
- Represented as additional libraries to ASP.NET
- Two Models:
- UpdatePanel Control (zero code implementation)
- ScriptManager Control (provides a rich framework of JavaScript libraries)
Included with .NET 3.5. AJAX Control Toolkit is a separate project available from CodePlex. The AJAX libraries work on Windows, Mac OS, and Linux in IE, Firefox, Opera, Safari, and others.
DEMO: Andrew created an AutoComplete textbox sample. Create a Web Form and add an AJAX Form to it, which automatically set up the ScriptManager. Add a reference to the AjaxControlToolkit. Now all the Extenders are available in the toolbox. Drag an AutoCompleteExtender to the page and set up a few attributes to hook into a data source. Viola! Good demo.
AJAX updates in .NET 3.5 SP1:
- Browser History – allows an Ajax page to be bookmarked for future return (including page data)
- Script Combining – batches a set of Scripts to be treated as a single download
ANNOUNCEMENT: jQuery will be included in all future versions of Visual Studio! It is to be treated as a first class citizen, complete with jQuery support. Microsoft will even have full PSS support. ASP.NET MVC will be the first ship of this feature.
AJAX Troublesooting
While it is a great tool, Visual Studio is not enough. You also need tools for CSS, DOM, and Scripting analysis.
- The IE Developer Toolbar allows you to drill down into your code and is especially good for IE 6 and IE7. IE8 has built in developer tools including JavaScript debugging, dynamic CSS changes, and more.
- Firebug is a similar tool for Firefox.
- Firebug Lite is a tool that can be run without being installed (runs as a JavaScript app.)
- httpwatch (IE and Firefox Only) – basic is free, pro costs money
- fiddler – interaction record log
Other Frameworks
Andrew then spent the rest of the session showing some cool AJAX and JavaScript components.
Microsoft Silverlight 2.0
Ashish Jaiman, ISV Architect Evangelist
Silverlight is a cross browser, cross platform .NET plugin for delivering Rich Experiences in a browser. Silverlight runs in the browser sandbox and executes .NET code. Can be hosted in any container element in HTML. HTML can be overlaid on top of Silverlight elements, and you can have many Silverlight components on a single page.
Silverlight 1.0 was only HTML and JavaScript. Silverlight 2.0, on the other hand, includes a mini CLR, WPF controls, LINQ, collections, media, layout controls, and more. Silverlight 2.0 has local storage, FileOpen capabilities, sockets, and cross domain HTTP requests.
Silverlight Pros:
- Video/Audio
- Enhanced UX to increase stickiness
- Decrease the learning curve
- High resolution imagery
- Data Visualization
- Leverage .NET Skills for cross browser/cross platform solutions
Silverlight Cons:
- Requires a browser plugin
- There is still a learning curve
- Need for designers to take full advantage
Designer and Developer Collaboration
This brings up one of the main problems with WPF and Silverlight. Microsoft’s belief is that developers should focus on developing data, communications, business rules, etc. Designers should be the ones designing our user experiences. As a one man shop, I can tell you that this isn’t going to happen, but I understand Microsoft’s point.
In order to really maximize the XAML abstraction concept, it will truly take a designer’s touch wrapped around a developer’s logic. XAML is simply a description of a user interface in XML and contains no code. A designer can then use tools like Expression Blend (2.5 for Silverlight 2.0) to design the interface, which will then export the design as XAML. Visual Studio then can read the XAML and allow the developer to add any necessary application logic. In fact, Blend and Visual Studio can be opened and used simultaneously against the same code, which is more realistic for someone in my shoes.
ASP.NET includes Silverlight support via the <asp:xaml> and <asp:media> tags, Silverlight has web-service support, and it can utilize the Membership, Profile, and Application Service integration. IIS 7.0 also includes specific support for Silverlight.
Here is a pretty cool Silverlight demo. (Go to the “Patient Journey Demonstrator”)
Styling and skinning are completely customizable, which is one of the main points of WPF technologies: however you can imagine visualizing your data or application, then you should be able to make it a reality in WPF/Silverlight.
Local Storage
“Cookies on steroids”, local storage provides 1MB of application specific local information. Can be expanded if the user allows it. Exposed through Microsoft Isolated Storage.
DOM Integration
Silverlight is still a browser application, so it can interact with and create HTML elements and scripts through .NET code.
Open File Dialog
You can use this to open a local file on the client.
LINQ
Silverlight 2.0 has LINQ support as part of its CLR. Currently only on IEnumerable<T>, but XLINQ and DLINQ are in development.
Data Acquisition
Silverlight supports the following Methods:
- GET, POST,
- Headers
- Background threads
- Streaming
- Cross domain access (ClientAccess.xml, a subset of CrossDomain.xml)
- WebClient and HttpWebRequest/Response
The session ended when the instructor’s computer went belly up.
Authorize.Net Code Release
Back in February I posted the beginnings of a project to wrap Authorize.Net credit card transactions in C# .NET code. I have been working on this project off and on, in conjunction with a new website we are developing, and have been meaning to post the production version for some time.
Today, I am publishing the current version of the code, DevelopingForDotNet.AuthorizeNet, along with a few supporting updates. I’d like to thank everyone who posted comments on that entry and the First Foray into Unit Testing entry. Most of those suggestions made it into the final version and I learned a lot about Unit Testing along the way.
This version is slightly different than the original post. Here are the major differences:
Validity Checking
This version incorporates validity checking on the following TransactionRequest class properties:
- Zip
- SecurityCode
- CardNumber
- ExpDate
EMail, CardNumber, and ExpDate validation have been completely rewritten.
ExpDate now accepts the following formats:
- MMYY
- MM/YY
- MM-YY
- MMYYYY
- MM/YYYY
- MM-YYYY
The Validity Checking uses a set of Regular Expression patterns that I have put into another namespace, DevelopingForDotNet.RegexSupport. It will be available on the Free Code page as well.
Right now, all the failures throw an ArgumentException, which is very heavy handed but I haven’t had a need to improve it yet.
INotifyPropertyChanged
Each of the three classes implements INotifyPropertyChanged so you can use them for data binding if you wish. If you have never implemented this interface before, it is very easy. Add a reference to System.ComponentModel to your code. Then add the inheritance statement to your class:
public class TransactionRequestInfo : INotifyPropertyChanged { ... }
Then implement the PropertyChangedEventHandler and add a method to fire the event:
public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
Then call the method whenever a property changes:
public string FirstName { get { return _first; } set { _first = value; OnPropertyChanged("FirstName"); } }
Easy as can be!
Transaction.ProcessPayment
Transaction is a static class with ProcessPayment as its single static method. In reviewing the project, I realized that this was a perfect case for an Extension Method, so I added this before the first keyword, and now calling the method is even nicer than before:
// Account is built above... TransactionResponseInfo pmtResponse = pmtInfo.ProcessPayment(Account);
Unit Testing
I really got my feet wet with Unit Testing on this project. I followed the advice I got from FreekShow and implemented the testing of Exceptions in a much cleaner fashion. The whole experience got me thinking about why Unit Testing is so beneficial, and as I began rewriting the code I started by writing tests that fail first and then coding my way into success. Just for grins, the testing project for this solution is included in the download.
Extensions update and new Namespace added to Free Code
In support of the Authorize.Net project, I have updated the Free Code page:
- DevelopingForDotNet.Extensions – updated with many new Extension Methods.
- DevelopingForDotNet.RegexSupport – contains a list of useful Regular Expression Patterns.
ASP.NET MVC 5 Update
Yesterday I wrote about updating to ASP.NET MVC Preview 5. Today I tested the changes I made and they failed, so I obviously had a little more work to do.
First, I had to update the Web.config file in several places (just like I did going from Preview 2 to Preview 3.) The only way I could get this to work was to create a brand new Preview 5 web page project and copy the afflicted lines from the new Web.config to the old one. I also went ahead and updated the namespaces, httpModules, and httpHandlers sections.
Then, with the site actually running again, I tried a full blown walk through and discovered a problem. Since System.Web.Mvc.BindingHelperExtensions was replaced with a call to UpdateModel(model, Request.Form.AllKeys), an error occurred. Specifically, a NullReferenceException was thrown because “AllKeys” contained form elements that are not properties in the model object. My gut reaction was to simply add them to my class, but that just didn’t seem right: the model should be unaffected the presentation.
So, at least as a temporary solution, I created a custom List<string> of Keys. I used Reflection to get a list of Property names, and if those names are in Requst.Form.AllKeys then I add it to my list:
typeof(TransactionRequestInfo).GetProperties().ToList().ForEach(p => { if (Request.Form.AllKeys.Contains(p.Name)) { keys.Add(p.Name); } }); UpdateModel(pmtInfo, keys.ToArray());
{NOTE: TransactionRequestInfo and pmtInfo are from the Authorize.Net project, which I still need to update on the site.}
After I got it working, I realized that this is actually a query, so I could use Linq instead:
var keys = from p in typeof(TransactionRequestInfo).GetProperties() where Request.Form.AllKeys.Contains(p.Name) select p.Name; UpdateModel(pmtInfo, keys.ToArray());
This shortened the code, got rid of a Lambda Expression, and prevented the need to cast the Properties[] to a List<PropertyInfo> object.
I should probably add logic to make sure only Public properties are selected. Since I may end up using this in more than one place, I will probably want to make it an Extension method of Request.Form.
One more problem
After updating my assembly references in Web.config and reloading the site, I received an error because it could no longer find the referenced assembly. I checked in my bin folder and sure enough the assemblies were not there. Compiling the solution did not replace them as it had before, so I copied them into bin from the C:\Program Files\Microsoft ASP.NET\ASP.NET MVC CodePlex Preview 5 directory and reloaded the site. Once again, all is working properly.
Updating to ASP.NET MVC Preview 5
Well, I once again fell off the wagon when it comes to updating this site. I’ve been so busy working on my new ASP.NET MVC project that I even missed the Preview 4 update. That would be bad enough, until I recently found out that Preview 5 is now out. What a slacker I am!
So I spent the last little bit updating my Preview 3 projects to Preview 5. I don’t know how much of this was Preview 4 specific since I skipped it entirely. Here is what I did:
- Uninstall Preview 3 from my PC.
- Close all Visual Studio instances.
- Install Preview 5.
- Open my MVC projects.
- Remove previous references to System.Web.Abstractions, System.Web.Mvc, and System.Web.Routing.
- Add these references back, pointing now to the new install path.
- Add a reference to Microsoft.Web.Mvc, found in the same location.
Breaking Changes
I had used System.Web.Mvc.BindingHelperExtensions in several locations, but this functionality has been moved to the Controller class. To correct it, simply replace the calls to BindingHelperExtensions.UpdateFrom(model, Request.Form) with UpdateModel(model, Request.Form.AllKeys).
That was all I had to do to get it up and running. Now I need to uninstall Preview 3 from the server, install Preview 5, and reload my sites.