I have setup a new blog so this blog will not be supported any further in a couple of weeks. I transferred all my blogs to the new one so you can see them there also.
My new blog is http://www.locktar.nl
Don’t forget to change your subscription URL to http://www.locktar.nl/rss
See you soon on the other side and tell me what you think about it!
TFS 2012 Update 2 is released last week. I’m working in a large company with a lot of TFS 2010 build servers. With Update 2, TFS 2012 supports the build server of TFS 2010. This is a huge advantage because now we don’t have to upgrade all the build server at the same moment.
When I was testing my TFS 2010 build server (a clone of the production) the build server wasn’t working. I got the message “The device is not ready”.
I checked the ALM blogs about the new feature from Update 2 and saw that the build server needed Service Pack 1. I downloaded, installed it and after 15 minutes everything was done. I rebooted and installed 3 critical updates for SP1. I rebooted again and tested my build again. It was still not working. The strange error with no information about it was still there.
I checked all the settings of the build server and everything seemed to be right. I unregistered the build server from my collection and deleted the controller and agent. After registering the build server to the collection, I created a new controller and agent with the same settings as before. I tested the Build definition again and everything was working right this time!
What really was the problem is not clear but it could be the case that registering tot TFS 2012 without SP 1 for the TFS 2010 build server could be the problem or the controller and agent should alway be recreated.
We also tested a newly created TFS 2010 SP1 Build server connecting to TFS 2012 and then everything was working the first time we tried.
This post will be in Dutch because I based this on a discussion with someone else.
Vandaag gaf ik al weer voor de vierde keer les op de Hogeschool van Rotterdam. Daar geef ik les aan een groep studenten in het vak Microsoft ASP .NET MVC 4 met alle standaard tools als Entity Framework en Web API er om heen.
Bob Joziasse sprak ik vandaag over een multiple select in een listbox voor zijn laatste blog Eggplication die in het leuke paas thema is geschreven. Ik ben er even ingedoken aangezien ik zelf de listbox in HTML nooit gebruik. Op zich is het een standaard control en het is al snel duidelijk voor een gebruiker wat hij er mee kan doen. Ik zelf gebruik hem nooit omdat de styling van het control niet voor elke browser gelijk is. Maarja, terug naar het onderwerp.
In zijn blog heeft Bob een kleine applicatie gemaakt om aan het te geven hoe een meer op meer relatie werkt door middel van Code First in het wel bekende Entity Framework. In de applicatie kan je een ei maken en die verschillende templates geven voor het beschilderen. Ik heb de applicatie hetzelfde genoemd maar de properties van de objecten een beetje mijn eigen gang laten gaan. Zo heb ik ook een meer op meer relatie en kan ik dus templates koppelen aan een ei en eieren koppelen aan (schilder)templates.
De objecten zien er als volgt uit:
Simpele ViewModel voor de Create van de Egg:
De database wordt dan als volgt gegenereerd:
De controller met de Create Get en Post functies zien er dan als volgt uit:
Om dit werkend te krijgen hebben we natuurlijk ook een View nodig. Dit ziet er bij mij zo uit:
Als we dit draaien ziet dat er als volt uit:
Om vervolgens dit weer te kunnen bekijken heb ik het als volgt gemaakt:
Wat resulteert in onderstaande om het ei met de gekozen templates te kunnen weergeven:
Een simpele applicatie maar wel handig om snel een meer op meer relatie te maken met een listbox.
When you write a blog in Microsoft Office Word 2013, the option to add a video isn’t their by default. You can add the video support on the following way:
- Go to the insert Ribbon tab
- Right click on an empty area and select “Customize the Ribbon”
Add a new Group to the insert Ribbon tab and call it Video
Choose “All Command”
Search for “Online Video” and click the “Add” button in the middle so it will added to the Video group.
Click OK and your done. The result will look like this
Now you can add Videos from other sites in your blog post
In our company, we are upgrading from TFS 2010 to TFS 2012. So to test everything we have a clone of the TFS server.
To test the clone I had to switch my connection to the different servers. After hitting the “Connect” button I got a “Value cannot be null.” exception. It said that also that: “Parameter name: baseUri” was the problem. After contacting a colleague of me, he said to delete the cache of the TFS server on my computer. After doing that, the connection worked as it suppose to work.
You can find the cache in the following folder: C:\Users\<yourusername>\Local Settings\Application Data\Microsoft\Team Foundation\2.0\Cache
The WordPress.com stats helper monkeys prepared a 2012 annual report for this blog.
Here’s an excerpt:
600 people reached the top of Mt. Everest in 2012. This blog got about 8,700 views in 2012. If every person who reached the top of Mt. Everest viewed this blog, it would have taken 15 years to get that many views.
Last week I was working on a bug for my website SeeTings. The bug was the validation of a DateTime not working in Firefox and Chrome. In Internet Explorer (even version 9) was working correct.
After hours searching and hundreds of form posts further, I finally found the solution. I thought the problem was in implementing the jQuery UI Date picker with the Dutch Format of a date (dd-MM-yyyy) in it but that wasn’t true.
The problem was the client validation of the jQuery Validation plugin. ASP .NET MVC 3 and 4 are shipped with an installed version of jQuery. And the internet template (the one that I was using) creates a login and register process.
To test the bug, I created a new project and added a DateTime field called Birthday to the register login form. I deleted all other fields except the UserName field because then I could test if the Required validation still worked if I might fined a solution for the validation problem.
After long searching, I saw this post http://stackoverflow.com/a/511670 on Stackoverflow. There was another script file called “additional-methods.js” that I didn’t heard of. After long searching, I found the official website of jQuery validation http://bassistance.de/jquery-plugins/jquery-plugin-validation/ and saw the CDN of all the jQuery instances.
It seemed not necessary to link the additional-methods.js file because that would only add extra validation like credit card or url TLD and email TLD etc. checking. I found out that jQuery validation had multiple localization files. One for the messages and one for one other thing and that was my problem, the date validation.
When you go to the CDN of Microsoft, you will see in version 1.6 (current version is 1.9) a long list of localization files.
The files ending with messages_xxx.js are the error messages localized. The files ending with methods_xx.js (like for me methods_nl.js) are the localized versions of some script. In this case only the date.
After completing this above, you can after that implementing the jQuery Datepicker. Don’t forget that the Datepicker of jQuery UI also needs a localization reference file. See the last part of the documentation on this page http://jqueryui.com/demos/datepicker/. Just reference the file and everything is working.
Good luck and hopefully you guys aren’t that long busy figuring out why the validation isn’t working.
This week I was busy to give our environment more quality by adding a deployment of the newly checked in work. This was a quite more difficult then I imagined before I started. This is because the environment that we have is off course not completely the same as the standard demos of Microsoft and the documentation for this is… not available?
Team project setup
- Production (Release)
- Development (Debug)
Off course we develop in the Development branch. When the iteration is finished, we merge everything to the staging environment where we and the customer could test everything. When testing (and bug fixing if you made bugs) is done we merge everything to production. In that way we can do bug fixes directly on every version of the project.
We wanted to have a build definition for development that:
- Builded the solution;
- Deploys the multiple projects to the different locations.
I created for each branch a different build definition with different needs to get to the result. I will explain the Development because this build definition will publish multiple ASP .NET Web Applications to different IIS websites.
Creating the build definition for development
I set the trigger to go off on each check-in. In that way, the build will also publish all new versions of the web applications to the desired environments on the server(s).
Set the workspace to the workspace of your branch.
Define a drop location and which build controller you like to use of your build server. Maybe you have a dedicated build controller for particular solutions that have many check-ins.
Setup deployment to the server
The last part is the part where we setup the deployment to the server.
Define on step 1 the Configurations that you want to build. With config transformations you could setup the different build environments. See for a tutorial this following link:
Because it is a development environment, we use the default Debug config with all the links to the test database and test web services. Set the projects to build to the solution file.
Note for building only one project
When you set the projects to build to only one project, you could get an error when you are building. The error will say something about your output path that is not right.
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets (484): The OutputPath property is not set for project ‘UI.Web.Mvc.csproj’. Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration=’Debug’ Platform=’Any CPU’. You may be seeing this message because you are trying to build a project without a solution file, and have specified a non-default Configuration or Platform that doesn’t exist for this project.
This isn’t really the cause why you would get that error. When you open your project file (unload your project and right click to edit) you will see that the build platform is AnyCPU and not Any CPU. You will have to change the “Configurations to Build” in your build definition to AnyCPU. You can just type it in the dialog.
Setup deployment for only one web application
When you have only one web application, you can add the “MSBuild Arguments” in your build definition directly.
See for a large explanation for each build argument the following blog:
The arguments that you typically have to use are the following:
/p:DeployIISAppPath=”Default Web Site”
Setup deployment for multiple web applications
If you have multiple web applications in a solution (like we have), you can’t use the build arguments like above because then every application would be publishing to the same website on the same server. This will fail your build definition eventually. Maybe not the first time but it will fail sometime. For me it failed every second time I tried it.
Well stop the complaining and tell me how to fix this!
Change the build arguments that you have setup above. Only use the following build arguments:
Now unload your projects that you want to publish and edit every project file to their specific needs. Go to the PropertyGroup of your build configuration that you are using in your build definition. I use Debug so will change that PropertyGroup.
Use the same name as the build arguments and enter your values.
Note for exposing your publish username and password
When you setup your deployment, you have to enter your username and password. Otherwise you will get an error that your not authenticated.
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets (3588): Web deployment task failed.(Remote agent (URL http://servername/MSDEPLOYAGENTSERVICE) could not be contacted. Make sure the remote agent service is installed and started on the target computer.) Make sure the site name, user name, and password are correct. If the issue is not resolved, please contact your local or server administrator. Error details: Remote agent (URL http://servername/MSDEPLOYAGENTSERVICE) could not be contacted. Make sure the remote agent service is installed and started on the target computer. An unsupported response was received. The response header ‘MSDeploy.Response’ was ” but ‘v1′ was expected. The remote server returned an error: (401) Unauthorized.
For security reasons, you should not enter your username and password in your build definition. So, how to fix this?
The first thing you must do is give your TFS build service account rights to the server that your publishing to. I added it for now to the local Administrators group of my old (but still working) Windows Server 2003 server.
The second thing that you have to do depends on which way you have setup your arguments. Use the following syntax for the build arguments in your build definition:
This will indicate that the username and password that will be used for deploying is the same as your build controller on your build server.
Hopefully I gave you enough information about deploying your applications. If you have any questions, don’t hesitate to contact me.
When you deployed your project and see the zip with your project in it, you should check your connectionstring in your config. It could be the case that the connectionstring is using parameters to generate the full connectionstring. This is an option that is on by default. If it is using parameters, you will see something like “$(Replaceable Token…)”.
You can simple disable this (so it will use the connectionstring that you have set in your config transform) by adding the <AutoParameterizationWebConfigConnectionStrings>False</AutoParameterizationWebConfigConnectionStrings> tag in your project file on the same place where you placed the rest of the properties.
Why should we use caching?
The reason why we should use caching is to increase the performance for the end user and to decrease the traffic on the server. There are multiple kind of caching. In this post, I will explain the OutputCache attribute of MVC 3 (and 4).
Using the OutputCache Attribute
To cache a page or image in ASP .NET MVC 3 we only have to set the OutputCache attribute above the action.
The Duration property is the timespan you want to cache the action in seconds. So above, the page will be cached for 10 seconds. When you run the application, the page is showing the ViewBag.Time on your screen. If you hit F5 (refresh), the page is refreshed but your action isn’t. The time is still the same if you did refresh the page within the 10 seconds. When you hit F5 after 10 seconds, the new time is shown.
Use fiddler to see if the caching is working.
Caching the action for different result
When you have an action for different results, like asking for an image for a given imageId you use a parameter in your action. The OutputCache attribute will automatically use the parameter for caching the result for that specific item.
So when you ask for example image 3 and 24, the caching will work on both images.
Use fiddler to see if the caching is working.
Caching of private items
By default, the cache is saved on the server and client. But when you have private data the cache should only be used on the client (the browser). Otherwise, private data could be accessed by anyone.
We could use the location property for this.
Set the location property to Client to only store the image in the browser.
When you run the page now and see the image or page, the image or page is cached only in your browser. When you hit F5, the caching won’t work. This is because client caching will not work for browser refreshing. If you use a hyperlink to the same page or image the caching will work.
Again use fiddler to see the results.
How to disable caching of an action
To disable caching for an action, use the code as shown below.
When you have a lot of actions with the same settings, you could implement caching profiles. In this way, you only have to change the settings on one place.
In the web.config, add the following section.
You then could use the caching profile in the following way.
Asp .NET MVC 4 Release Candidate is out. One of the features that is included is called the minification and bundling feature. This was already there in the beta but in the release candidate version it has changed.
Why should we use it
How does it work
Reference the files in your page.
When you run the application and use Fiddler to view the calls to your server, you still see all the files called separately.
This is because the Bundling and Minification feature by default only work when your not in debug mode. This handy because then you could debug with all the whitespaces in your files and have the performance in the production environment.
See the difference in your production environment:
Force Bundling and Minification
You can use the BundleTable.EnableOptmizations override but the best way for a little test is to remove the debug=”true” attribute in your web.config.