WCF入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WCF入门相关的知识,希望对你有一定的参考价值。

  学习了wcf一周了,趁着周末,记录下来,温故一下。不对的地方请多多指教!

  一.WCF出现的背景

  二.契约方法的同步,异步调用方式

  三.WCF的无配置



一.WCF出现的背景

  .net平台下,有很多的分布式技术

 1. webservice  基于http协议的soap模式。。。

 2. remoting    也是一种分布式架构技术,常常用于tcp模式的二进制传输。。。

 3. MSMQ  这是一种分布式的离线式技术,用于业务解耦。

 面对上面那3中需求,我们是不是需要整合一下,所以wcf应运而出了。

 

  我们先理解以下慨念,方便我们对  wcf的理解

  (1)ABC的概念

    ①:A:address:服务的地址

     ②:B:binding:client和service的通道,比如我们访问web,我们使用http通道。          那么wcf支持哪些通道呢?如:BasicHttpBinding,NetTcpBinding等等。

     ③:C:contract 我们定义的接口是怎么样的,参数,返回值,方法名。


  (2)承载WCF的宿主:IIS,Console,winform

     什么是宿主呢?

     WCF服务类不能凭空存在。每个WCF服务都必须托管(Hosting) 在Windows 进程中,该进程被称为宿主进程(Host Process)。单个宿主进程可以托管多个服务,而相同的服务类型也能够托管在多个宿主进程中。

     按我的理解应该是这样的:假如A和B是两个http地址,我们都在C公司上班(宿主),

去上班时我们可以从相同的门进入办公室(port),也就是说,宿主相当于托管。


二.契约方法的同步,异步调用方式

 (1)WCF中常见的三种绑定方式

     1. basichttpbinding...

     2. nettcpbinding...

     3. netmsmqbinding... 

     

     net程序互通的binding,    一般都是netxxxxxbinding...

     非net程序互通的binding.   一般都是wsxxxxbinding... 

  

 (2)契约中的调用方式。 client和servcie之间的调用方式。

   1. 同步方式: 阻塞式方式【默认的调用方式】

    Service端

    public class FlyService : IFlyService
    {

        public string Fly(string message)
        {
            //阻塞5s
            Thread.Sleep(5000);
            Console.WriteLine("接收了Fly消息:{0}-{1}",message,DateTime.Now);
            return message+DateTime.Now;
        }
    }


   Client

 ServiceReference1.FlyServiceClient flyClient = new ServiceReference1.FlyServiceClient();
 Console.WriteLine("开始调用:{0}",DateTime.Now);
 string res = flyClient.Fly("Hello World");
 Console.WriteLine("结束调用:{0}",res);

        技术分享

 

 2. 异步方式:

   ①第一种异步方式:开一个线程来访问WCF     

   Task.Factory.StartNew(() =>
   {
        string res = flyClient.Fly("Hello World");
        Console.WriteLine("子线程访问:{0}",res);
    });

   运行结果我就不上传图片了,主要来讲下第二步是怎么实现的。


  ②我们在控制面板中使用生成异步操作。

   首先,配置下服务引用,如下图

      技术分享


  然后我们在Reference上会看到生成如下几个异步方法,也就是证明我们配置成功咯,接下来就开始撸代码了。

     技术分享


  /*按F12进入,我们可以看到如下代码
    public System.IAsyncResult BeginFly(string message, System.AsyncCallback callback, object asyncState) {
      return base.Channel.BeginFly(message, callback, asyncState);
   }
     我们来分析下传的形参
     message:传给接口的参数
     callback:回调函数
     asyncState:状态
   */
        
    flyClient.BeginFly("hello World", new AsyncCallback((obj) =>
    {
        var myClient = (FlyServiceClient)obj.AsyncState;
        string res = myClient.EndFly(obj);
        Console.WriteLine("调用结束:{0}", res);
    }), flyClient);

   

三.WCF的无配置

1. 我们在开启ServiceHost的时候,启用了一些配置文件.

  也就是说这些config信息最终会被C#代码读取,然后C#代码会动态的去读取config,那何不我们自己去写呢?? 

 这样的话,我们就可以最小化配置.


2.首先我们可以在ServiceHost上面开启一个监听器,用我们自己的代码来实现配置文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using System.Threading.Tasks;

namespace WcfServiceLHost
{
    class Program
    {
        static void Main(string[] args)
        {
            #region
            //// <host>
            //// <baseAddresses>
            ////   <add baseAddress="http://localhost:8733/MyService" />
            //// </baseAddresses>
            ////</host>
            //ServiceHost host = new ServiceHost(typeof(Service1), new Uri("http://localhost:8733/MyService/"));
            ////这是我们服务的地址

            //// <endpoint address="" binding="basicHttpBinding" contract="WcfServiceConfig.IFlyService">
            //// <identity>
            //// <dns value="localhost" />
            ////  </identity>
            ////</endpoint>
            //host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), string.Empty);

            ////mex元数据的地址
            //// <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            //host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
            ////host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
            //// <behaviors>
            ////  <serviceBehaviors>
            ////    <behavior name="">
            ////      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
            ////      <serviceDebug includeExceptionDetailInFaults="false" />
            //// </behavior>
            ////  </serviceBehaviors>
            ////</behaviors>
            ////host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true, HttpsGetEnabled = true });
            ////var single = host.Description.Behaviors.Find<ServiceDebugBehavior>();
            ////single.IncludeExceptionDetailInFaults = false;
            //host.Open();
            //Console.WriteLine("WCF开启!");
            //Console.ReadKey();
            #endregion

            //// <host>
            //// <baseAddresses>
            ////   <add baseAddress="http://localhost:8733/MyService" />
            //// </baseAddresses>
            ////</host>
            ServiceHost host = new ServiceHost(typeof(Service1), new Uri("http://localhost:8733/MyService/"));

            //// <endpoint address="" binding="basicHttpBinding" contract="WcfServiceConfig.IFlyService">
            //// <identity>
            //// <dns value="localhost" />
            ////  </identity>
            ////</endpoint>
            //这是我们服务的地址
            host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), string.Empty);

            //// <behaviors>
            ////  <serviceBehaviors>
            ////    <behavior name="">
            ////      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
            ////      <serviceDebug includeExceptionDetailInFaults="false" />
            //// </behavior>
            ////  </serviceBehaviors>
            ////</behaviors>
            //mex元数据的地址
            host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });

            //<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            //mex元数据的地址
            host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");

            host.Open();

            Console.WriteLine("WCF 服务开启");

            Console.Read();
        }
    }
}


 

本文出自 “11581236” 博客,谢绝转载!

以上是关于WCF入门的主要内容,如果未能解决你的问题,请参考以下文章

WCF入门教程五[WCF的通信模式]

WCF入门教程四[WCF的配置文件]

WCF REST入门套件 - 名称为“UriTemplateMatchResults”的属性已存在

WCF入门教程三[WCF的宿主]

无废话WCF系列教程 -- 李林峰

推荐net开发cad入门阅读代码片段