Details, details, details… I just spend a few days moving over to svc-less WCF services with a ASP.NET 4.0 web application, and boy was it fun… The overall setup is pretty easy, once you’ve painfully gone through the process “a few” times. Since this is something I’ll no be doing by default on all new projects, I thought this would make a great write-up tutorial. During my discovery and learning phase, I found a bunch of helpful blog posts but nothing was 100% and there was lots of those “important” bits missing. Since most of my projects consume JSON, I plan to do a 4 part series on setting up a Web Application to support WCF services that will be called via jQuery.
Enough with the background, let’s start by creating a new “ASP.NET Web Application”.
- Remove everything inside the Scripts folder.
- Right Click on Project, and choose “Manage NuGet Packages…”
Hopefully your familiar with NuGet, it’s a package manager for Visual Studio and you can install it by going to Tools -> Extension Manager… -> Online Gallery -> Download “NuGet Package Manager”. This is the most popular extension and it allows you to quickly add bits to your projects (e.g. Install jQuery, and be notified when a new version is available.).
- Use search to install the following NuGet Packages.
- jQuery
- JSON-js json2
- Edit your “site.master” to and include your new scripts:
1234
<
script
src
=
"Scripts/jquery-1.7.2.js"
type
=
"text/javascript"
></
script
>
<
script
src
=
"Scripts/jquery-ui-1.8.19.js"
type
=
"text/javascript"
></
script
>
<
script
src
=
"Scripts/jquery.validate.js"
type
=
"text/javascript"
></
script
>
- Also in the “site.master”, edit your asp:Menu to include 4 pages called Part1 – Part4:
1234567891011
<
asp:Menu
ID
=
"NavigationMenu"
runat
=
"server"
CssClass
=
"menu"
EnableViewState
=
"false"
IncludeStyleBlock
=
"false"
Orientation
=
"Horizontal"
>
<
Items
>
<
asp:MenuItem
NavigateUrl
=
"~/Default.aspx"
Text
=
"Home"
/>
<
asp:MenuItem
NavigateUrl
=
"~/Part1.aspx"
Text
=
"Part 1"
/>
<
asp:MenuItem
NavigateUrl
=
"~/Part2.aspx"
Text
=
"Part 2"
/>
<
asp:MenuItem
NavigateUrl
=
"~/Part3.aspx"
Text
=
"Part 3"
/>
<
asp:MenuItem
NavigateUrl
=
"~/Part3.aspx"
Text
=
"Part 4"
/>
<
asp:MenuItem
NavigateUrl
=
"~/About.aspx"
Text
=
"About"
/>
</
Items
>
</
asp:Menu
>
** We are only going to use Part1.aspx right now, but I plan on 4 posts on this topic.
- Add 4 new “Web Form using Master Page” to the project called Page1.aspx, Page2.aspx, Page3.aspx, Page4.aspx.
** These will match the named used in the navigation menu in the site.master. - Add a new folder to the root of the project called Service.
- Add a new “AJAX-enabled WCF Service” to the Service folder called “InventoryService.svc”.
- Note, this will add the following references to your project.
1234
System.Runtime.Serialization
System.ServiceModel
System.ServiceModel.Web
- It will also add the following lines to your Web.config
12345678910111213141516171819202122
<
system.webServer
>
<
modules
runAllManagedModulesForAllRequests
=
"true"
/>
</
system.webServer
>
<
system.serviceModel
>
<
behaviors
>
<
endpointBehaviors
>
<
behavior
name
=
"RESTfulWCF.Service.Service1AspNetAjaxBehavior"
>
<
enableWebScript
/>
</
behavior
>
</
endpointBehaviors
>
</
behaviors
>
<
serviceHostingEnvironment
aspNetCompatibilityEnabled
=
"true"
multipleSiteBindingsEnabled
=
"true"
/>
<
services
>
<
service
name
=
"RESTfulWCF.Service.Service1"
>
<
endpoint
address
=
""
behaviorConfiguration
=
"RESTfulWCF.Service.Service1AspNetAjaxBehavior"
binding
=
"webHttpBinding"
contract
=
"RESTfulWCF.Service.Service1"
/>
</
service
>
</
services
>
</
system.serviceModel
>
- Change the “system.serviceModel” section of your web.config to the following.
123456789
<
system.serviceModel
>
<
serviceHostingEnvironment
aspNetCompatibilityEnabled
=
"true"
/>
<
standardEndpoints
>
<
webHttpEndpoint
>
<
standardEndpoint
name
=
""
helpEnabled
=
"true"
automaticFormatSelectionEnabled
=
"true"
/>
</
webHttpEndpoint
>
</
standardEndpoints
>
</
system.serviceModel
>
Web.Config Key Points
1234// This allows your services to run under your sites app pool, giving access
// to your HttpContext.
aspNetCompatibilityEnabled=
"true"
123// See below, this allows you to type <service>/help to get information on your service
helpEnabled=
"true"
1234// This is AWESOME, this tag allows your service to respond in any format you
// specify in your request (e.g. XML, JSON, etc...).
automaticFormatSelectionEnabled=
"true"
** One last item to note, every time you add an additional AJAX service, it will edit your web.config and put back in the bad configuration. I strongly suggest you make a backup of your web.config, incase you run into problems in the future!!!
- Manually add a project reference to System.ServiceModel.Activation.
- Note, this will add the following references to your project.
- At this point, your project in solution explorer should look like this:
- Now, open InventoryService.svc and make the following changes:
- Erase everything and add the following C# code:
12345678910111213141516171819
using
System.ServiceModel;
using
System.ServiceModel.Activation;
using
System.ServiceModel.Web;
namespace
RESTfulWCF.Service
{
[ServiceContract(Namespace =
""
)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public
class
InventoryService
{
[WebGet(UriTemplate =
"Part1"
)]
[OperationContract]
public
string
Part1GetRequest()
{
return
"I did work"
;
}
}
}
In the code above, we are mapping the function “Part1GetRequest” to the name “Part1”. This will allow us to call the service with the following syntax “/InventoryService/Part1” using a GET request.
- Erase everything and add the following C# code:
- Add a route to call the service without referencing a “.svc” file.
Open Global.asax and replace your Applicaiton_Start with the following.123456void
Application_Start(
object
sender, EventArgs e)
{
// Code that runs on application startup
RouteTable.Routes.Add(
new
ServiceRoute(
"InventoryService"
,
new
WebServiceHostFactory(),
typeof
(Service.InventoryService)));
}
- Now we are ready to create a jQuery test call, open “Page1.aspx” in Source View:
Erase everything and add the following HTML code
123456789101112131415161718192021<%@ Page Title=
""
Language=
"C#"
MasterPageFile=
"~/Site.Master"
AutoEventWireup=
"true"
CodeBehind=
"Part1.aspx.cs"
Inherits=
"RESTfulWCF.Part1"
%>
<asp:Content ID=
"Content1"
ContentPlaceHolderID=
"HeadContent"
runat=
"server"
>
</asp:Content>
<asp:Content ID=
"Content2"
ContentPlaceHolderID=
"MainContent"
runat=
"server"
>
<script type=
"text/javascript"
>
$(document).ready(
function
()
{
$(
'#doWork'
).click(
function
()
{
$.getJSON(
'/InventoryService/Part1'
,
''
,
function
(result) { alert(result); });
});
});
</script>
<h2>
ASP.NET 4.0 WCF RESTful Demo - Part 1
</h2>
<p>
<input type=
"button"
id=
"doWork"
value=
"Issue GET Request"
/>
</p>
</asp:Content>
We are able to use the $.getJSON() jQuery function because we applied the “WebGet” attribute to the WCF function “Part1GetRequest()”.
- Launch the application and navigate to “Page 1”. Click on the “Issue GET Request” button and you should see the followign results:
- To get a list of all the functions your service offers, pass the “/help” parameter to your service.
As noted, here is the project I built above following all the steps one-by-one.
>> ASP.NET 4.0 RESTful Web Application Project