HTTP Web Programming with WCF 3.5: Creating a Template based URI

14 בינואר 2008

תגיות: , ,
2 תגובות

The .NET Framework 3.5 include support for web development using WCF.
In this post I will show how to create template based URI and to use them.

UriTemplate and UriTemplateMatch types

A UriTemplate is composed of two parts: a path and a query. The following examples show valid templates:


Elemets of the query must consists of pairs: s=MSFT or s={ticket}.

The following sample show how to create a UriTemplate, bind and match it to a candidate URI.

    UriTemplate template = new UriTemplate("finance/{market}/quote?s={ticket}");

    Uri prefix = new Uri("http://localhost:8080");


    foreach (String name in template.PathSegmentVariableNames)


        Console.WriteLine("{0} ", name); // MARKET



    foreach (String name in template.QueryValueVariableNames)


        Console.WriteLine("{0} ", name); // TICKET



Two ways for binding the uri template:


    // 1) http://localhost:8080/finance/nasdaq/quote?s=MSFT

    Uri positionalUri = template.BindByPosition(prefix, "nasdaq", "MSFT");

    Console.WriteLine("{0}", positionalUri);


    // 2) http://localhost:8080/finance/nasdaq/quote?s=MSFT

    NameValueCollection parameters = new NameValueCollection();

    parameters.Add("market", "nasdaq");

    parameters.Add("ticket", "MSFT");

    Uri namedUri = template.BindByName(prefix, parameters);

    Console.WriteLine("{0}", namedUri);



URI Template Match:


    Uri fullUri = new Uri("http://localhost/finance/nasdaq/quote?s=MSFT");

    UriTemplateMatch results = template.Match(prefix, fullUri);


    // MARKET: nasdaq


    if (results != null)


        foreach (String variableName in results.BoundVariables.Keys)


            Console.WriteLine("{0}: {1}\n", variableName, results.BoundVariables[variableName]);




    // nasdaq

    String market = results.BoundVariables["market"];


    // MSTF

    String ticket = results.BoundVariables["ticket"];


WebGet and WebInvoke 


The following code describe a service contract for the WCF service itself:



    public interface IStockService



        [WebGet(UriTemplate = "finance/{market}/quote?s={ticket}")]

        String GetQuote(String market, String ticket);



        [WebInvoke(UriTemplate = "Hello", Method="POST")]

        String GetPrice();



For each parameter in the UriTemplate, there is a corresponding parameter in the GetQuote method.


The implementation of the web service is simple:


    public class StockService : IStockService


        public String GetQuote(String market, String ticket)


            return "33.91";



        public String GetPrice()


            return "33";




WCF Hosting using the WebHttpBehavior and WebHttpBinding:


    using (ServiceHost host = new ServiceHost(typeof(StockService),

        new Uri("http://localhost:8080/")))


        WebHttpBinding binding = new WebHttpBinding();


        ServiceEndpoint ep = host.AddServiceEndpoint(

            typeof(IStockService), binding, String.Empty);


        ep.Behaviors.Add(new WebHttpBehavior());







The Client

And finally, the client can be any http client as show in the following sample code:


    using (WebClient client = new WebClient())


        String address = "http://localhost:8080/finance/nasdaq/quote?s=MSFT";

        String price = client.DownloadString(address);


        // Results:

        // <string xmlns="">33.91</string>


        String address2 = "http://localhost:8080/Hello";

        client.Headers.Add(HttpRequestHeader.ContentType, "text/xml");

        String price2 = client.UploadString(address2, "POST", "MSFT");

        // Result:

        // <string xmlns="">33</string>



You can download here the source code.


הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

2 תגובות

  1. Yaghiyah10 באפריל 2008 ב 16:14

    Hi get the following error with webscript enabled


    Endpoints using 'UriTemplate' cannot be used with 'System.ServiceModel.Description.WebScriptEnablingBehavior'.

    Why does it do this ?

  2. egady12 באפריל 2008 ב 20:50


    Use the WebHttpBehavior instead basicHttpBindingBehavior, and in WebGet/Invoke attributes, specify the response format instead of using 'enableWebScript':

    ResponseFormat = WebMessageFormat.Json / Xml.