Windows web service authentication in IIS Express

When you develop a SOAP web service in Visual Studio 2013 the IDE uses IIS Express for testing. To set up Windows authentication in IIS Express follow the steps below:

Create a Local Security Group on your computer

  • Right click Computer and select Manage
  • On the left side expand Local Users and Groups
  • Right click the Groups folder and select New Group
  • Create a group with the name WebserviceUsers for the users of the web service
  • Right click the Users folder and select New User
  • Create a user and add it to the WebserviceUsers security group

Add the following lines to the  <system.web> section of the Web.config file of your web service application

<authentication mode=”Windows”/>
<authorization>
<allow roles=”WebserviceUsers”/>
<deny users=”*”/>
</authorization>

Set up IIS Express for Windows authentication

  • Select the web service project in the Solution Explorer
  • In the View menu select Properties Window
  • Disable Anonymous Authentication and enable Windows Authentication
    Visual Studio IIS Express Windows Authentication Properties Window

 

In the caller application call the web service with user name and password

  • Add the following lines to your class to supply the credentials
private Webservice.Service _Webservice = new Service();

// Constructor
public Business() {
    string webserviceUrl = "Webservice_Url";
    string webserviceUserName = "Webservice_UserName";
    string webservicePassword = "Webservice_Password";
    _Webservice.Url = webserviceUrl;
    ICredentials credentials = new NetworkCredential(webserviceUserName, webservicePassword);
    _Webservice.Credentials = credentials;
}

How to add tooltip to a Windows Form

In Windows Form applications the tooltip functionality is not built into the controls as in HTML objects.

To add tooltip to your controls on Windows Forms

  • Open the Windows Form in the designer
  • Drag the ToolTip control from the Common Controls section of the Toolbox to the form. The ToolTip control will be placed at the bottom margin of the design surface outside of the visible area of the form.
  • A new item appears in the Misc section of the property list of the form controls (buttons, textboxes, etc): ToolTip on toolTip1
  • Enter the text there you want the users to see when they hover above the control.

How to add a DataGridView to a Windows Form

To display data in a DataGridView on a Windows Form

  • Add a new form to the Win Form Application project
  • Drag a BindingSource from the Toolbox to the form
    Visual Studio Toolbox Data

 

  • The bindingSource object appears below the form
    Visual Studio DataGridview Binding DatSource insert

 

  • Rename the Binding Source
    • Select the bindingSource1 object below the form
    • Press F4 to display the Properties
    • Change the Name property to reflect the purpose of the object
      Visual Studio DataGridview Binding DatSource properties

 

  • Select the DataSource item in the Data section and click the Add Project Data Source… link
    Visual Studio DataGridview Binding DatSource properties select data source

The name is misleading. At this step we are not selecting the source of the data, we are selecting the object that describes the data row. The DataGridView will generate the columns based on the object we will select here.

  • To load the data from a class select Object as the Data Source Type and click Next
    Visual Studio DataGridview Binding Data Source properties choose data source type

 

  • Select the object that describes the data row you want to display
    Visual Studio DataGridview Binding Data Source properties select data object

 

  • Drag a DataGridView from the Toolbox to the form
    Visual Studio Toolbox Data data grid view

 

  • Select the small arrow at the upper right corner of the DataGridView to open the Tasks dialog
  • Click the down arrow next tot the Choose Data Source list
  • Select the Binding Data Source that you added to the form
    Visual Studio DataGridview select binding data source

 

  • Click the Edit Columns link to set the visibility of the columns
    Visual Studio DataGridview Edit Columns

 

  • To hide a column set the Visible attribute in the Appearance section to False
    Visual Studio DataGridview Column visibility
  • To load data into the DatGridView add the following code to the constructor of the form. In this example the GetUsers() method returns an array of UserView objects
    // Load the data into the DataGridView
    bindingSourceUsers.DataSource = _business.GetUsers();
  • To hide the row selector column on the left side of the data add the following to the constructor of the form. This option is not included in the property sheet of the DataGridView, so we have to set it in the code.
    dataGridView1.RowHeadersVisible = false;

DbArithmeticExpression arguments must have a numeric common type

The Microsoft Visual Studio 2013 Entity Framework database query does not support the subtraction of two dates to calculate TimeSpan.

For example the following statement will throw a runtime error:

site.VisitFrequencySec < ((TimeSpan)(dtNow - site.LastVisitDate)).TotalSeconds)

To solve the problem create a computed database column to calculate the difference between the dates and use the computed value for comparison.

Column definition:

[SecondsSinceLastVisit]  AS (datediff(second,[LastVisitDate],getdate()))

Now you can use the computed column in the C# Entity Network comparison.

site.VisitFrequencySec < site.SecondsSinceLastVisit

The underlying provider failed on Open

When you get the following error message in Microsoft Visual Studio 2013 check the inner exception.

System.Data.Entity.Core.EntityException was unhandled
  HResult=-2146233087
  Message=The underlying provider failed on Open.
  Source=EntityFramework

The inner exception gives you detailed information on the real cause of the error. Most of the time the inner exception is the following:

InnerException: System.Data.SqlClient.SqlException
       HResult=-2146232060
       Message=Cannot open database “…” requested by the login. The login failed.
Login failed for user ‘…’.
       Source=.Net SqlClient Data Provider
       ErrorCode=-2146232060

Check the rights of the user. Most likely the specified user does not have access to the database.

 

The Entity Framework provider … could not be loaded

When you create a new Microsoft Visual Studio 2013 project that uses the Entity Framework you may get the following error message:
The Entity Framework provider type ‘System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer’ registered in the application config file for the ADO.NET provider with invariant name ‘System.Data.SqlClient’ could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

  • Add the EntityFramework NuGet package to the Data Access project that accesses the database and the Web Application or Web Service project that calls the project
    • Right click the project in Solution Explorer
    • Select Manage NuGet Packages
    • On the left side select Online
    • On the right side enter EntityFramework into the search field
    • Click Install next to the EntityFramework package
  • Make sure your app config file contains the following lines:

 

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="v11.0" />
    </parameters>
  </defaultConnectionFactory>
  <providers>
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  </providers>
</entityFramework>
  • Your project should contain a reference to EntityFramework.SqlServer.dll
  • Add the following line to the constructor of the class that accesses the database
var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
  • Add the System.Data.Entity reference to the project accessing the database

Microsoft Azure – Storage – Part 5 – Delete blobs with a .NET application

In the prior article of the Microsoft Azure storage series we have downloaded a file (blob) from the container. In this part we will add a method to delete a blob in the Azure storage container.

Delete a blob  in the storage container

Add the DeleteBlob method to the Azure_Helper

  • Open the Azure_Helper.cs file in the Azure_Helper project
  • Add the following method to the class
/// <summary>
/// Deletes a blob in the Azure storage
/// </summary>
/// <param name="sContainerPath"></param>
/// <param name="sBlobName"></param>
public void DeleteBlob(string sContainerPath, string sBlobName) {

    // Create the blob client.
    CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient();

    // Retrieve reference to a previously created container.
    CloudBlobContainer container = blobClient.GetContainerReference(sContainerPath);

    // Retrieve reference to a blob named "myblob.txt".
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(sBlobName);

    // Delete the blob.
    blockBlob.Delete();
}

Call the Azure_Helper from the Console Application

  • Open the Program.cs file in the Azure_ConsoleApplication
  • Add the following to the end of the Main method
// Delete the blob from the Azure storage
azureHelper.DeleteBlob(sContainerPath, sBlobName);

When you are testing the application the first time you can place a break point to the line that calls the DeleteBlob method and use the Azure manager  at https://manage.windowsazure.com  to follow the creation and deletion of the blob in the Azure storage container.

Microsoft Azure – Storage – Part 4 – Download files with a .NET application

In the third part of the Microsoft Azure Storage series we have extended our .NET application to list the contents of a container.  Today we will add a method to our application to download files from the storage container.

Download blobs from the Microsoft Azure storage

Create the DownloadFile method in the Azure Helper

  • Open the Azure_Helper.cs file in the Azure_Helper project
  • Add a new method to the class
/// <summary>
/// Downloads a blob from the storage container and saves it in the file system
/// </summary>
/// <param name="sContainerPath"></param>
/// <param name="sBlobName"></param>
/// <param name="sTargetFilePath"></param>
public void DownloadFile(string sContainerPath, string sBlobName, string sTargetFilePath) {

    // Create the blob client.
    CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient();

    // Retrieve reference to a previously created container.
    CloudBlobContainer container = blobClient.GetContainerReference(sContainerPath);

    // Retrieve reference to a blob
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(sBlobName);

    // Save blob contents to a file.
    using (var fileStream = System.IO.File.OpenWrite(sTargetFilePath)) {
        blockBlob.DownloadToStream(fileStream);
    }

}

This method will download the file from the Microsoft Azure storage and save it on a disk.

Add code to the console application to call the DownloadFile method

  • Open the Program.cs file in the Azure_ConsoleApplication
  • Add the following lines to the end of the Main method
string sTargetFilePath = @"D:\MediaFiles\Audio\DownloadedMusic.wav";

// Download the file from the Azure storage and save it
azureHelper.DownloadFile(sContainerPath, sBlobName, sTargetFilePath);

Test your application

Run your application. A new file should appear in the specified target folder.

In the next article of the Azure storage series we will learn how to delete a blob from the storage container.

Microsoft Azure – Storage – Part 3 – List the contents of the container with a .NET application

In the second part of the Azure Storage series we have developed a .Net application that can create a Microsoft Azure storage  container and upload files into it. Today we will extend the functionality of our application to list the files in the container.

List the files in the container

First let’s create a class that represents the Azure Blob. This way we can isolate our console application from the Azure Storage system, so in the future it can work with any cloud storage systems.

Add a file to the Azure_Helper project to store enumerations

  • Right click the Azure_Helper project and select Add -> Class
  • Name the class Enums
  • Add an enumeration outside of the class definition. The file should look like this:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace nsAzure_Helper {

    public class Enums {
    }

    public enum ItemType {
        undefined
        , BlobDirectory
        , BlockBlob
        , PageBlob

    }
}

Add a class to the Azure_Helper to represent a file or directory in the cloud

  • Right click the Azure_Helper project and select Add -> Class
  • Name the class CloudItem
  • To make the class public enter the word public in front of the word class
public class CloudItem
  • Add public properties to the class. The class definition should look like this:
public class CloudItem {

    public long Length { get; set; }
    public Uri Uri { get; set; }
    public ItemType Itemtype { get; set; }

}
  • Open the Azure_Helper.cs file in the Azure_Helper project
  • Add a new method to list the content of the container
/// <summary>
/// Returns the list of cloud items in the container
/// </summary>
/// <param name="sContainerPath"></param>
/// <returns></returns>
public List<CloudItem> GetContainerItems(string sContainerPath) {

    List<CloudItem> itemList = null;

    // Create the blob client. 
    CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient();

    // Retrieve reference to a previously created container.
    CloudBlobContainer container = blobClient.GetContainerReference(sContainerPath);

    if (null == container) {
        // No container found
        return itemList;
    }

    // Create an instance of the item list
    itemList = new List<CloudItem>();

    // Loop over items within the container and output the length and URI.
    foreach (IListBlobItem item in container.ListBlobs(null, false)) {

        // Create a new instance of the Cloud Item
        CloudItem cloudItem = new CloudItem();

        if (item.GetType() == typeof(CloudBlockBlob)) {
            // This is a Block Blob

            CloudBlockBlob blob = (CloudBlockBlob)item;

            cloudItem.Itemtype = ItemType.BlockBlob;
            cloudItem.Length = blob.Properties.Length;
            cloudItem.Uri = blob.Uri;

        } else if (item.GetType() == typeof(CloudPageBlob)) {
            // This is a Page Blob

            CloudPageBlob pageBlob = (CloudPageBlob)item;

            cloudItem.Itemtype = ItemType.PageBlob;
            cloudItem.Length = pageBlob.Properties.Length;
            cloudItem.Uri = pageBlob.Uri;

        } else if (item.GetType() == typeof(CloudBlobDirectory)) {
            // This is a Directory

            CloudBlobDirectory directory = (CloudBlobDirectory)item;

            cloudItem.Itemtype = ItemType.BlobDirectory;
            cloudItem.Uri = directory.Uri;

        }

        // Add the item to the list
        itemList.Add(cloudItem);

    }

    return itemList;

}

The method above returns a list of Cloud Items.

Let’s call the method from our Console Application

  • Open the Program.cs file in the Azure_ConsoleApplication project
  • Add the following code to the existing lines
// Get the list of items in the Container
List<CloudItem> itemList = azureHelper.GetContainerItems(sContainerPath);
if (null != itemList){

    foreach (CloudItem item in itemList){

        if (ItemType.BlockBlob == item.Itemtype) {

            Console.WriteLine("Block blob of length {0}: {1}", item.Length, item.Uri);

        } else if (ItemType.PageBlob == item.Itemtype) {

            Console.WriteLine("Page blob of length {0}: {1}", item.Length, item.Uri);

        } else if (ItemType.BlobDirectory == item.Itemtype) {

            Console.WriteLine("Directory: {0}", item.Uri);
        }

    }
}

Console.WriteLine("Press a key to exit");
Console.Read();

The Program.cs file should look like this

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using nsAzure_Helper;

namespace Azure_ConsoleApplication {
	class Program {
		static void Main(string[] args) {

			// Create an instance of the Azure Helper
			Azure_Helper azureHelper = new Azure_Helper();

			string sContainerPath = "test1";
			bool bMakeContainerPublic = true;
			string sBlobName = "blob1";
			string sSourceFilePath =  @"D:\MediaFiles\Audio\Music.wav";

			// Create a public container
			azureHelper.CreateContainer(sContainerPath, bMakeContainerPublic);

			// Upload an audio file
			azureHelper.UploadFile(sContainerPath, sBlobName, sSourceFilePath);

			// Get the list of items in the Container
			List itemList = azureHelper.GetContainerItems(sContainerPath);
			if (null != itemList){

				foreach (CloudItem item in itemList){

					if (ItemType.BlockBlob == item.Itemtype) {

						Console.WriteLine("Block blob of length {0}: {1}", item.Length, item.Uri);

					} else if (ItemType.PageBlob == item.Itemtype) {

						Console.WriteLine("Page blob of length {0}: {1}", item.Length, item.Uri);

					} else if (ItemType.BlobDirectory == item.Itemtype) {

						Console.WriteLine("Directory: {0}", item.Uri);
					}

				}
			}

			Console.WriteLine("Press a key to exit");
			Console.Read();

		}

	}
}

In the next article we will learn how to download files from the Microsoft Azure storage.

Microsoft Azure – Storage – Part 2 – Upload files with a .NET application


In the first part of the Azure Storage series we have created a Microsoft Azure storage in the “cloud”. Now we will create a C# application to upload, list and download files.

Create a Blank  Solution

  • In the File menu select New -> Project

visual studio blank solution

Add a new Console Application project to the solution

  • In the Solution Explorer right click the solution and select Add -> New Project
  • Name the project Azure_ConsoleApplication

visual studio console application

Add  a Class Library project to the solution

  • In the Solution Explorer right click the solution and select Add -> New Project
  • Name the project Azure_Helper

visual studio class library

Set the namespace of the helper project to nsAzure_Helper

When you create a new project Microsoft Visual Studio sets the default namespace to the same as name of the project. In .NET you cannot create a class with the same name as the name space of its project. For clarity I usually name the main class of the project after the name of the project, so I have to change the default namespace of the project.

  • Right click the Azure_Helper project and select Properties
  • On the left side select the Application tab
  • Set the Default namespace to nsAzure_Helper
  • Press CTRL-S on the keyboard to save the project file
    azure set the middletier namespace

Add a new class to the Azure_Helper class library

  • In the Solution Explorer delete automatically created the Class1.cs file
  • Right click the Azure_Helper project and select Add -> Class
  • Name the new class Azure_Helper and click the Add button
    azure middletier add new class

Add an Application Configuration File to the Console Application to store the Azure connection string

  • In the Solution Explorer right click the console application and select Add -> New Item

visual studio app config

  • When the new App.config file opens add lines to it, so it looks like this:
<configuration>
  <appSettings>
      <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=[AccountName];AccountKey=[AccountKey]" />
  </appSettings>
</configuration>

Where
[AccountName] is the Storage Account Name
[AccountKey] is the Primary key of the storage account

Add the Azure framework to the class library

  • Right click the class library and select Manage NuGet Packages…
  • In the upper right corner enter WindowsAzure.Storage
  • Select the Windows Azure Storage package and click Install

azure nuget windows azure storage

  • In the pop-up window click I Accept to download the rest of the necessary libraries.

azure nuget windows azure storage dependencies

Connect to the Azure storage

  • Open the Azure_Helper class in the Azure_Helper project
  • Add using statements to the Azure_Helper class to reference the Azure SDK


using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

Add a reference to the System.Configuration assembly to access the App.config file

  • In the Solution Explorer right click the References folder of the Azure_Helper project and select Add Reference
  • Select Assemblies, Framework, System.Configuration and click the OK button
    visual studio add reference system configuration
  • Add a using statement to the Azure_Helper class to access the app.config file

using System.Configuration;

  • Add an instance variable to the Azure_Helper class to get the connection string from the config file


CloudStorageAccount _storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);

Your Azure_Helper class should look like this

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

using System.Configuration;

namespace nsAzure_Helper
{
    public class Azure_Helper
    {
        // Retrieve storage account from connection string.
        CloudStorageAccount _storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);

    }
}

Create a storage container

Add a new method to the Azure_Helper class

  • Add a method to your Azure_Helper class to create a container in the Azure Storage account
public void CreateContainer(string sContainerPath) {

	// Create the blob client.
	CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient();

	// Retrieve a reference to a container. 
	CloudBlobContainer container = blobClient.GetContainerReference(sContainerPath);

	// Create the container if it doesn't already exist.
	container.CreateIfNotExists();

}

Call the CreateContainer method

Add a reference to the middle tier

  • In the Solution Explorer right click the References folder of the console application project and select Add Reference
  • On the left side of the pop-up window click Solution, Projects, and select to the middle tier project
    azure add reference to middletier

Open the Program.cs file of the console application

  • Add a using statement to the Program.cs class
using nsAzure_Helper;
  • Instantiate the Azure Halper, call the CreateContainer method. Your Program.cs class should look like this
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using nsAzure_Helper;

namespace Azure_ConsoleApplication {
    class Program {
        static void Main(string[] args) {

            // Create an instance of the midle tier
            Azure_Helper azureHelper = new Azure_Helper();

            string sContainerPath = "test1";
            string sBlobName = "blob1";

            // Create a container
            azureHelper.CreateContainer(sContainerPath);

        }
    }
}

Test the application

When you run the application the “test1” container should be created. To verify the result open the Windows Azure management console at https://manage.windowsazure.com/#Workspaces/All/dashboard

  • On the left side select All Items
  • Click the storage account
    azure select storage account
  • Click the Containers link
    azure select containers
  • Click the name of the container to view the files
    azure container list
  • We just created the container, so it is empty
    azure empty container

 

 

You can also use any Azure management tools. The first part of the Azure Storage series contains a link to a list of Azure management tools.

 

Add an option to make the container public

When you create the container only the account owner can access the files in the container. We will add a boolean argument to the CreateContainer method, so the caller of the method can make the container public. Anyone on the Internet can see the public files, but you need the access key to modify and delete them.

  • Change the signature of the CreateContainer method in the Azure_Helper class to
    public void CreateContainer(string sContainerPath, bool bMakeItPublic) {
  • Add the following lines to the end of the method before the closing curly bracket
    // Make the container public if requested
    if (bMakeItPublic) {
    
    	container.SetPermissions( new BlobContainerPermissions { PublicAccess =	BlobContainerPublicAccessType.Blob});
    
    }

The CreateContainer method should look like this

public void CreateContainer(string sContainerPath, bool bMakeItPublic) {

	// Create the blob client.
	CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient();

	// Retrieve a reference to a container. 
	CloudBlobContainer container = blobClient.GetContainerReference(sContainerPath);

	// Create the container if it doesn't already exist.
	container.CreateIfNotExists();

	// Make the container public if requested
	if (bMakeItPublic) {

		container.SetPermissions( new BlobContainerPermissions { PublicAccess =	BlobContainerPublicAccessType.Blob});

	}

}

Change the call to the method in the Program.cs class of the Azure_ConsoleApplication project

  • Open the Program.cs file in the Azure_ConsoleApplication project
  • Add true as  the second attribute to the call to the CreateContainer method to create a public container
// Create a public container
azureHelper.CreateContainer(sContainerPath, true);

  Upload a file to the container

The files in the container are called blobs (binary large objects), because those can be any type of files: documents, pictures, videos, music. There are two methods to store these blobs: as blocks or pages. in this example we will store our files a block blobs.

 

Create a new method in the Azure_Helper class:

public void UploadFile(string sContainerPath, string sBlobName, string sSourceFilePath) {

	// Create the blob client.
	CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient();

	// Retrieve reference to a previously created container.
	CloudBlobContainer container = blobClient.GetContainerReference(sContainerPath);

	// Retrieve reference to a blob named "myblob".
	CloudBlockBlob blockBlob = container.GetBlockBlobReference(sBlobName);

	// Create or overwrite the "myblob" blob with contents from a local file.
	using (var fileStream = System.IO.File.OpenRead(sSourceFilePath)) {
		blockBlob.UploadFromStream(fileStream);
	}

}

  Call the UploadFile method from the console application

  • Open the Program.cs file in the console application and modify the Main method to look like this
    static void Main(string[] args) {
    
        // Create an instance of the Azure Helper
        Azure_Helper azureHelper = new Azure_Helper();
    
        string sContainerPath = "test1";
        bool bMakeContainerPublic = true;
        string sBlobName = "blob1";
        string sSourceFilePath =  @"D:\MediaFiles\Audio\Music.wav";
    
        // Create a public container
        azureHelper.CreateContainer(sContainerPath, bMakeContainerPublic);
    
        // Upload an audio file
        azureHelper.UploadFile(sContainerPath, sBlobName, sSourceFilePath);
    
    }

 Test the application

If you run the application now the file should be uploaded to the Azure storage.

  • Refresh the Windows Azure management page to see the blob in the container
    azure container list of blobs

In the next article we will extend our application to list the contents of the Container.