How to: Create a Basic WCF Web HTTP Service - WCF (2024)

  • Article

Windows Communication Foundation (WCF) allows you to create a service that exposes a Web endpoint. Web endpoints send data by XML or JSON, there is no SOAP envelope. This topic demonstrates how to expose such an endpoint.

Note

The only way to secure a Web endpoint is to expose it through HTTPS, using transport security. When using message-based security, security information is usually placed in SOAP headers and because the messages sent to non-SOAP endpoints contain no SOAP envelope, there is nowhere to place the security information and you must rely on transport security.

To create a Web endpoint

  1. Define a service contract using an interface marked with the ServiceContractAttribute, WebInvokeAttribute and the WebGetAttribute attributes.

    [ServiceContract]public interface IService{ [OperationContract] [WebGet] string EchoWithGet(string s); [OperationContract] [WebInvoke] string EchoWithPost(string s);}
    <ServiceContract()> _Public Interface IService <OperationContract()> _ <WebGet()> _ Function EchoWithGet(ByVal s As String) As String <OperationContract()> _ <WebInvoke()> _ Function EchoWithPost(ByVal s As String) As Stringend interface

    Note

    By default, WebInvokeAttribute maps POST calls to the operation. You can, however, specify the HTTP method (for example, HEAD, PUT, or DELETE) to map to the operation by specifying a "method=" parameter. WebGetAttribute does not have a "method=" parameter and only maps GET calls to the service operation.

  2. Implement the service contract.

    public class Service : IService{ public string EchoWithGet(string s) { return "You said " + s; } public string EchoWithPost(string s) { return "You said " + s; }}
    Public Class Service Implements IService Public Function EchoWithGet(ByVal s As String) As String Implements IService.EchoWithGet Return "You said " + s End Function Public Function EchoWithPost(ByVal s As String) As String Implements IService.EchoWithPost Return "You said " + s End FunctionEnd Class

To host the service

  1. Create a WebServiceHost object.

    WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:8000/"));
    Dim host As WebServiceHost = New WebServiceHost(GetType(Service), New Uri("http://localhost:8000/"))
  2. Add a ServiceEndpoint with the WebHttpBehavior.

    ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "");
    Dim ep As ServiceEndpoint = host.AddServiceEndpoint(GetType(IService), New WebHttpBinding(), "")

    Note

    If you do not add an endpoint, WebServiceHost automatically creates a default endpoint. WebServiceHost also adds WebHttpBehavior and disables the HTTP Help page and the Web Services Description Language (WSDL) GET functionality so the metadata endpoint does not interfere with the default HTTP endpoint.

    Adding a non-SOAP endpoint with a URL of "" causes unexpected behavior when an attempt is made to call an operation on the endpoint. The reason for this is the listen URI of the endpoint is the same as the URI for the help page (the page that is displayed when you browse to the base address of a WCF service).

    You can do one of the following actions to prevent this from happening:

    • Always specify a non-blank URI for a non-SOAP endpoint.
    • Turn off the help page. This can be done with the following code:
    ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>();sdb.HttpHelpPageEnabled = false;
    Dim sdb As ServiceDebugBehavior = host.Description.Behaviors.Find(Of ServiceDebugBehavior)()sdb.HttpHelpPageEnabled = False
  3. Open the service host and wait until the user presses ENTER.

    host.Open();Console.WriteLine("Service is running");Console.WriteLine("Press enter to quit...");Console.ReadLine();host.Close();
    host.Open()Console.WriteLine("Service is running")Console.WriteLine("Press enter to quit...")Console.ReadLine()host.Close()

    This sample demonstrates how to host a Web-Style service with a console application. You can also host such a service within IIS. To do this, specify the WebServiceHostFactory class in a .svc file as the following code demonstrates.

    <%ServiceHost language=c# Debug="true" Service="Microsoft.Samples.Service" Factory=System.ServiceModel.Activation.WebServiceHostFactory%>

To call service operations mapped to GET in a browser

  1. Open a web browser, enter the URL "http://localhost:8000/EchoWithGet?s=Hello, world!", and then press Enter. The URL contains the base address of the service (http://localhost:8000/), the relative address of the endpoint (""), the service operation to call ("EchoWithGet"), and a question mark followed by a list of named parameters separated by an ampersand (&).

To call service operations in code

  1. Create an instance of ChannelFactory<TChannel> within a using block.

    using (ChannelFactory<IService> cf = new ChannelFactory<IService>(new WebHttpBinding(), "http://localhost:8000"))
    Using cf As New ChannelFactory(Of IService)(New WebHttpBinding(), "http://localhost:8000")
  2. Add WebHttpBehavior to the endpoint the ChannelFactory<TChannel> calls.

    cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
    cf.Endpoint.Behaviors.Add(New WebHttpBehavior())
  3. Create the channel and call the service.

    IService channel = cf.CreateChannel();string s;Console.WriteLine("Calling EchoWithGet via HTTP GET: ");s = channel.EchoWithGet("Hello, world");Console.WriteLine(" Output: {0}", s);Console.WriteLine("");Console.WriteLine("This can also be accomplished by navigating to");Console.WriteLine("http://localhost:8000/EchoWithGet?s=Hello, world!");Console.WriteLine("in a web browser while this sample is running.");Console.WriteLine("");Console.WriteLine("Calling EchoWithPost via HTTP POST: ");s = channel.EchoWithPost("Hello, world");Console.WriteLine(" Output: {0}", s);
    Dim channel As IService = cf.CreateChannel()Dim s As StringConsole.WriteLine("Calling EchoWithGet via HTTP GET: ")s = channel.EchoWithGet("Hello, world")Console.WriteLine(" Output: {0}", s)Console.WriteLine("")Console.WriteLine("This can also be accomplished by navigating to")Console.WriteLine("http://localhost:8000/EchoWithGet?s=Hello, world!")Console.WriteLine("in a web browser while this sample is running.")Console.WriteLine("")Console.WriteLine("Calling EchoWithPost via HTTP POST: ")s = channel.EchoWithPost("Hello, world")Console.WriteLine(" Output: {0}", s)
  4. Close the WebServiceHost.

    host.Close();
    host.Close()

Example

The following is the full code listing for this example.

// Service.csusing System;using System.Collections.Generic;using System.ServiceModel;using System.ServiceModel.Description;using System.ServiceModel.Web;using System.Text;namespace Microsoft.ServiceModel.Samples.BasicWebProgramming{ [ServiceContract] public interface IService { [OperationContract] [WebGet] string EchoWithGet(string s); [OperationContract] [WebInvoke] string EchoWithPost(string s); } public class Service : IService { public string EchoWithGet(string s) { return "You said " + s; } public string EchoWithPost(string s) { return "You said " + s; } } class Program { static void Main(string[] args) { WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:8000/")); try { ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), ""); host.Open(); using (ChannelFactory<IService> cf = new ChannelFactory<IService>(new WebHttpBinding(), "http://localhost:8000")) { cf.Endpoint.Behaviors.Add(new WebHttpBehavior()); IService channel = cf.CreateChannel(); string s; Console.WriteLine("Calling EchoWithGet via HTTP GET: "); s = channel.EchoWithGet("Hello, world"); Console.WriteLine(" Output: {0}", s); Console.WriteLine(""); Console.WriteLine("This can also be accomplished by navigating to"); Console.WriteLine("http://localhost:8000/EchoWithGet?s=Hello, world!"); Console.WriteLine("in a web browser while this sample is running."); Console.WriteLine(""); Console.WriteLine("Calling EchoWithPost via HTTP POST: "); s = channel.EchoWithPost("Hello, world"); Console.WriteLine(" Output: {0}", s); Console.WriteLine(""); } Console.WriteLine("Press <ENTER> to terminate"); Console.ReadLine(); host.Close(); } catch (CommunicationException cex) { Console.WriteLine("An exception occurred: {0}", cex.Message); host.Abort(); } } }}
'Service.csImports System.Collections.GenericImports System.ServiceModelImports System.ServiceModel.DescriptionImports System.ServiceModel.WebImports System.Text<ServiceContract()> _Public Interface IService <OperationContract()> _ <WebGet()> _ Function EchoWithGet(ByVal s As String) As String <OperationContract()> _ <WebInvoke()> _ Function EchoWithPost(ByVal s As String) As Stringend interfacePublic Class Service Implements IService Public Function EchoWithGet(ByVal s As String) As String Implements IService.EchoWithGet Return "You said " + s End Function Public Function EchoWithPost(ByVal s As String) As String Implements IService.EchoWithPost Return "You said " + s End FunctionEnd ClassModule program Sub Main() Dim host As WebServiceHost = New WebServiceHost(GetType(Service), New Uri("http://localhost:8000/")) Try Dim ep As ServiceEndpoint = host.AddServiceEndpoint(GetType(IService), New WebHttpBinding(), "") host.Open() Using cf As New ChannelFactory(Of IService)(New WebHttpBinding(), "http://localhost:8000") cf.Endpoint.Behaviors.Add(New WebHttpBehavior()) Dim channel As IService = cf.CreateChannel() Dim s As String Console.WriteLine("Calling EchoWithGet via HTTP GET: ") s = channel.EchoWithGet("Hello, world") Console.WriteLine(" Output: {0}", s) Console.WriteLine("") Console.WriteLine("This can also be accomplished by navigating to") Console.WriteLine("http://localhost:8000/EchoWithGet?s=Hello, world!") Console.WriteLine("in a web browser while this sample is running.") Console.WriteLine("") Console.WriteLine("Calling EchoWithPost via HTTP POST: ") s = channel.EchoWithPost("Hello, world") Console.WriteLine(" Output: {0}", s) Console.WriteLine("") End Using Console.WriteLine("Press <ENTER> to terminate") Console.ReadLine() host.Close() Catch cex As CommunicationException Console.WriteLine("An exception occurred: {0}", cex.Message) host.Abort() End Try End SubEnd Module

Compiling the code

When compiling Service.cs reference System.ServiceModel.dll and System.ServiceModel.Web.dll.

See also

  • WebHttpBinding
  • WebGetAttribute
  • WebInvokeAttribute
  • WebServiceHost
  • WebHttpBehavior
  • WCF Web HTTP Programming Model
How to: Create a Basic WCF Web HTTP Service - WCF (2024)
Top Articles
Vorname Lena » Bedeutung und Herkunft des Namens
How to use cardless ATMs and where can you find them?
Jin Wigs Thomaston Ga
Target Dummies 101 - The Dummy Research/Tutorial Thread
What Will It Take for Spotify’s Joe Rogan Deal to Pay Off?
Provider Connect Milwaukee
Deshaun Watson Timeline: What Has Occurred Since First Lawsuit Filed
Craigsist Houston
Orange Craigslist Free Stuff
Mets Game Highlights
Synovus Banking Hours
Nyc Peep Show 2022
Which Statement About These Two Restaurant Meals Is Correct
Thor Majestic 23A Floor Plan
Rugged Gentleman Barber Shop Martinsburg Wv
Clemson Sorority Rankings 2022
Sour Animal Strain Leafly
Downloahub
Gay Cest Com
Insidekp.kp.org Myhr Portal
Bx11
Diabetes Care - Horizon Blue Cross Blue Shield of New Jersey
Craigs List Plattsburgh Ny
Emmi Sellers Cheerleader
Weather In Allentown-Bethlehem-Easton Metropolitan Area 10 Days
Walmart Supercenter Nearest To My Location
2024 Chevrolet Traverse First Drive Review: Zaddy Looks, Dad-Bod Strength, Sugar Daddy Amenities
Is Jackson On Jeopardy Transgender
Freeman Funeral Home Chapmanville Wv Obits
Rachel Campos-Duffy - Net Worth, Salary, Age, Height, Bio, Family, Career
When Is The Next Va Millionaire Raffle 2023
Phun.celeb
The 10 Craigslist Guys You’ll Live With in DC
Why Larry the cat of 10 Downing Street wishes Starmer hadn’t won the election
Ap Macro Calculator
Dying Light Nexus
Nycda Login
Karen Ivery Reddit
Where does the Flying Pig come from? - EDC :: Engineering Design Center
Super Bowl 17 Ray Finkle
My Perspectives Grade 10 Volume 1 Answer Key Pdf
Skip The Games Albany
600 Aviator Court Vandalia Oh 45377
The Lobby Fizeaustraat | Restaurant & Bar in Amsterdam-Oost
Paychex Mobile Apps - Easy Access to Payroll, HR, & Other Services
Sun Massage Tucson Reviews
Rachaelrayshow Com Recipes
How Big is a 4×6 Photo?(Inch, cm, mm, Ft, Pixels) - PhotographyAxis
Black Panther Pitbull Puppy For Sale
Commissary Exchange Benefits What You Need To Know Aafes To Offer Service To Former Military
Why Did Jen Lewis Leave Wavy 10
Perolamartinezts
Latest Posts
Article information

Author: Duncan Muller

Last Updated:

Views: 6036

Rating: 4.9 / 5 (79 voted)

Reviews: 94% of readers found this page helpful

Author information

Name: Duncan Muller

Birthday: 1997-01-13

Address: Apt. 505 914 Phillip Crossroad, O'Konborough, NV 62411

Phone: +8555305800947

Job: Construction Agent

Hobby: Shopping, Table tennis, Snowboarding, Rafting, Motor sports, Homebrewing, Taxidermy

Introduction: My name is Duncan Muller, I am a enchanting, good, gentle, modern, tasty, nice, elegant person who loves writing and wants to share my knowledge and understanding with you.