Question arises: What
is Protocol Mapping?
In Simple Terms: It is set
of configured protocols which intimate to use which type of binding based on
particular address. It groups set of protocols that are responsible for
transport protocols.
So, we all are good to go
and implement this concept.
Now, let's get it started
off
The Complete Code of
IService1.cs looks like this:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Runtime.Serialization;
using
System.ServiceModel;
using
System.ServiceModel.Web;
using
System.Text;
namespace
WcfService1
{
// NOTE: You can use the "Rename" command on the "Refactor"
menu to change the interface name "IService1" in both code and config file
together.
[ServiceContract]
public interface
IService1
{
[OperationContract]
double Add(double
a, double b);
[OperationContract]
double Sub(double
a, double b);
[OperationContract]
double Mul(double
a, double b);
[OperationContract]
double Div(double
a, double b);
}
}
The Complete Code of
Service1.svc looks like this:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Runtime.Serialization;
using
System.ServiceModel;
using
System.ServiceModel.Web;
using
System.Text;
namespace
WcfService1
{
// NOTE: You can use the "Rename" command on the "Refactor"
menu to change the class name "Service1" in code, svc and config file together.
public class
Service1 : IService1
{
public double
Add(double a, double
b)
{
return a + b;
}
public
double Sub(double
a, double b)
{
return a - b;
}
public
double Mul(double
a, double b)
{
return a * b;
}
public
double Div(double
a, double b)
{
return a / b;
}
}
}
The Complete Code of
Web.Config looks like this:
<?xml
version="1.0"?>
<configuration>
<system.web>
<compilation
debug="true"
targetFramework="4.0"
/>
</system.web>
<system.serviceModel>
<protocolMapping>
<add
scheme="http"
binding="basicHttpBinding"
bindingConfiguration=""/>
</protocolMapping>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid
disclosing metadata information, set the value below to false and remove the
metadata endpoint above before deployment
-->
<serviceMetadata
httpGetEnabled="true"/>
<!--
To receive exception details in faults for debugging purposes, set the value
below to true. Set to false before deployment to avoid disclosing exception
information -->
<serviceDebug
includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment
multipleSiteBindingsEnabled="true"
/>
</system.serviceModel>
<system.webServer>
<modules
runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Now it's time for us to go
and add protocols with unique URL and system user name. So the complete steps
for doing this is described as below:
Start->Accessories->Run
When the Run window opens
type: netsh
The command prompt will
open, so now it's time for us to go and add protocols for user. So in the
command prompt type:
netsh>http add urlacl url=http:
//localhost:8000/Service
user=Vijay-PC
Press Enter Now. The http
will be successfully added and display a success message on prompt.
The Complete Code of
WebForm1.aspx looks like this:
<%@
Page=""
Language="C#"
AutoEventWireup="true"
CodeBehind="WebForm1.aspx.cs"
Inherits="Protocol_Mapping.WebForm1"
%>
<!DOCTYPE
html
PUBLIC "-//W3C//DTD
XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml">
<head
id="Head1"
runat="server">
<title></title>
<style
type="text/css">
.div { font-family:Cambria; } </style>
</head>
<body>
<form
id="form1"
runat="server">
<div
class="div">
<center>
<table>
<tr>
<td></td>
<td>
<asp:Label
ID="Label1"
runat="server"
Text="Vijay's
Protocol Mapping"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label
ID="Label2"
runat="server"
Text="Please
Enter First Number"></asp:Label>
</td>
<td>
<asp:TextBox
ID="TextBox1"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label
ID="Label3"
runat="server"
Text="Please
Enter Second Number"></asp:Label>
</td>
<td>
<asp:TextBox
ID="TextBox2"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td></td>
<td>
<asp:Button
ID="Button1"
runat="server"
Text="Addition"
Width="117px"
onclick="Button1_Click"
/>
</td>
</tr>
<tr>
<td></td>
<td>
<asp:Button
ID="Button2"
runat="server"
Text="Substraction"
Width="117px"
onclick="Button2_Click"
/>
</td>
</tr>
<tr>
<td></td>
<td>
<asp:Button
ID="Button3"
runat="server"
Text="Multiplication"
Width="117px"
onclick="Button3_Click"
/>
</td>
</tr>
<tr>
<td></td>
<td>
<asp:Button
ID="Button4"
runat="server"
Text="Division"
Width="117px"
onclick="Button4_Click"
/>
</td>
</tr>
</table>
<table>
<tr>
<td>
</td>
<td>
<asp:Label
ID="Label4"
runat="server"
Visible="false"
ForeColor="Red"></asp:Label>
</td>
</tr>
</table>
</center>
</div>
</form>
</body>
</html>
The Complete Code of
WebForm1.aspx.cs looks like this:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
Protocol_Mapping.ServiceReference1;
using
WcfService1;
using
System.ServiceModel;
namespace
Protocol_Mapping
{
public partial
class WebForm1
: System.Web.UI.Page
{
protected void
Page_Load(object sender,
EventArgs e)
{
TextBox1.Focus();
}
protected
void Button1_Click(object
sender, EventArgs e)
{
try
{
if (TextBox1.Text ==
"" || TextBox2.Text ==
"")
{
Label4.Text = "Addition
Operation Unsuccessful";
Label4.Visible = true;
}
else
{
ServiceHost objHost = new
ServiceHost(typeof(Service1),
new Uri("http://localhost:8000/Service"));
objHost.Open();
foreach (var
objEnd in objHost.Description.Endpoints)
{
Service1Client objClient = new
Service1Client();
double val = Convert.ToDouble(TextBox1.Text);
double val1 =
Convert.ToDouble(TextBox2.Text);
double result = objClient.Add(Convert.ToDouble(val),
Convert.ToDouble(val1));
Label4.Text = "The Addition
of  <b>" + val + "</b>  and  <b>"
+ val1 + "</b>  is  <b>" + result +
"</b></br> The Host Status is:  <b>" +
objHost.State + "</b>  </br> The Endpoint Name
is:  <b>" + objEnd.Name + "</b> </br> The
Address is:  <b>" + objEnd.Address.ToString() +
"</b></br> The Binding Name is:  <b>" +
objEnd.Binding.Name + "</b> </br> The Contract Name
is:  <b>" + objEnd.Contract.Name + "</b>";
Label4.Visible = true;
TextBox1.Text = "";
TextBox2.Text = "";
}
objHost.Close();
}
}
catch (FormatException
ex)
{
ex.Message.ToString();
}
}
protected
void Button2_Click(object
sender, EventArgs e)
{
try
{
if (TextBox1.Text ==
"" || TextBox2.Text ==
"")
{
Label4.Text = "Substraction
Operation Unsuccessful";
Label4.Visible = true;
}
else
{
ServiceHost objHost = new
ServiceHost(typeof(Service1),
new Uri("http://localhost:8000/Service"));
objHost.Open();
foreach (var
objEnd in objHost.Description.Endpoints)
{
Service1Client objClient = new
Service1Client();
double val = Convert.ToDouble(TextBox1.Text);
double val1 = Convert.ToDouble(TextBox2.Text);
double result = objClient.Sub(Convert.ToDouble(val),
Convert.ToDouble(val1));
Label4.Text = "The
Substraction of  <b>" + val + "</b> 
and  <b>" + val1 + "</b>  is  <b>"
+ result + "</b></br> The Host Status is:  <b>"
+ objHost.State + "</b>  </br> The Endpoint Name
is:  <b>" + objEnd.Name + "</b> </br> The
Address is:  <b>" + objEnd.Address.ToString() +
"</b></br> The Binding Name is:  <b>" +
objEnd.Binding.Name + "</b> </br> The Contract Name
is:  <b>" + objEnd.Contract.Name + "</b>";
Label4.Visible = true;
TextBox1.Text = "";
TextBox2.Text = "";
}
objHost.Close();
}
}
catch (FormatException
ex)
{
ex.Message.ToString();
}
}
protected
void Button3_Click(object
sender, EventArgs e)
{
try
{
if (TextBox1.Text ==
"" || TextBox2.Text ==
"")
{
Label4.Text = "Multiplication
Operation Unsuccessful";
Label4.Visible = true;
}
else
{
ServiceHost objHost = new
ServiceHost(typeof(Service1),
new Uri("http://localhost:8000/Service"));
objHost.Open();
foreach (var
objEnd in objHost.Description.Endpoints)
{
Service1Client objClient = new
Service1Client();
double val = Convert.ToDouble(TextBox1.Text);
double val1 = Convert.ToDouble(TextBox2.Text);
double result = objClient.Mul(Convert.ToDouble(val),
Convert.ToDouble(val1));
Label4.Text = "The
Multiplication of  <b>" + val + "</b> 
and  <b>" + val1 + "</b>  is  <b>"
+ result + "</b></br> The Host Status is:  <b>"
+ objHost.State + "</b>  </br> The Endpoint Name
is:  <b>" + objEnd.Name + "</b> </br> The
Address is:  <b>" + objEnd.Address.ToString() +
"</b></br> The Binding Name is:  <b>" +
objEnd.Binding.Name + "</b> </br> The Contract Name
is:  <b>" + objEnd.Contract.Name + "</b>";
Label4.Visible = true;
TextBox1.Text = "";
TextBox2.Text = "";
}
objHost.Close();
}
}
catch (FormatException
ex)
{
ex.Message.ToString();
}
}
protected
void Button4_Click(object
sender, EventArgs e)
{
try
{
if (TextBox1.Text ==
"" || TextBox2.Text ==
"")
{
Label4.Text = "Division
Operation Unsuccessful";
Label4.Visible = true;
}
else
{
ServiceHost objHost = new
ServiceHost(typeof(Service1),
new Uri("http://localhost:8000/Service"));
objHost.Open();
foreach (var
objEnd in objHost.Description.Endpoints)
{
Service1Client objClient = new
Service1Client();
double val = Convert.ToDouble(TextBox1.Text);
double val1 = Convert.ToDouble(TextBox2.Text);
double result = objClient.Div(Convert.ToDouble(val),
Convert.ToDouble(val1));
Label4.Text = "The Division
of  <b>" + val + "</b>  and  <b>"
+ val1 + "</b>  is  <b>" + result +
"</b></br> The Host Status is:  <b>" +
objHost.State + "</b>  </br> The Endpoint Name
is:  <b>" + objEnd.Name + "</b> </br> The
Address is:  <b>" + objEnd.Address.ToString() +
"</b></br> The Binding Name is:  <b>" +
objEnd.Binding.Name + "</b> </br> The Contract Name
is:  <b>" + objEnd.Contract.Name + "</b>";
Label4.Visible = true;
TextBox1.Text = "";
TextBox2.Text = "";
}
objHost.Close();
}
}
catch (FormatException
ex)
{
ex.Message.ToString();
}
}
}
}
Now, we haven't yet
done, when you run the application it displays an "addressacessdeniedException".
This exception is thrown because it's one of the new security feature
implemented in since release from Vista Operating System. It stops the user and
whereby it can be handled by running the visual studio as in Administrator
Mode. The reason behind it is protocols require administrator access rights
and privileges. The Screenshot displayed below shows how to run visual studio in
administrator mode. The Screenshot follows:
The Exception screenshot
is given as below:
The Output of the
Application looks like this:
The Addition Operation
Output Application looks like this:
The Invalid Data Entered
Output Application looks like this:
I hope this article is
useful for you.