Wednesday, June 11, 2014

The ASP.Net MVC 5 Application Lifecylce

from: http://www.asp.net/mvc/tutorials/mvc-5/lifecycle-of-an-aspnet-mvc-5-application

Highlevel Overview:

image

Detail – Execution pipeline:

image

HTTPApplication Processing Pipeline

image

HttpApplication Processing Pipeline – Process of request (MvcHandler executes the controller action)

image

image

Authentication:

image

image

Authorization:

image

Sunday, June 01, 2014

Please do not implement a finalizer willy-nilly!

I see many people implement the finalizer when they implement the dispose pattern in c#.

class MyDisposableClass : IDisposable
{
   public void Dispose()
   {
      Dispose(true);
      GC.SuppressFinalize(this);          
   }

   protected virtual void Dispose()
   {
   }

   ~MyDisposableClass()
   {
      Dispose();
   }
}

Please don’t do this (implement the finalizer)  unless your class uses unmanaged resources! One reason for this is that if you access managed resources in your Dispose method, they may have already been garbage collected if the Dispose method was called via the finalizer!

Here are some things to consider: (all pulled from MSDN documentation)

  1. The dispose pattern is used only for objects that access unmanaged resources, such as file and pipe handles, registry handles, wait handles, or pointers to blocks of unmanaged memory. This is because the garbage collector is very efficient at reclaiming unused managed objects, but it is unable to reclaim unmanaged objects. (http://msdn.microsoft.com/en-us/library/fs2xkftw(v=vs.110).aspx)
  2. Finalizers are notoriously difficult to implement correctly, primarily because you cannot make certain (normally valid) assumptions about the state of the system during their execution. (http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx)
  3. If a type does override the Finalize method, the garbage collector adds an entry for each instance of the type to an internal structure called the finalization queue. The finalization queue contains entries for all the objects in the managed heap whose finalization code must run before the garbage collector can reclaim their memory. The garbage collector then calls the Finalize method automatically…. (http://msdn.microsoft.com/en-us/library/system.object.finalize(v=vs.110).aspx)

Remember: Finalizers are typically not needed and even when needed there are better patterns available that allow you to side-step implementing the finalizer (eg: SafeHandle).

Note:

  1. Even if you implement the Finalizer “correctly” such that when you call Dispose, it only cleans out unmanaged resources, if you don’t have unmanaged resources, you have introduced a tiny performance penalty into your app and allow someone else to introduce bugs. So if you see a finalizer, check to see if you REALLY need it and if you don’t, get rid of it (and maybe even the implementation of the IDisposable interface.
  2. Sometimes the Dispose pattern is implemented to free up managed memory being used by the class. Again if you have written your code well, you should be able to rely on the .Net garbage collector to free up the memory for you.

Correctly implemented Dispose pattern

class CorrectlyImplementedDisposableClass: IDisposable
{
   bool disposed = false;

   public void Dispose()
   { 
      Dispose(true);
      GC.SuppressFinalize(this);           
   }

   protected virtual void Dispose(bool disposing)
   {
      if (disposed)
         return; 

      if (disposing) {
         // Free any other managed objects here.  }

      // Only Free unmanaged objects here.  disposed = true;
   }
}
 
class CorrectlyImplementedFinalizedClass: CorrectlyImplementedDisposableClass
{
   ~CorrectlyImplementedDisposableClass()
   {
      Dispose(false);
   }
}

Thursday, March 13, 2014

SPNs required when using Kerberos auth for Windows Auth on an Asp.net website

To use Kerberos authentication

  • Internet Explorer security settings must be configured to enable Integrated Windows authentication. To enable the browser to respond to a negotiate challenge and perform Kerberos authentication, select the Enable Integrated Windows Authentication check box in the Security section of the Advanced tab of the Internet Options menu, and then restart the browser.

image

  • If a custom service account is used to run the ASP.NET application, then a Service Principal Name (SPN) must be registered for the account in Active Directory.

To register an SPN, use the Setspn.exe utility by running the following commands from a command prompt:

setspn -A HTTP/webservername domain\customAccountName

setspn -A HTTP/webservername.fullyqualifieddomainname domain\customAccountName

Thursday, February 13, 2014

Disabling ChromeDriver logging output

I was trying to figure out how to turn of the logging that the Selenium ChromeDriver was performing and had a hard time doing that.

Chrome Driver Logging Output

I finally figured out how to do it with the following code (the key line of code is highlighted):

		private IWebDriver CreateChromeDriver()
		{
			ChromeOptions chromeOptions = new ChromeOptions();
			chromeOptions.AddArgument("--log-level=3");
			return new ChromeDriver(chromeOptions);
		}
 

Saturday, December 21, 2013

Installing Amazon App-Store on Google Nexus 7

I wanted to use the Amazon app-store on my Google Nexus 7 tablet (mainly because I already have quite a few apps that I have bought for a previous Kindle Fire). So here is how to get the amazon app store on your Nexus device.

First, you need to enable installing of apps from stores other than the Google Play Store. To do this, go to Settings and  select Security. Under Device Administration, make sure “Unknown Sources” is selected.

Second, install the Amazon App Store. To do this, down the “apk” file from Amazon from: http://www.amazon.com/gp/mas/get-appstore/android/ (There is additional information on Amazon’s page).

Thursday, December 12, 2013

CRM 2011–MSCRMKeyGenerator– Key not being regenerated correctly

Recently in a dev environment, when I tried to bring up our CRM environment, I was getting the following error:

image

Not very helpful. But if I look at the URL:

http://xxxxx/orgname/_common/error/errorhandler.aspx?BackUri=&ErrorCode=0x8004A106&Parm0=CrmKey%28Id%3aaa{GUID}%2c%20ScaleGroupId%3a00000000-0000-0000-0000-000000000000%2c%20KeyType%3aCrmWRPCTokenKey%2c%20Expired%3aTrue……

So there is certainly something weird going on here.

Looking at the application logs in the event viewer I found the following error:

Current key (KeyType : CrmWRPCTokenKey) is expired.  This can indicate that a key is not being regenerated correctly.  Current Key : CrmKey(Id:GUID, ScaleGroupId:00000000-0000-0000-0000-000000000000, KeyType:CrmWRPCTokenKey, Expired:True, ValidOn:11/03/2013 17:47:19, ExpiresOn:12/06/2013 17:47:19, CreatedOn:11/03/2013 17:47:19, CreatedBy:NT AUTHORITY\NETWORK SERVICE.

After some googling, I found that the reason for this was that the “Microsoft Dynamics CRM Asynchronous Processing Service” may not be running. Which indeed was true in my case. But, after restarting the service, it still was not working.

The final thing that I had to do was issue an iisreset against the server hosting CRM.

Tuesday, December 10, 2013

Custom Rules in Fiddler

I needed to setup a filter in Fiddler so that I could view only JSON requests being made from my application. The default filter doesn’t allow for viewing only JSON requests. But luckily Fidller allows you to setup custom rules. Here is what I did:

Within the class “Handlers” add the following lines of code:

public static RulesOption("Display Only &Json Requests")
var m_bShowOnlyJsonRequests: boolean = false;

The above lines will add a Menu option under rules, that will easily allow you to turn on or off the JSON filtering.

image

Next, within the method: static function OnBeforeRequest(oSession: Session), add the following lines of code:

if (m_bShowOnlyJsonRequests && oSession.oRequest["Content-Type"] != "application/json"){
                oSession["ui-hide"] = "true";
          }

The above lines of code allow filters to display only those sessions that have a content-type header set to “application/json”.

As simple as that!

Notes:

1. The biggest problem that I have found is that there is hardly any documentation regarding the methods and properties available within the script file or off the oSession object (which is of type Session).

2. I think the script is based of JScript. I just wrote my code to resemble C# and it worked for my simple filter.

3. Samples from FiddlerBook site: http://fiddlerbook.com/Fiddler/dev/ScriptSamples.asp

4. Fiddler Script Editor is a pretty good tool that can help writing complex rules (it provides some documentation, though it wasn’t always helpful). http://fiddler2.com/fiddlerscript-editor

5. More Samples: http://fiddler2.com/documentation/KnowledgeBase/FiddlerScript/ModifyRequestOrResponse

6. Session object properties/flags: http://fiddler2.com/documentation/KnowledgeBase/SessionFlags

Tuesday, October 15, 2013

MSBUILD : error MSB1005: Specify a property and its value.

I was getting the following error from MS-Build:

MSBUILD : error MSB1005: Specify a property and its value.
Switch: /p:Deploy=true;DeployToEnvironment=es1ci;Configuration=Debug;UsingNUnit=true;

The problem turned out to be the last “;”. Apparently MsBuild doesn’t like it!. Took it out and MsBuild was able to run!

Thursday, October 10, 2013

Work Ethic–17 things you should never say to your boss

I came across this article on LinkedIn recently and found it interesting as, in a way, it kind of tells you what someone with good work ethics would not do or say at work. (its based on answers given by bosses at some new technology companies). I wish more people would read this.

Read it at: http://www.linkedin.com/today/post/article/20130923134035-15077789-17-things-you-should-never-say-to-your-boss

17 Things You Should Never Say to Your Boss

1. 'I Am Just Here for the Money'

In China, it is very common for a lot of employees to work just for the money. This means they will leave if you fail to give them a raise or if their peers start to make a lot more money than they do. Our interview process has filtered this as much as possible but if we hear through the "grapevine" that the person is just doing the job for the money we will let them go very quickly.

- Derek Capo, CEO and Founder, Next Step China

2. 'You Never Told Me to Do It'

When something important doesn't get done, the worst thing you can say is, "You never asked me to do it." There are few better ways to neglect yourself of that promotion, a raise, or even job security.

- Ken Cauley, President, Advanced Media

3. 'There's Something Wrong'

It's easy to complain about what's wrong. It's hard to come up with solutions to fix the problem. My former manager at LivingSocial said, "Be a problem solver, not spotter," and I've taken this advice to heart in my everyday life. If you see a problem, don't address the situation with what's wrong; address the situation with an answer. If you don't have a real solution, wait until you do.

- Sarah Ware, Markerly

4. 'I Want to Do What's Easiest'

We have a client who had an employee literally explain that he would rather do a particularly menial task than the task that the employer had assigned because it would be easier for him. We were shocked. This is the most explicit way to alert your boss that you don't care about improving your skill set without directly telling him. Never do this if you care about your career!

- Patrick Conley, Founder / CEO, Automation Heroes

5. 'That Takes Up Too Much Time'

Through the years, we have had many operational restructurings that have required large amounts of data to be filtered and edited or re-formatted in some manner. There's nothing worse than an employee who complains about the amount of time required to move the company to the next level.

- Laura Land, CFO / COO, Accessory Export, LLC

6. 'I Could Be Doing Other Things'

Bratty much? Don't complain about your job. If you hate it, quit. If there's something wrong with it, find a way to fix it. If someone or something is really ticking you off, don't project your anger onto others, especially not your boss. If it's a good job, be grateful for it. If you want more out of your job, make it happen. Be diplomatic about it and make it your dream job, or leave.

- Danny Wong, Co-founder, Blank Label

7. 'I Promise to Do That'

Don't ever tell your boss you're able to do something if you know you may not be able to deliver. It is better to be honest, ask for advice and have a proactive attitude. If you fail to deliver, then it has negative repercussions for the business, which is taken much more seriously.

- Christopher Pruijsen, Co-Founder / Partnerships, Afrostart.io

8. 'It's Too Difficult'

I get fired up when someone is paralyzed and doesn’t complete a task because it’s difficult or because few others have done it. We’re a disruptive company that has to innovate, that has to do things few have done before us. One of my advisors here has a quote: “If it were easy, everyone would be doing it.” We won’t win if we don’t think big.

- Marcos Cordero, Chief Gradsaver, GradSave, LLC

9. 'I Agree to Disagree'

Whether it is said explicitly or passive-aggressively, this mindset has no place in startup culture. Those who have this mindset should either found their own startups or go work in big corporate America where this goes unnoticed. At a startup, you're either all the way in or all the way out.

- Danny Boice, Co-Founder & CTO, Speek

10. 'I Don't Have an Opinion'

The people who just sit and nod their heads are the ones who are expendable. If you want to make an impression as a valuable member of the team, offer your insights. No one ever agrees with his boss 100 percent all the time, so make your opinion known if you have something worth saying.

- Nick Friedman, President, College Hunks Hauling Junk and College Hunks Moving

11. 'I Can't'

I don’t want to hear excuses ever! We focus on hiring can-do, positive, creative employees with passion, drive and determination.

- Kuba Jewgieniew, Founder and CEO, Realty ONE Group

12. 'I'm Not Optimistic'

The most important thing for any team member is to stay optimistic. Being a pessimist and doubting the future of the company is a real downer. There is nothing wrong with being realistic; however, people who are melancholy suck the life out of an early-stage company and cannot last long.

- Raoul Davis, CEO, Ascendant Group

13. 'I'm Clocked Out'

There is nothing more discouraging to an entrepreneur than when an employee says he is not willing to go the extra mile because he isn't "clocked in." We remind our employees that they work for a young company and they are in control of their own careers. Acting within the status quo never gets you to the top!

- Darren Solomon, President, Kid Ventures

14. 'That's Not My Responsibility'

It’s critical that everyone feels invested in the success of all areas of the business. Everyone should be willing to pitch in, even if what’s required isn’t part of their normal day-to-day activities.

- Robert J. Moore, Co-Founder and CEO, RJMetrics

15. 'That's Not My Job'

Your responsibilities aren't limited to what was listed in your original job description -- especially at a startup. Unless your boss is asking you to do something illegal or unethical, you should do it.

- Mary Ellen Slayter, Founder/Managing Director, Reputation Capital

16. 'I Don't Like Working for Other People'

An employee actually told me that he didn't like working for other people. That person doesn't work for me anymore!

- Andrew Angus, CEO, Switch Video

17. 'I'm Not Working Hard'

I never want to know that someone who works for me isn’t working hard. People can disagree with me, and I’m fine to hear criticism. I’ll never lose respect for anyone because he disagrees with me or because they failed. I don’t want to know if someone is giving less than their best effort or that someone lied. I have high expectations of people when it comes to their work ethic.

- Dries Buytaert, Co-founder and CTO, Drupal

Monday, September 16, 2013

CRM 2011–Plugin Registration Error: Assembly must be registered in isolation

While registering a CRM 2011 plugin I kept getting the following error in only one of our test environments.

Assembly must be registered in isolation

After a lot of searching I found out that the reason I was getting this error in only one environment was that I was not designated as a “Deployment Administrator”. Once I had that fixed, the error went away!

Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Action failed for assembly xxxxxxxxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=yyyyyyy': Assembly must be registered in isolation.