New Features of WCF 4.0: Part I

Introduction

Microsoft.NET 4.0 and Visual Studio.NET 2010 ships a lot of new features in their underlying technologies. In this series of articles, I want to talk about the new features in the area of Windows Communication Foundation (WCF) in order to improve the development experience, enable more communication scenario, support new WS-* standards and provide a good integration with Windows Workflow Foundation (WF).

The new features are essentially the following: simplified configuration, standard endpoints, IIS hosting without a SVC file, support for WS-Discovery, routing service, REST improvements, enhancements for the integration with WF to support workflow services, simple byte stream encoding and ETW tracing.

In this series of article, I will illustrate each feature explaining the principles and showing some examples.

Simplified configuration

In WCF 3.x, when you specify a host for a Web service developed using WCF, you need to write or program the endpoints and behaviors. In WCF 4.0, you have new defaults for endpoints, binding and behaviors.

For our example, let's define a simple service which provides the echo functionality when it's invoked. The service contract is shown in the Listing 1.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WCF_NewFeatures
{
     [ServiceContract ]
     public interface IEchoService
     {
         [OperationContract ]
         string Echo(String message);
     }
}

Listing 1

The implementation for this service contract is shown in the Listing 2.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WCF_NewFeatures
{
     public class EchoService : IEchoService
     {
         public string Echo(String message)
         {
              return "Called the Echo Service with message " + message;
         }
     }
}

Listing 2

Now let's create a ServiceHost instance for this service and bind it to a URI. When the application calls to the Open method of the ServiceHost instance, it builds the internal service description from the application configuration file along with anything the host application may have configured explicitly (see Listing 3).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace WCF_NewFeatures
{
     class Program
     {
         static void Main(string [] args)
         {
             ServiceHost serviceHost = new ServiceHost (typeof (WCF_NewFeatures.EchoService ),new Uri ("http://localhost:8080/Services/EchoService" ));
             serviceHost.Open();
             System.Console .WriteLine("The EchoService has started" );
             foreach (ServiceEndpoint se in serviceHost.Description.Endpoints)
             {
                 System.Console .WriteLine("Address:{0}, Binding:{1}, Contract:{2}" , se.Address, se.Binding.Name, se.Contract.Name);
             }
             System.Console .WriteLine("Please, press any key to finish ..." );
             System.Console .ReadLine();
             serviceHost.Close();
         }
     }
}

Listing 3

When you run this program, you will see that the IEchoService service contract can be accessed from the http://localhost:8080/Services/EchoService using BasicHttpBinding (see Figure 1). Notice that WCF uses the BasicHttpBinding as the default binding.

1.gif
 
Figure 1

If you configure at least one endpoint, you will no longer see any default endpoint. Let's illustrate this by calling the AddServiceEndpoint method in the ServiceHost instance (see Listing 4).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;  

namespace WCF_NewFeatures
{
     class Program
     {
         static void Main(string [] args)
         {
             ServiceHost serviceHost = new ServiceHost (typeof (WCF_NewFeatures.EchoService ),new Uri ("http://localhost:8080/Services/EchoService" ));
             serviceHost.AddServiceEndpoint(typeof (IEchoService ),new WSHttpBinding (),"newEndPoint" );
             serviceHost.Open();
             System.Console .WriteLine("The EchoService has started" );
             foreach (ServiceEndpoint se in serviceHost.Description.Endpoints)
             {
                 System.Console .WriteLine("Address:{0}, Binding:{1}, Contract:{2}" , se.Address, se.Binding.Name, se.Contract.Name);
             }
             System.Console .WriteLine("Please, press any key to finish ..." );
             System.Console .ReadLine();
             serviceHost.Close();
         }
     }
}

Listing 4

If you run the application, you will receive the output in the Figure 2.

2.gif
 
Figure 2

However you can also add the default endpoint along with your own (see Figure 2).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace WCF_NewFeatures
{
     class Program
     {
         static void Main(string [] args)
         {
             ServiceHost serviceHost = new ServiceHost (typeof (WCF_NewFeatures.EchoService ),new Uri ("http://localhost:8080/Services/EchoService" ));
             serviceHost.AddServiceEndpoint(typeof (IEchoService ),new WSHttpBinding (),"newEndPoint" );
             serviceHost.AddDefaultEndpoints();
             serviceHost.Open();
             System.Console .WriteLine("The EchoService has started" );
             foreach (ServiceEndpoint se in serviceHost.Description.Endpoints)
             {
                 System.Console .WriteLine("Address:{0}, Binding:{1}, Contract:{2}" , se.Address, se.Binding.Name, se.Contract.Name);
             }
             System.Console .WriteLine("Please, press any key to finish ..." );
             System.Console .ReadLine();
             serviceHost.Close();
         }
     }
}

Listing 5

And the result is shown in the Figure 3.

3.gif
 
Figure 3

For bindings the default is BasicHttpBinding. With WCF 4.0, you can define default behavior configurations by omitting the name of the configuration definition in the application configuration file (see Listing 6).

<? xml version = "1.0 " encoding = "utf-8 " ?>
< configuration >
     < system.serviceModel >
         < behaviors >
             < serviceBehaviors >
                  < behavior name = "">
                     < serviceMetadata httpGetEnabled = "true " />
                 </ behavior >
             </ serviceBehaviors >
         </ behaviors >
     </ system.serviceModel >
</ configuration >

Listing 6

In this case, we have turned on the service metadata, so you can retrieve the service definition from the WSDL document (see Figure 4).

4.gif
 
Figure 4

Standard Endpoint

Standard Endpoints are pre-configured endpoint definitions built into the WCF 4.0 framework without the need to define them. These endpoints are defined using the <Kind> attribute. The standard endpoints are: mexEndpoint, dynamicEndpoint, discoveryEndpoint, udpEndpoint, announcementEndpoint, udpAnnouncementEndpoint, workflowControlEndpoint, webHttpEndpoint, webScriptEndpoint.

The mexEndpoint endpoint defines an endpoint for MEX configured with IMetadataExchange for the service contract.

The dynamicEndpoint configures an endpoint with WS-Discovery support within the a WCF client application.

The discoveryEndpoint configures the discovery operations within a client application.

The udpDiscoveryEndpoint defines an endpoint for discovery operations within a client application using UDP binding at a multicast address.

The announcementEndpoint defines an endpoint for announcement features of discovery.

The udpAnnouncementEndpoint defines an endpoint for announcement features of discovery using the UDP protocol.

The workflowControlEndpoint defines an endpoint for controlling the execution of workflow instances.

The webHttpEndpoint defines an endpoint using WebHttpBinding and WebHttpBehavior to expose REST services.

The webScriptEndpoint defines an endpoint using WebHttpBinding and WebHttpBehavior to expose Ajax services.

IIS hosting without a SVC file

In WCF 4.0, you can define virtual service activation endpoints in the Web.config file order to activate a WCF service without the need of .svc file (see Listing 7).

< configuration >
           < system.serviceModel >
                    < serviceHostingEnvironment >
                              < serviceActivations >
                                       < add relativeAddress = "EchoService.svc " service = "EchoService "/>
                              </ serviceActivations >
                    </ serviceHostingEnvironment >
           </ system.serviceModel >
</ configuration >

Listing 7

With this configuration, you can activate the EchoService using the relative address EchoService.svc. If you create a Web application in your IIS named EchoApp and copy the EchoService service definitions and set up the service configuration as shown in the Listing 7, you can browse to the service following the URI http://localhost/EchoApp/EchoService.svc without having a physical EchoService.svc file with the service activation definition.

Conclusion

In this series of article, I've explained the new features of WCF 4.0 through concepts and examples.

Further Readings

New Features of WCF 4.0: Part II
New Features of WCF 4.0: Part III
New Features of WCF 4.0: Part IV
New Features of WCF 4.0: Part V
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值