你的位置:首页 > ASP.net教程

[ASP.net教程]在控制台中承载WCF服务,并提供Ajax访问和SOAP访问,以及跨域访问


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 Example14 {15 16   public class Service1 : IService17   {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