zoukankan      html  css  js  c++  java
  • WCF学习系列(3)————承载

    承载,承载。这词听起来挺陌生……

    在WCF里面官方有三种承载方式:

    1:IIS中承载

    2:在Windows进程激活服务(WAS)中承载

    3:在托管应用程序中承载(也就是传说中的自承载)

    一个个来介绍,在IIS中承载跟我们部署普通的ASP.NET和Web Service程序类似,在IIS中建立应用程序,把我们WCF文件拷贝到相应目录就好。在IIS中承载WCF服务,IIS7.0版本只能限于HTTP通信。相应的条件我们先激活WCF HTTP组建,在Win 7 中,打开控制面板,打开或关闭Windows功能.如图

    如果我们用生成客户端代码类形式调用WCF服务,需要用到SvcUtil.exe工具。

    下面我们看例子。一般来说我们如果新建项目的时候。新建的是WCF服务项目,那么他本身就寄托在IIS上,我们配置好配置文件就可以在浏览器中浏览我们的WCF服务了。这次我们是通过IIS来承载我们服务。首先新建一般的WCF服务项目,他本身生成的代码我们稍作修改。

    View Code
    [ServiceContract]
        public interface IService1
        {
    
            [OperationContract]
            string GetData(int value);
    
        }
     public class Service1 : IService1
        {
            public string GetData(int value)
            {
                return string.Format("IIS: 承载{0}", value);
            }
    
        }

    配置文件改成

    View Code
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <configuration>
     3 
     4   <system.web>
     5     <compilation debug="true" targetFramework="4.0" />
     6   </system.web>
     7   <system.serviceModel>
     8     <services>
     9       <service name="WcfIISChengzai.Service1" behaviorConfiguration="WcfIISChengzaiBehavior">
    10         <endpoint address="" binding="wsHttpBinding" contract="WcfIISChengzai.IService1" />
    11      
    12       </service>
    13     </services>
    14     <behaviors>
    15       <serviceBehaviors>
    16         <behavior name="WcfIISChengzaiBehavior">
    17           <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
    18           <serviceMetadata httpGetEnabled="true"/>
    19           <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
    20           <serviceDebug includeExceptionDetailInFaults="false"/>
    21         </behavior>
    22       </serviceBehaviors>
    23     </behaviors>
    24     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    25   </system.serviceModel>
    26   <system.webServer>
    27     <modules runAllManagedModulesForAllRequests="true"/>
    28   </system.webServer>
    29 
    30 </configuration>

    然后我们像在IIS中部署普通asp.net web程序一样部署我们的IIS。添加应用程序,选好目录,把我们WCF服务项目编译好后的文件
    拷贝到我们IIS目录下去,注意的是,如果你新建的是类库项目BIN文件夹下一般有Debug文件夹,我们需要把Debug文件夹下的dll文件直接拷贝到我们bin目录下面来。这样我们就可以以IIS的方式浏览我们SVC文件了。

    http://localhost:8081/TcpTest/Service1.svc

    我们这次用微软提供的SvcUtil工具生成wcf客户端代理类来调用我们的WCF服务,这样的话我们在我们程序中就像调用我们本地类一样调用WCF程序了。我用的是VS2010 命令行工具,在C盘中找到SvcUtil.exe 拷贝到我们的命令行工具默认的问价夹下然后用下面代码生成客户端代理类。要注意的是最后的地址必须是我们IIS在网页中浏览我们WCF的地址。

    然后生成的代理类如下,还有生成的配置文件:

    这样我们在程序中调用wcf服务只需要把这两个文件拷贝到我们项目中区即可。

    View Code
    1  static void Main(string[] args)
    2             {
    3                 Service1Client sc = new Service1Client();
    4                 Console.WriteLine(sc.GetData(5));
    5                 sc.Close();
    6             }

    -----------------------------------------------------------------------------------------------------------------------------------

    上面所讲的只是我们三种承载WCF服务的一种,另外在Windows进程激活服务(WAS)中承载我在服务器做的例子出了点错误,暂时还没发现原因,在这先不列出来,有时间再详细去看看。现在拉说说我们第三种承载WCF服务的方法在托管应用程序中承载(也就是传说中的自承载。控制台程序,Winform程序都可以。)

    -----------------------------------------------------------------------------------------------------------------------------------

    直接看例子,先新建两个控制台项目:SelfHost为我们服务程序。SelfHostClient为调用我们的服务程序。

    服务代码:

    View Code
     1 namespace SelfHost
     2 {
     3     [ServiceContract(Namespace = "Http://SelfHost")]
     4     public interface ISelfHost
     5     {
     6         [OperationContract]
     7         string GetString(int i);
     8     }
     9 
    10     public class Program : ISelfHost
    11     {
    12         public static void Main(string[] args)
    13         {
    14             using (ServiceHost serviceHost = new ServiceHost(typeof(Program)))
    15             {
    16                  serviceHost.Open();
    17                  Console.WriteLine("服务启动了");
    18                  Console.WriteLine();
    19                  Console.ReadLine();
    20             }
    21         }
    22 
    23         public string GetString(int i)
    24         {
    25             return "自承载:" + i.ToString();
    26         }
    27     }
    28 }

    配置文件:

    View Code
     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <configuration>
     3   <system.serviceModel>
     4     <services>
     5       <service name="SelfHost.Program" behaviorConfiguration="HostSelfServiceBehavior">
     6         <host>
     7           <baseAddresses>
     8             <add baseAddress="http://localhost:8081/SelfHost/Program"/>
     9           </baseAddresses>
    10         </host>
    11 
    12         <endpoint address="" binding="wsHttpBinding" contract="SelfHost.ISelfHost" />
    13         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    14       </service>
    15     </services>
    16     <behaviors>
    17       <serviceBehaviors>
    18         <behavior name="HostSelfServiceBehavior">
    19           <serviceMetadata httpGetEnabled="True"/>
    20           <serviceDebug includeExceptionDetailInFaults="False" />
    21         </behavior>
    22       </serviceBehaviors>
    23     </behaviors>
    24 
    25   </system.serviceModel>
    26 
    27 </configuration>

    需要注意的是我们此服务终结点地址就是http://localhost:8081/SelfHost/Program。在生成我们客户端代理类的时候,就用此地址来生成前提必须是我们服务是启动的。
    运行我们的SelfHost项目:

    然后也用我们SvcUtil工具来生成客户端代理类。

    同样生成文件拷贝到我们客户端项目中去:

    然后调用

    View Code
     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             SelfHostClient shc = new SelfHostClient();
     6             Console.WriteLine(shc.GetString(5));
     7             Console.Read();
     8             shc.Close();
     9         }
    10     }

    运行效果:

     自承载可以承载在任何.NET Framework程序中,是灵活性最好的宿主选项,因为此服务需要部署的基础结构最少。但是也同时是最不可靠的宿主选项。我们一般调试WCF服务的时候可以以自承载方式承载我们WCF服务。

  • 相关阅读:
    python基础练习题(题目 画菱形)
    python基础练习题(题目 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单)
    python基础练习题(题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少)
    python基础练习题(题目 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数)
    python基础练习题(题目 求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制)
    酒库重构测试—半自动化验证
    python基础练习题(题目 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数)
    python基础练习题(题目 将一个整数分解质因数。例如:输入90,打印出90=2*3*3*5)
    python基础练习题(题目 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身)
    python基础练习题(题目 判断101-200之间有多少个素数,并输出所有素数。)
  • 原文地址:https://www.cnblogs.com/boydg123/p/2863162.html
Copyright © 2011-2022 走看看