在控制台中承载WCF服务,并提供Ajax访问和SOAP访问,以及跨域访问_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 在控制台中承载WCF服务,并提供Ajax访问和SOAP访问,以及跨域访问

在控制台中承载WCF服务,并提供Ajax访问和SOAP访问,以及跨域访问

 2016/8/18 5:30:24  zhao379028604  程序员俱乐部  我要评论(0)
  • 摘要:WCF服务可以承载与iis、winform、console、window服务中,下面重点介绍以console为载体,对外提供服务(服务满足web访问以及soap方式访问)1.服务类的实现wcf服务类一般有两种实现方式,下面分别对两种方式进行介绍:1.1使用接口进行实现1namespaceExample2{3[ServiceContract]4publicinterfaceIService5{67[OperationContract]8stringGetData(intvalue)
  • 标签:Ajax WCF 服务

WCF服务可以承载与iis、winform、console、window服务中,下面重点介绍以console为载体,对外提供服务(服务满足web访问以及soap方式访问)

 

1.服务类的实现

   wcf服务类一般有两种实现方式,下面分别对两种方式进行介绍:

1.1 使用接口进行实现 

class="code_img_closed" src="/Upload/Images/2016081805/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('1bc17a46-7379-4196-b5f0-c18c36651a14',event)" src="/Upload/Images/2016081805/2B1B950FA3DF188F.gif" alt="" />
 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

 

 

 

 


    

 

发表评论
用户名: 匿名