WCF服务可以承载与iis、winform、console、window服务中,下面重点介绍以console为载体,对外提供服务(服务满足web访问以及soap方式访问)
1.服务类的实现
wcf服务类一般有两种实现方式,下面分别对两种方式进行介绍:
1.1 使用接口进行实现
1 namespace Example 2 { 3 [ServiceContract] 4 public interface IService 5 { 6 7 [OperationContract] 8 string GetData(int value); 9 // TODO: 在此添加您的服务操作 10 } 11 } 12 13 namespace Example 14 { 15 16 public class Service1 : IService 17 { 18 public string GetData(int value) 19 { 20 return string.Format("You entered: {0}", value); 21 } 22 } 23 }View Code
1.2 直接在类上面进行实现
1 namespace Example 2 { 3 [ServiceContract] 4 public class Service1 5 { 6 [OperationContract] 7 public string GetData(int value) 8 { 9 return string.Format("You entered: {0}", value); 10 } 11 } 12 }View Code
当我们需要同时支持web方式访问的时候,我们只要给类添加一些特性即可进行功能的拓展
可以给类添加[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
可以给方法添加[WebInvoke()]或者[WebGet()]特性
注意:[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]只能添加在类上面 而[WebInvoke()]和[WebGet()]可以添加在接口中,也可以添加在类中
2. Config的配置
与服务相关的所有的配置信息全部在system.serviceModel节点中,主要有bindings、behaviors、services需要进行配置,下面主要说一下behaviors和services的配置
1 <behaviors> 2 <serviceBehaviors> 3 <behavior name=""> 4 <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 5 <serviceDebug includeExceptionDetailInFaults="false" /> 6 </behavior> 7 </serviceBehaviors> 8 <endpointBehaviors> 9 <behavior name="Example.Service"> 10 <webHttp /> 11 </behavior> 12 </endpointBehaviors> 13 </behaviors> 14 <services> 15 <service name="template.Example"> 16 <endpoint address="" behaviorConfiguration="Example.Service" binding="webHttpBinding" contract="Example.Service" /> 17 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 18 <endpoint address="Soap" binding="basicHttpBinding" contract="Example.Service" /> 19 <host> 20 <baseAddresses> 21 <add baseAddress="http://localhost:8733/template/Example/" /> 22 </baseAddresses> 23 </host> 24 </service> 25 </services>View Code
其中service节点将example作为服务发布出去host描述了当前的服务发布的基础地址后面的调用或restful调用都是相对改地址的 endpoint有三个,
1.名字为空的表示将服务发布,并可以供web调用,其中的关键是binding="webHttpBinding", web调用时,调用的方式为:基础地址"http://localhost:8733/template/Example/"+address(“”)+函数名(当定义了uritemplate时,为uritemplate的值)
2.名字为“mex”的表示将服务的Metadata发布出去,并且可以访问,当去掉该endpoint是,无法获取元数据信息
3.名字为“soap”的表示将服务作为soap服务发布,供soap进行访问,去掉后无法进行soap访问。访问的路径为:基础地址+“soap”
比较1和3的endpoint可以发现主要的区别在与binding的值,当要进行一些其它的功能是,进行功能配置后,为配置取名字,将名字付给需要的属性
3. 跨域访问
说到底soap协议是基于http协议的,当存在访问安全问题时,可以使用常用的web开发时跨域访问的问题进行解决。我们在请求的response头中添加“Access-Control-Allow-Origin”即可解决某些情况下web跨域访问的安全问题。
通过WebOperationContext.Current我们可以获取到当前请求的上下文,在当前请求的上下文中的response对象的头部添加“Access-Control-Allow-Origin”
代码如下:
1 WebOperationContext ctx = WebOperationContext.Current; 2 ctx.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");View Code
既然获取了当前请求的上下文对象,需要做一些其它事情的也可以干自己想干的了,并不仅仅局限于跨域访问控制了
4. ServiceHost
我们可以通过ServiceHost对象将服务承载于一个console application 或winform application中,具体的代码如下:
static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(CaAgent)); host.Open(); Console.WriteLine("数据服务开启"); while(Console.ReadLine()!="quit"){ } host.Close(); }
下面附上在github上面的example的地址:WCF_Ajax_CrossDomain