AppFabric WCF HTTP Service Template
Windows Communication Foundation (WCF) is Microsoft’s unified programming model for building service-oriented applications. Windows Server AppFabric provides tools for managing and monitoring your web services and workflows. WCF HTTP Service is a service that can be accessed by a simple HTTP POST/GET request and can return responses in plain XML and in JSON formats.
The AppFabric WCF HTTP Service template brings these two products together providing the following features:
- Monitor the calls to your service across multiple servers with AppFabric Monitoring
- Eliminate the .svc extension from the URI by using routing
- Create custom Event Tracing for Windows (ETW) events that will be logged by AppFabric Monitoring
- Provide a simple HTML page for invoking the service with or without the .svc extension
Setup
To build and test an AppFabric WCF HTTP Service you will need the following:
Walkthrough
- Add a new project using the ASP.NET Empty Web Application Template.
- Add a new item to your project using the AppFabric WCF Service template named SampleService.svc
- Open the SampleService.svc.cs file and replace the SayHello method with the following code:
1: public string SayHello(string name)
2: {
3: // Output a warning if name is empty
4: if (string.IsNullOrWhiteSpace(name))
5: AppFabricEventProvider.WriteWarningEvent(
6: "SayHello",
7: "Warning - name is empty");
8: else
9: AppFabricEventProvider.WriteInformationEvent(
10: "SayHello",
11: "Saying Hello to user {0}",
12: name);
13:
14: return "Hello " + name;
15: }
- Build the solution
Enable Monitoring
- Open web.config
- Enable the EndToEndMonitoring Tracking profile for your web application
1: <microsoft.applicationServer>
2: <monitoring>
3: <default enabled="true" connectionStringName="ApplicationServerMonitoringConnectionString" monitoringLevel="EndToEndMonitoring" />
4: </monitoring>
5: </microsoft.applicationServer>
6:
7: <system.serviceModel>
8: <diagnostics etwProviderId="830b12d1-bb5b-4887-aa3f-ab508fd4c8ba">
9: <endToEndTracing propagateActivity="true" messageFlowTracing="true" />
10: </diagnostics>
11: <behaviors>
12: <serviceBehaviors>
13: <behavior>
14: <etwTracking profileName="EndToEndMonitoring Tracking Profile" />
15: <serviceMetadata httpGetEnabled="true" />
16: </behavior>
17: </serviceBehaviors>
18: </behaviors>
19: </system.serviceModel>
Enable Routing
- Open web.config
- Enable ASP.NET Compatibility for WCF
1: <system.serviceModel>
2: <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
3: </system.serviceModel>
- Enable the UrlRouting module.
1: <system.webServer>
2: <modules runAllManagedModulesForAllRequests="true">
3: <remove name="UrlRoutingModule"/>
4: <add name="UrlRoutingModule"
5: type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
6: </modules>
7: <handlers>
8: <add name="UrlRoutingHandler"
9: preCondition="integratedMode"
10: verb="*"
11: path="UrlRouting.axd"
12: type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
13: </handlers>
14: </system.webServer>
You Must Enable HTTP Redirection The UrlRoutingHandler will not work if the HTTP Redirection feature of IIS is not installed (more info) |
- Add global.asax
- Add the following namespace directives
1: using System.Web.Routing;
2: using System.ServiceModel.Activation;
- Add code to the Application_Start method to register the route.
1: protected void Application_Start(object sender, EventArgs e)
2: {
3: RouteTable.Routes.Add(new ServiceRoute(
4: "SampleService", /* Replace SampleService with your service name */
5: new WebServiceHostFactory(),
6: typeof(SampleService))); /* Replace SampleService with your service name */
7: }
Verify with Development Server
- In the Solution Explorer window, right click on the generated HTM file for your service. For example SampleService.svc.htm and select View in Browser.
- The ASP.NET Development Server will start and your page will load in the browser.
- The test page contains a text box and two links. One for your service with the .svc extension and one without the .svc extension which requires routing.
- Enter your name in the text box, and click on the links to verify that your service works with and without routing.
If you are using Internet Explorer 9, you might see the following error message: “The XML page cannot be displayed” To view the XML response of the service, open the View menu and select Source. |
Verify with IIS
To see the events in Windows Server AppFabric you need to deploy the Web project to IIS or modify your project to host the solution in the local IIS Server. For this example you will modify the project to host with the local IIS server.
Run Visual Studio as Administrator If you are not running Visual Studio as Administrator, exit and restart Visual Studio as Administrator and reload your project. For more information see Using Visual Studio with IIS 7. |
- Right click on the Web Application project and select properties
- Go to the Web tab
- Check Use Local IIS Web Server and click Create Virtual Directory
- Save your project settings (Debugging will not save them)
- In the Solution Explorer window, right click on the generated HTM file for your service. For example SampleService.svc.htm and select View in Browser. The address should now be that of the IIS (“https://localhost/applicationName/”) and not of the ASP.NET Development Server (“https://localhost:port/”).
- The test page contains a text box and two links. One for your service with the .svc extension and one without the .svc extension which requires routing.
- Enter your name in the text box, and click on the links to verify that your service works with and without routing.
Verify AppFabric Monitoring
- Open IIS Manager (from command line: %systemroot%\system32\inetsrv\InetMgr.exe)
- Navigate to your web application (In the Connections pane open ComputerName à Sites à Default Web Site à ApplicationName)
- Double Click on the AppFabric Dashboard to open it
- Look at the WCF Call History you should see some successful calls to your service. It groups calls by URI so calls without the .SVC extension look like a different service.
- Switch back to your browser, leave the text box empty (clear it if necessary) and click the link for service with the .svc extension and the link for the service without the .svc extension. This will generate a warning event.
- To see the monitoring for these activities switch back to the IIS Manager and refresh the AppFabric Dashboard.
- Click on the link in the WCF Call History for SampleService.svc and you will see events for the completed calls.
- To see specific events, right click on an entry for the SayHello operation and select View All Related Events.
- In the list of related events you will see the user defined event named SayHello. The payload of this event contains the message logged by the operation.
Comments
Anonymous
March 03, 2011
Great stuff Ron!!. I think it would be a great idea to simplify the configuration story for this scenario by adding some code in the template for configuring all this stuff for you if the project has a web.config file (so removing the manual steps for configuring monitoring and routing). Adding the service route in the global.asax is perhap more complicated but it can be also be done in the template. Just some feedback :).Anonymous
March 07, 2011
Hi, it's a really useful template !! We are thinking of using this as an application layer implementation, but are there any way, that we can use the tcp/ip protocol instead of http protocol?. We will implement an entity Server that communicates to the client through WCF services, and we were hoping to use the AppFabric WCF Data services, but we are concerned about the performance when using the http protocol.Anonymous
March 08, 2011
Dennis - I have a WCF SOAP version of the template that will be ready tomorrow. That should help you and you can use tcp/ip with it.Anonymous
March 08, 2011
Hi Ron, Thanks for your quick reply. I did a typing error in my earlier question, instead of "tcp/ip" I ment "net.tcp", do you know if thats going to be possible in the future? Are there any plans concerning that protocol? Sorry for the typing error !Anonymous
March 09, 2011
net.tcp == tcp/ip so no worries.Anonymous
March 09, 2011
The WCF Service Template is now available at visualstudiogallery.msdn.microsoft.com/633afbb4-1c97-4128-b22e-65954d450b64Anonymous
March 26, 2011
This is pretty cool. I really like the guidance part, makes it so much easy to try it out. I agree with Pablo on simplifying configuration.Anonymous
March 30, 2011
Still new to the Appfabric/WCF Stack. Can you tell me when it's recommended to use the "AppFabric WCF HTTP Service" Template over the "AppFabric WCF Service " Template. Does it have anything to do with the endpoint binding Good Stuff