Friday, December 28, 2012

YouTube Data API (V3) Javascript Client Example problem


Everyone knows the YouTube Data API (V3) is still experimental.  But still, i'm sure most developers are excited to try new stuff from Google.

I was eager to build an ASP.NET MVC site that would be able to upload videos to YouTube.

I tried playing around with the YouTube .NET Client API hoping it would simplify things but then I realized this was a no browser implementation and the user had to manually enter an authorization key.  Ok this is not what I need.

I tried out the YouTube Javascript Client API and followed the instructions on the Samples page and it looked pretty neat and straightforward.  Then when i tried to run the application, it didn't work! (of course, it's experimental).  

First, let me show you the code from Google:

//Retrieve the uploads playlist id.
function requestUserUploadsPlaylistId() {
    // https://developers.google.com/youtube/v3/docs/channels/list
    var request = gapi.client.youtube.channels.list({
        // mine: '' indicates that we want to retrieve the channel for the authenticated user.
        mine: '',
        part: 'contentDetails'
    });
    request.execute(function (response) {
        playlistId = response.result.items[0].relatedPlaylists.uploads;
        requestVideoPlaylist(playlistId);
    });
}

There were 2 errors i got:

1.  TypeError: response.result is undefined

When i looked at the JSON response from Google, here's what I saw:

[
 {
  "error": {
   "code": 400,
   "message": "Invalid boolean value: ''.",
   "data": [
    {
     "domain": "global",
     "reason": "invalid",
     "message": "Invalid boolean value: ''."
    }
   ]
  },
  "id": "gapiRpc"
 }
]


Then i looked at the line of code making the request:
var request = gapi.client.youtube.channels.list({
        // mine: '' indicates that we want to retrieve the channel for the authenticated user
        mine: '',
        part: 'contentDetails'
    });
And I just changed mine: '' to mine: true which went through.  But there was 
another error.

2.  TypeError: response.result is undefined (same error actually)
But happens on this line:
Looking at the response, I saw this:
[
 {
  "error": {
   "code": -32602,
   "message": "No filter selected.",
   "data": [
    {
     "domain": "youtube.parameter",
     "reason": "missingRequiredParameter",
     "message": "No filter selected.",
     "locationType": "parameter",
     "location": ""
    }
   ]
  },
  "id": "gapiRpc"
 }
]
The solution is to change this:

playlistId = response.result.items[0].contentDetails.uploads;

to

playlistId = response.result.items[0].contentDetails.relatedPlaylists.uploads;

And i'm glad i was able to retrieve my uploaded videos!!!

Thursday, December 27, 2012

IIS - Cannot read configuration file due to insufficient permissions

Did you ever try to create a new website in IIS, run it and get this error?


The requested page cannot be accessed because the related configuration data for the page is invalid.

Easy fix!

  • Go to IIS, right click on your website and choose Edit Permissions. 
  • Click on the Security tab.  
  • Click on the Edit button.  
  • Click on the Add button.  
  • On the Enter the object names to Select, Type "Everybody" (without the quotes)
  • Click all the OK buttons.

Had to list this down because i keep forgetting!

Tuesday, December 11, 2012

Combining ASP.NET Webforms and MVC into one solution


If you've been wanting a Hybrid ASP.NET Application with both Webforms and MVC in it, then you've come to the right place.  You may have an existing Webforms site and need to migrate to MVC but you don't know where to begin.  There are different approaches to do this.  Of course creating an MVC web application from scratch is the cleanest and easiest to maintain.  However you might need to deploy 2 websites in parallel to do this transition.  If you are not able to deploy 2 websites in parallel then an option is to add MVC code into your Webforms project .  This will definitely work.  The only thing is that you lose some nice MVC development features like Scaffolding. But if you're ok with creating these MVC files manually then it won't be an issue.  Thanks to Scott Hanselman's Blog for most of the information.  I am using Visual Studio 2012 for this test.

1.  First, add these references to your Webforms project:
a.     System.Web.MVC
b.     System.Web.Razor


2.  Add this in appSettings to your web.config

<appSettings>
   <add key="ClientValidationEnabled" value="true"/>
   <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>



3.  Add these under compilation to your web.config

<   <compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>


4.  Add these namespaces in pages to your web.config

<system.web>
  <pages>
     <namespaces>
       <add namespace="System.Web.Helpers" />
       <add namespace="System.Web.Mvc" />
       <add namespace="System.Web.Mvc.Ajax" />
       <add namespace="System.Web.Mvc.Html" />
       <add namespace="System.Web.Routing" />
       <add namespace="System.Web.WebPages"/>
     </namespaces>
   </pages>
</system.web>



5.  Add this to your web.config. This is under the <configuration> node
<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>



6.  Add this to your Global.asax

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
        filters.Add(new HandleErrorAttribute());
}

public static void RegisterRoutes(RouteCollection routes)
 {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

 }

protected void Application_Start()
{
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
}


7.  If you want the default Webforms page to load first, add this line before the other routes.  Or else the MVC default page will render first.

            routes.MapPageRoute("MyWebFormDefault", "", "~/Default.aspx");
        

     8.  Make sure you add these to your Global.asax

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

Copy some MVC files into your Webforms project.  In my case, I copied the Controllers, Models, and Views folders.  For simple testing purposes, I removed files related to AccountController and its views.  I only left the HomeController and its views plus the Shared views.

Thats it!  If you run your application, you should see the default.aspx on the browser.  If you type in a friendly URL such as http://localhost:8023/Home you should see the MVC Home page.


Saturday, January 7, 2012

Configuring an ASP.NET 4.0 Web Application

We often wonder why configuring ASP.NET web applications sometimes is a pain.  It's actually not, we just forget to do a little tweaks which is why I am writing this post:  so that I don't forget next time!

Ok. So here's the situation, I had to reinstall my Windows 7 Ultimate on my 64-bit machine.  All my web application code was in that box so that meant i had to configure my development environment from scratch!  So I Installed SQL Server 2008 R2 before Visual Studio 2010 Ultimate.  Yes, that is correct, SQL Server first. I've had experiences when installing VS first would install its own SQL Server Express edition, then installing SQL Server 2008 R2 would use that SQL Server Express instance.  I could have missed something during the installation but I always find that installing SQL Server before VS is nuch smoother.

So now i installed IIS 7.5 by going to Control Panel -> Programs -> Turn Windows Feature On or Off and check Internet Information Services.  Remember to check the sub features under these if you need any of them.  I had to check ASP.NET (of course!) under Application Development Features and URL Authorization under Security.

Then I add a Web Application in IIS.  You could add a Web Site with a different port number (such as 8080, 8081, etc) or you could just add  a Web Application under the Default Web Site which is port 80 by default.  Then you add a new Application Pool because the default application pool uses .NET 2.0.  So make sure your new Application Pool (which you can call anything you want) must be using .NET 4.0.  Also make sure that you go to Advanced Settings and select the correct Application Pool Identity.  In my case, I chose Network Service because that's the same account that is accessing my SQL Server database.

After all this, you might find that your pages still won't run.  Here are some of the errors that you might see:
  
HTTP Error 500.19 - Internal Server Error with Error Code: 0x80070021 
The requested page cannot be accessed because the related configuration data for the page is invalid.
Config Error: This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false". 

 To get around this error, you will have to open this file

 Windows\System32\inetsrv\config\applicationHost.config

Change both these entries from Deny to Allow:

<section name="handlers" overrideModeDefault="Allow" />
<section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />

HTTP Error 404.3 - Not Found

The page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map.
 

HTTP Error 500.21 - Internal Server Error
Handler "PageHandlerFactory-Integrated" has a bad module "ManagedPipelineHandler" in its module list

These errors appear because possibly you have not installed ASP.NET and registered it with IIS.  So you should follow these steps.

If you have not installed the ASP.NET feature, add it through the Control Panel -> Programs -> Turn Windows Feature On or Off and check Internet Information Services I mentioned above.

Then register ASP.NET with IIS by doing the following.

Go to c:\Windows\Microsoft.NET\Framework\v4.0.30319 and run aspnet_regiis.exe -i

If you have a 64-bit machine, go to the c:\Windows\Microsoft.NET\Framework64\v4.0.30319 folder instead.

An error has occurred: 0x8007b799
You must have administrative rights on this machine in order to run this tool.
 


Turning off the UAC fixes this issue.

Start > Control Panel > System and Security > Action Center > Choose Your UAC Level - Set this to Never Notify (Requires a restart);

After doing all these little tweaks, my web application was running fine!

Good luck!

Tuesday, March 1, 2011

MVC Errors when first loading the page

You may run into permission problems when you create an MVC project and view the page for the first time.

Here are some errors you may get:


Cannot read configuration file due to insufficient permissions 

The solution to this is to make sure that the Application Pool is running under an account with permissions to your web root folder. Open Windows Explorer, right click on the directory where your web files are located.  Right-click and choose Properties.  Click on the Security tab and click Edit.  Add the Network Service user and give it Read access.

Open IIS.  Double click on Application Pools.  Select the Application Pool your website is using.  Right click on it and choose Advanced Settings.  Under Process Model change the Identity to Network Service.

You do not have permission to view this directory or page because of the access control list (ACL) configuration or encryption settings for this resource on the Web server.

The solution to this is to add the user IUSR to your web root folder and give it Read access.  Same procedure as the first step above.