今天学了WCF记录一下

学了一下WCF,总结起来就是,网上的教程残缺不全,要不很全,但是完全看不懂,要不就是看得懂,但是完全不知道怎么下笔。
学了一天,累的要死,通过7到10个左右的案例和文图教程。我算搞个大概明白怎么回事了。这个破玩意弄明白就没啥意思了。文思如屁崩。
 
先说下WCF是什么鸟东西,这个玩意就是WEB SERVICE的升级版,如果连WEB SERVICE是啥都不知道的话,自己去谷歌资料学,很简单,学会了你会发现我上午分享的那些很好玩。。
 
当然WS是有一定缺点,例如。。。我百度下。优点: 不需要额外的客户端支持 / 无视防火墙 / 平台无关 缺点: 慢
百度给的答案,但是慢这个事情是真的,而且如果数据量过大,可能产生丢包。
 
当然WCF也是有缺点的,例如。。。。谷歌下。

◆易用性:只需几行代码即可使服务运行。
    ◆灵活性:通过 ServiceHost<T> 的 Open() 和 Close() 方法,可以轻松控制服务的生存期。
    ◆易调试性:可以使用熟悉的调试方式对自承载环境中承载的 WCF 服务进行调试,而不必连接到单个应用程序来激活服务。
    ◆易部署性:通常,部署简单 Windows 应用程序与使用 xcopy 一样容易。您不必在服务器场和类似地方部署复杂的方案,即可部署简单的 Windows 应用程序来充当 WCF ServiceHost。
    ◆支持所有绑定和传输:自承载并不限制您仅能使用现有的绑定和传输技术。在 Windows XP 和 Windows Server 2003 上,IIS 限制您只能使用 HTTP。

    下面WCF自承载的缺点:
    ◆可用性受到限制:服务只有在应用程序运行时才能被访问。
    ◆功能受到限制:自承载的应用程序在对高可用性、易管理性、可靠性、可恢复性、版本控制和部署方案的支持方面受到一定限制。至少,现有的 WCF 无法提供这些支持,因此在自承载的情况中,您必须自己实现这些功能;例如,默认情况下 IIS 提供了这些功能中几项。

缺点可以拟补。。一会在说怎么拟补

为了简单的说明,就不截图了,总的来说需要建立一个WCF的项目,根据网上不同的攻略,最后发现对的项目是WCF服务库。这个东西想不说怎么写,根据他的介绍他有个 ABC这个鸟东西,ABC又是咩类根据资料显示他是三个单词地址(Address)绑定(Binding)契约(Contract),

地址决定访问服务器的位置

绑定实现通信细节

契约是对服务对象进行抽象

很专业了有木有!!!看着很厉害有木有!!!

下面进行一个白话翻译。

地址 就是配置文件(你看你新建的WCF服务库是不是有个配置文件)

契约 我个人理解应该是属于接口的一个概念,因为在默认的IService1他就是个接口的写法,虽然加了一些特性。

绑定 有接口必然有实现。。不多解释

好了 你把这三个理解了。是不是觉得WCF很坑人。

当然白话的解释留在心中作为疑问就可以了。但是他们的写法跟我说的很相像。

也不多做解释。F5运行吧。是不是出来一个对话框!!!有木有!!!给两个例子!!

其实这两个例子就是实现传参和返回。

好了,你现在有一个WCF的DLL了。

WCF怎么调用呢。

WCF分两种宿主模式一个是在别的程序上宿主一个是在自己程序上宿主。在别的程序上的我看网上的一般都是和IIS合体。但是由于电脑木有IIS就木发宿了。所以自己。。自己写一个宿主。叫他来睡,否则WCF无法启动啊!!亲!!无法启动!!反正我没宿主的时候没让他启动起来。。。

没办法,写一个控制台程序让他启动吧。

这时候其实就是需要A的时候了 A是什么?自己去上文找

但是这个配置文件怎么写呢。我纠结在配置文件这里将近2个小时,后来发现原来是我弄错项目了。

最简单的办法就是把你在WCF源码下面的配置文件的

<system.serviceModel>
    <services>
      <service name="WcfServiceLibrary1.Service1">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
        <endpoint address ="" binding="wsHttpBinding" contract="WcfServiceLibrary1.IService1">
          <!--
              部署时,应删除或替换下列标识元素,以反映
             用来运行所部署服务的标识。删除之后,WCF 将
              自动推断相应标识。
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 -->
        <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,
          请在部署前将以下值设置为 false 并删除上面的元数据终结点  -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- 要接收故障异常详细信息以进行调试,
          请将以下值设置为 true。在部署前设置为 false
            以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

复制到你的项目里面

  <add baseAddress = "http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
这句话的baseaddress就是A地址,访问地址 你现在点你自己项目这个地址果断点不开。因为你WCF服务没有启动,F5运行你在点这个地址就能进去。但是这个不是我要的结果。

略作修改,这个地址是虚拟路径自己改着玩

在WCF的bin里面你会发现他生成的dll,这个DLL就是WCF的服务库。附加到你的项目或者是控制台里面,我用控制台弄的,然后有的IDE需要引用一下system.servicemodel

            using(var ser=new ServiceHost(typeof(Service1)))
            {
                ser.Open();
                Console.WriteLine("开启");
                Console.ReadLine();
            }

这样就开启了,注意事项就是Service1不是接口的,而是绑定如果配置文件没复制粘贴错误的话。地址也改好的话,那么运行

OK这个时候去访问你的地址吧。打开页面了吧。这样WCF就被放在了控制台上了。只要控制台让WCF启动的话,那么你写的程序就一切正常。

这个就是我理解的宿主在别的程序上面。

以上资料来至 http://www.cnblogs.com/artech/archive/2007/02/26/656901.html 和http://blog.sina.com.cn/s/blog_661beca00100xzei.html

博客园的是专业的写法。没看明白只是把基础的一些信息看明白了,新浪博客的案例我按照操作居然失败了。。

所以又找了一些别的信息补充进来。

至于项目引用嘛 我说了 WS引用的方式是一种,但是不知道这样做会不会影响WCF的优势,这个需要找资料瞅瞅

其实WS也是不访问不触发,需要写一个windows服务,这个服务,我也写了小半天,下回有机会在分享。

他的缺点之一就是受限制,不访问不触发,但是貌似WS不访问也不触发吧。所以用windows服务可以解决这个问题一奶同胞谁都别冷落谁。反正我是这么想的不知道,高人如何想的呢。呵呵。

第二个缺点暂时还不知道如何去解决。

这个方法100%可以让你的程序使用WCF服务库 哈哈。

绑定和契约这个不用多说吧。这个要不会的话,我也没办法了。WCF返回值貌似没有规定,WS返回值是JSON或者是XML格式所以有一些东西不方便传递,要是传递文件的话要先二进制,到那边在变回来。。WCF传东西我还没看。不知道是什么鸟样。


作者:小胖李
出处:http://www.cnblogs.com/minCS/
本文版权归作者和博客园共有,禁止转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

原文地址:https://www.cnblogs.com/minCS/p/2649865.html