WCF学习笔记壹

一、WCF服务应用程序与WCF服务库

一、WCF服务应用程序与WCF服务库

  咱俩在平时付出的经过中常用的品连串别有“WCF
服务应用程序”和“WCF服务库”。

  大家在平日支出的进程中常用的品类项目有“WCF
服务应用程序”和“WCF服务库”。

  WCF服务应用程序,是三个方可施行的主次,它有独立的长河,WCF服务类契约的定义,能够一贯看出运维的意义。此项目模板基于IIS托管的程序,如本类别的第3节所示。在支付基于IIS托管的WCF服务程序时,比较多见,自学的时候也得以使用那系列型,轻松易懂。

  WCF服务应用程序,是2个方可实行的次序,它有单独的进度,WCF服务类契约的概念,能够一向看出运维的效果。此项目模板基于IIS托管的程序,如本种类的首先节所示。在支付基于IIS托管的WCF服务程序时,比较多见,自学的时候也足以行使那连串型,简单易懂。

  WCF服务库,能够感觉是2个富含WCF服务以及契约定义的类库。不能一贯运转,你能够在任何体系里引用,在宿主里启用托管这一个库,有一些类似于我们在Web项目中选取的类库。挂念WCF服务规划的时候,服务类的定义为独立的库,可以为此外门类利用。升高代码的复用性。

  WCF服务库,可以以为是贰个包括WCF服务以及契约定义的类库。无法平素运行,你能够在其他品种里引用,在宿主里启用托管那些库,有一点点类似于大家在Web项目中运用的类库。思虑WCF服务规划的时候,服务类的概念为单身的库,可以为其余品类选拔。进步代码的复用性。

  当然你也得以修改这么些代码,比如把WCF服务程序里的类,移到3个独立的类Curry,或是把类Curry的类移到WCF服务程序中。

  当然你也得以修改这么些代码,举例把WCF服务程序里的类,移到多少个单身的类库里,或是把类库里的类移到WCF服务程序中。

二、概述

二、概述

  通过前面包车型地铁牵线大家领略,WCF在运行时必寄宿在“宿主程序”之上,WCF本人不可见独立运维(每一个WCF服务必须宿主在三个Windows进度中)。.net
提供了八种宿主供WCF运营,WCF依然特别灵活的。

  通过前边的介绍大家清楚,WCF在运维时必寄宿在“宿主程序”之上,WCF本人不能够单独运维(每种WCF服务必须宿主在多个Windows进度中)。.net
提供了多样宿主供WCF运转,WCF仍旧极度灵活的。

lovebet爱博体育官网 1

lovebet爱博体育官网 2

 

  WCF的宿主能够是 Windows 服务、COM+应用程序、WAS(Windows Activation
Services,Windows进程激活服务)或IIS、Windows应用程序,或简捷的调节台应用程序及任何.net程序。

WCF的宿主能够是 Windows
服务、COM+应用程序、WAS(Windows Activation
Services,Windows进度激活服务)或IIS、Windows应用程序,或简捷的调节台应用程序及任何.net程序。

  那节的躬体力行大家重新成立WCF类库项目为例做示范,名叫:WCFLibrary,并删除自动生成的四个文本(IService壹.cs、Service一.cs)。如下图所示:

  那节的演示大家重新确立WCF类库项目为例做示范,名称叫:WCFLibrary
如下图所示:

lovebet爱博体育官网 3

lovebet爱博体育官网 4

  鼠标右键查看项目性质。大家开采,其实“WCF类库项目”与我们平时创制的“类库项目”都以类库,只可是多了WCF的类库项目在新建时多了三个dll的引用(System.ServiceModel.dll、System.Runtime.Serialization.dll)和一个自动生成的安顿文件(该配置文件只用于调节和测试时选用,在WCF寄宿今后会选拔宿主的布局文件与其余应用程序通讯)。那更表明了小编们在做分式程序支付的时候与大家一直支付的应用程序未有多大的区分,只要我们在应用程序间通讯时“符合WCF的预定”就能够。

 

  服务端大家还和率先个学科同样(IUser接口与User完毕),只创设一个格局做为大家调用的演示代码如下:

      
鼠标右键查看项目性质。大家开采,其实“WCF类库项目”与大家向来成立的“类库项目”都以类库,只可是多了WCF的类库项目在新建时多了五个dll的引用(System.ServiceModel.dll、System.Runtime.Serialization.dll)和3个自动生成的安排文件(该配置文件只用于调节和测试时利用,在WCF寄宿以往会采纳宿主的布局文件与别的应用程序通讯)。那更表明了我们在做分式程序开垦的时候与大家平素费用的应用程序未有多大的区分,只要我们在应用程序间通讯时“符合WCF的预订”就能够。

//添加引用
using System.ServiceModel;

namespace WCFLibrary
{
    [ServiceContract]
    interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }
}

namespace WCFLibrary
{
    class User : IUser
    {
        public string ShowName(string name)
        {
            string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
            return wcfName;
        }
    }
}

[IService1.cs]

出于原先的契约为IService,今后的为IUser,所以安插文件有两处要修改为:

namespace WCFLibrary
{
    [ServiceContract]
    [ServiceKnownType(typeof(Entity))]
    [ServiceKnownType(typeof(EntityCollection))]
    [ServiceKnownType(typeof(Entity[]))]
    public interface IService1
    {
        [OperationContract]
        [WebGet()]
        Stream GetData1(string callback, string value);

        [OperationContract]
        [WebGet()]
        Stream GetData2(string callback, string cityid, string cityname);

        [OperationContract]
        [WebGet()]
        Stream GetData3(string callback, string data);

        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        string GetData4(string name);

        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        Stream GetData5(string userID, string userName);

        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        string GetData6(string name);

        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        Stream GetData7(string userID, string userName);

        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        Stream GetData8(DynamicXml entity);

        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        DynamicXml GetData9(DynamicXml entity);

        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        Stream GetData10(DynamicXml entity);

        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        DynamicXmlCollection GetData11(DynamicXml entity);

        [OperationContract]
        [WebInvoke(UriTemplate = "/GetData12", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        Entity GetData12(Entity entity);

        [OperationContract]
        [WebInvoke(UriTemplate = "/GetData13", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        EntityCollection GetData13(Entity entity);

        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        User GetData14(string userID, string userName);

        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        User GetData15(User user);

        [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        List<User> GetData16(string userID, string userName);

        // TODO: 在此添加您的服务操作
    }

    // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
    [DataContract]
    public class User
    {
        int userID;
        string userName;
        string userAge;

        [DataMember]
        public int UserID
        {
            get { return userID; }
            set { userID = value; }
        }

        [DataMember]
        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }

        [DataMember]
        public string UserAge
        {
            get { return userAge; }
            set { userAge = value; }
        }
    }
}

<service name=”WCFLibrary.User”>

[Service1.cs]

<endpoint address=”” binding=”wsHttpBinding”
contract=”WCFLibrary.IUser”>

namespace WCFLibray
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1 : IService1
    {
        public Stream GetData1(string callback, string value)
        {
            string jsCode = ((callback == null) ? "" : callback + "(") + "{\"value\":\"" + value + "\"}" + ((callback == null) ? "" : ")");
            return new MemoryStream(Encoding.UTF8.GetBytes(jsCode));
        }

        public Stream GetData2(string callback, string cityid, string cityname)
        {

            string jsCode = ((callback == null) ? "" : callback + "(") + "{\"CityID\":\"" + cityid + "\",\"CityName\":\"" + cityname + "\"}" + ((callback == null) ? "" : ")");
            return new MemoryStream(Encoding.UTF8.GetBytes(jsCode));
        }

        public Stream GetData3(string callback, string data)
        {
            dynamic entity = JsonConvert.DeserializeObject<dynamic>(data);
            string jsCode = ((callback == null) ? "" : callback + "(") + "{\"CityID\":\"" + entity.CityID + "\",\"CityName\":\"旧:" + entity.CityName + " -> 新:武汉\"}" + ((callback == null) ? "" : ")");
            return new MemoryStream(Encoding.UTF8.GetBytes(jsCode));
        }

        public string GetData4(string name)
        {
            string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
            return wcfName;
        }

        public Stream GetData5(string userID, string userName)
        {
            string data = "{\"UserID\":\"" + userID + "\",\"UserName\":\"" + userName + "\"}";
            return new MemoryStream(Encoding.UTF8.GetBytes(data));
        }

        public string GetData6(string name)
        {
            string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
            return wcfName;
        }

        public Stream GetData7(string userID, string userName)
        {
            string data = "{\"UserID\":\"" + userID + "\",\"UserName\":\"" + userName + "\"}";
            return new MemoryStream(Encoding.UTF8.GetBytes(data));
        }

        public Stream GetData8(DynamicXml entity)
        {
            dynamic result = new DynamicXml();

            result.UserID = 1000;
            result.UserName = entity.GetValue("UserName");
            result.Sex = entity.GetValue("Sex");

            return new MemoryStream(Encoding.UTF8.GetBytes(result.ToJson()));
        }

        public DynamicXml GetData9(DynamicXml entity)
        {
            dynamic result = new DynamicXml();

            result.UserID = 1000;
            result.UserName = entity.GetValue("UserName");
            result.Sex = entity.GetValue("Sex");

            return result;
        }

        public Stream GetData10(DynamicXml entity)
        {
            DynamicXmlCollection resultList = new DynamicXmlCollection();
            dynamic dObject = entity.GetDynamicObject();

            foreach (var item in dObject.Users.item)
            {
                dynamic result = new DynamicXml();
                result.UserID = Convert.ToInt32(item.UserID.Value);
                result.UserName = item.UserName.ToString();
                result.Sex = item.Sex.ToString();
                resultList.Add(result);
            }

            return new MemoryStream(Encoding.UTF8.GetBytes(resultList.ToJson()));
        }

        public DynamicXmlCollection GetData11(DynamicXml entity)
        {
            DynamicXmlCollection resultList = new DynamicXmlCollection();
            dynamic dObject = entity.GetDynamicObject();

            foreach (var item in dObject.Users.item)
            {
                dynamic result = new DynamicXml();
                result.UserID = Convert.ToInt32(item.UserID.Value);
                result.UserName = item.UserName.ToString();
                result.Sex = item.Sex.ToString();
                resultList.Add(result);
            }

            return resultList;
        }

        public Entity GetData12(Entity entity)
        {
            Entity result = null;

            string userID = entity.GetValue("UserID").ToString(), userName = entity.GetValue("UserName").ToString();

            SimpleProperty sUserID = new SimpleProperty("UserID", typeof(Int32));
            SimpleProperty sUserName = new SimpleProperty("UserName", typeof(string));

            result = new Entity(new TalentCloud.Base.Entities.PropertyCollection() { sUserID, sUserName });

            result.SetValue(sUserID, userID);
            result.SetValue(sUserName, userName);

            result.Add(new SimpleProperty("CurrentTime", typeof(DateTime)), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

            return result;
        }

        public EntityCollection GetData13(Entity entity)
        {
            string userID = entity.GetValue("UserID").ToString(), userName = entity.GetValue("UserName").ToString();

            SimpleProperty sUserID = new SimpleProperty("UserID", typeof(string));
            SimpleProperty sUserName = new SimpleProperty("UserName", typeof(string));
            SimpleProperty sCurrentTime = new SimpleProperty("CurrentTime", typeof(DateTime));
            SimpleProperty sUserAge = new SimpleProperty("UserAge", typeof(string));

            PropertyCollection propertyCollection = new PropertyCollection() { sUserID, sUserName, sCurrentTime };
            propertyCollection.Add(sUserAge);

            EntityCollection entityCollection = new EntityCollection(propertyCollection);

            Entity result = new Entity(propertyCollection);
            result.SetValue(sUserID, userID);
            result.SetValue(sUserName, userName);
            result.SetValue(sCurrentTime, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            result.SetValue(sUserAge, "男");
            entityCollection.Add(result);

            result = new Entity(propertyCollection);
            result.SetValue(sUserID, "1002");
            result.SetValue(sUserName, "李四");
            result.SetValue(sCurrentTime, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            result.SetValue(sUserAge, "女");
            entityCollection.Add(result);

            return entityCollection;
        }

        public User GetData14(string userID, string userName)
        {
            User user = new User();
            user.UserID = Convert.ToInt32(userID);
            user.UserName = userName;
            user.UserAge = "男";
            return user;
        }

        public User GetData15(User user)
        {
            User result = new User();
            result.UserID = user.UserID;
            result.UserName = user.UserName;
            result.UserAge = user.UserAge;
            return result;
        }

        public List<User> GetData16(string userID, string userName)
        {
            List<User> list = new List<User>();

            User user = new User();
            user.UserID = Convert.ToInt32(userID);
            user.UserName = userName;
            user.UserAge = "男";
            list.Add(user);

            user = new User();
            user.UserID = 1002;
            user.UserName = "李四";
            user.UserAge = "女";
            list.Add(user);

            return list;
        }
    }
}

点击“F五“运营效果如下图所示表达成功:

 [App.config]

lovebet爱博体育官网 5

<?xml version="1.0"?>
<configuration>
  <!-- 部署服务库项目时,必须将配置文件的内容添加到 
  主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
  <system.serviceModel>
    <!--配置服务节点Start-->
    <services>
      <service name="WCFLibray.Service1" behaviorConfiguration="MetadataBehavior">
        <!--服务地址-->
        <host>
          <!--基址,访问某服务地址的基址-->
          <baseAddresses>
            <add baseAddress="http://192.168.5.168:8123/Service1.svc/"/>
          </baseAddresses>
          <!--访问超时时间-->
          <timeouts />
        </host>
        <!--定义endpoint,指定地址(address),绑定(binding)以及协定(contract)-->
        <!-- 属性说明:
             address - 服务端地址,相对于baseAddress的相对地址,如果为空则为baseAddress,也可以设定为绝对地址
             binding - 绑定协议,系统的某一协议,basicHttpBinding,mexHttpBinding,wsHttpBinding等
             contract - 协议完全限定名(名称空间.类型名)
             name - 客户端代理类的构造方法中的endpointConfigurationName对应到这个name
             bindingConfiguration - 指定客户端binding的具体设置,指向<bindings>元素下同类型binding的name -->
        <endpoint binding="webHttpBinding" bindingConfiguration="webHttpBindingConfig" behaviorConfiguration="AspNetAjaxBehavior" contract="WCFLibray.IService1" />
      </service>
    </services>
    <!--配置服务节点End-->

    <!--配置行为节点Start-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="MetadataBehavior">
          <serviceThrottling maxConcurrentCalls="100000" maxConcurrentInstances="100000" maxConcurrentSessions="100000"/>
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点  -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="True"/>
          <!--maxItemsInObjectGraph指定要序列化或反序列化的最大项数-->
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>

      <!--ajax跨域配置Start-->
      <endpointBehaviors>
        <behavior name="AspNetAjaxBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <!--ajax跨域配置End-->
    </behaviors>
    <!--配置行为节点End-->

    <!--配置绑定节点Start-->
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingConfig" maxBufferPoolSize="524288000" maxReceivedMessageSize="65536000" crossDomainScriptAccessEnabled="true"
                 closeTimeout="01:10:00" openTimeout="01:10:00" sendTimeout="01:10:00" receiveTimeout="01:10:00" >
          <readerQuotas maxStringContentLength="65536000"  />
        </binding>
      </webHttpBinding>
    </bindings>
    <!--配置绑定节点End-->
  </system.serviceModel>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"></modules>
  </system.webServer>

</configuration>

二、IIS宿主

三、IIS宿主

  大家在第3节中,把WCF寄宿在IIS之上,在IIS中宿主二个劳动的基本点优点是在爆发客户端请求时宿主进程会被机关运营,并且你能够依据IIS来治本宿主进程的生命周期。在支付和使用的进程与Web
Service特别相像。

      
首先大家将WCF应用程序发表一下,然后安插在服务器的IIS之上,如下图所示:

、调整台应用程序宿主

lovebet爱博体育官网 6

  创设宿主

 

  (一)在解决方案下新建调节台出口项目 WCFHost_Console。

      
修改”WCFLibray.瑟维斯一.svc”文件名称为”Service一.svc”,鼠标右键浏览Service1.svc,在游览器中冒出如下图所示,表达服务配置成功。

  (2)添加 System.ServiceModel.dll 的引用。

lovebet爱博体育官网 7

  (三)加多 WCF 服务类库(WCFLibrary)的品种引用。

 

  (4)创设宿主程序,代码如下:

4、调控台应用程序宿主**
**

using System;
using WCFLibrary;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace WCFHost_Console
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建宿主的基地址
            Uri baseAddress = new Uri("http://localhost:8080/User");
            //创建宿主
            using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
            {
                //向宿主中添加终结点
                host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
                //将HttpGetEnabled属性设置为true
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                //将行为添加到Behaviors中
                host.Description.Behaviors.Add(smb);
                //打开宿主
                host.Open();
                Console.WriteLine("WCF中的HTTP监听已启动....");
                Console.ReadLine();
                host.Close();
            }
        }
    }
}

  (一)在化解方案下新建调控台出口项目
WcfByConsole。

(伍)运维宿主程序[在客户端调用时要先运维宿主程序],如下图所示:

  (2)添加 System.ServiceModel.dll
的引用。

lovebet爱博体育官网 8

  (3)加多 WCF
服务类库(WCFLibrary)的项目引用。

  表达宿主建设构产生功。在上例中用到”ServiceHost”类,这里只是轻松的利用,具体请查看“MSDN
ServiceHost”

  (肆)创制宿主程序,代码如下:

  确立客户端

namespace WcfByConsole
{
    static class Program
    {
        static List<ServiceHost> hostList = new List<ServiceHost>();
        static string[] serviceURLs;
        static string midServiceURL = ConfigurationManager.AppSettings["MidServiceURL"].TryString();

        static void Main()
        {
            try
            {
                StartAllConfiguredServices();
                Console.WriteLine("WCF 服务正在运行......");
                Console.WriteLine("输入回车键 <ENTER> 退出WCF服务");
                Console.ReadLine();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("Error : {0}", ce.Message);
            }
        }

        private static void StartAllConfiguredServices()
        {
            serviceURLs = midServiceURL.Split(',');
            Configuration conf = ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);

            ServiceModelSectionGroup svcmod = (ServiceModelSectionGroup)conf.GetSectionGroup("system.serviceModel");
            foreach (ServiceElement el in svcmod.Services.Services)
            {
                string eName = el.Name;
                string typeName = eName.Substring(0, eName.LastIndexOf('.'));
                Type svcType = Type.GetType(el.Name + "," + typeName);
                if (svcType == null)
                    throw new Exception("Invalid Service Type " + el.Name + " in configuration file.");
                OpenHost(svcType);
            }
        }

        private static void OpenHost(Type t)
        {
            List<Uri> uris = new List<Uri>();
            foreach (string url in serviceURLs)
            {
                Uri uri = new Uri(string.Format("{0}{1}.svc", url, t.Name));
                uris.Add(uri);
            }

            ServiceHost host = new ServiceHost(t, uris.ToArray());
            for (int j = 0; j < host.Description.Endpoints.Count; j++)
            {
                CorsEnabledServiceHost.AddPreflightOperations(host.Description.Endpoints[j]);
                host.Description.Endpoints[j].Behaviors.Add(new EnableCorsEndpointBehavior());
            }
            host.Open();

            hostList.Add(host);
        }
    }
}

  (一)重新创建化解方案–>Web应用程序项目。

 

  (二)加多对劳务的引用(在引用上右键–>输入我们定义的劳动宿主的集散地址(此处为:http://localhost:8080/User)–&gt;前往–&gt;确定),具体请看第一节。

 [app.config]

lovebet爱博体育官网 9

 

  (3)测试程序如下图所示表明成功(注意:一定要先运维我们的宿主程序才行,借使宿主未有展开的话会报错:出于目的计算机积极拒绝,不能连接。)。

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <!--中间层服务地址,注意,必须以/结尾-->
    <add key="MidServiceURL" value="http://192.168.5.168:8123/" />
  </appSettings>

  <system.serviceModel>
    <!--配置服务节点Start-->
    <services>
      <service name="WCFLibray.Service1" behaviorConfiguration="MetadataBehavior">
        <!--定义endpoint,指定地址(address),绑定(binding)以及协定(contract)-->
        <!-- 属性说明:
             address - 服务端地址,相对于baseAddress的相对地址,如果为空则为baseAddress,也可以设定为绝对地址
             binding - 绑定协议,系统的某一协议,basicHttpBinding,mexHttpBinding,wsHttpBinding等
             contract - 协议完全限定名(名称空间.类型名)
             name - 客户端代理类的构造方法中的endpointConfigurationName对应到这个name
             bindingConfiguration - 指定客户端binding的具体设置,指向<bindings>元素下同类型binding的name -->
        <endpoint binding="webHttpBinding" bindingConfiguration="webHttpBindingConfig" behaviorConfiguration="AspNetAjaxBehavior" contract="WCFLibray.IService1" />
      </service>
    </services>
    <!--配置服务节点End-->

    <!--配置行为节点Start-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="MetadataBehavior">
          <serviceThrottling maxConcurrentCalls="100000" maxConcurrentInstances="100000" maxConcurrentSessions="100000" />
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点  -->
          <serviceMetadata httpGetEnabled="True" />
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="True" />
          <!--maxItemsInObjectGraph指定要序列化或反序列化的最大项数-->
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
      <!--ajax跨域配置Start-->
      <endpointBehaviors>
        <behavior name="AspNetAjaxBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <!--ajax跨域配置End-->
    </behaviors>
    <!--配置行为节点End-->

    <!--配置绑定节点Start-->
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingConfig" maxBufferPoolSize="524288000" maxReceivedMessageSize="65536000" crossDomainScriptAccessEnabled="true" closeTimeout="01:10:00" openTimeout="01:10:00" sendTimeout="01:10:00" receiveTimeout="01:10:00">
          <readerQuotas maxStringContentLength="65536000" />
        </binding>
      </webHttpBinding>
    </bindings>
    <!--配置绑定节点End-->
  </system.serviceModel>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
    </modules>
  </system.webServer>

</configuration>

lovebet爱博体育官网 10

(五)运行宿主程序[在客户端调用时要先运转宿主程序],如下图所示:

  在这些示例中大家把Endpoint中的ABC,营地址,Behaviors等都直接写在了代码里,但实际选拔进度中都以去重视配置文件,为了相比较说明大家下边包车型大巴例子中会使用安插文件。

lovebet爱博体育官网 11

**四、Windows应用程序宿主 **

 

  创立宿主

  (一)在减轻方案下新建Windows窗体应用程序项目 WCFHost_Form。

  (2)添加 System.ServiceModel.dll 的引用。

  (三)增加 WCF 服务类库(WCFLibrary)的连串引用。

  (肆)增多应用程序配置文件App.config。

  (五)成立宿主程序MainForm窗体,并修改App.config,代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WCFLibrary.User">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8081/User"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>


using System;
using WCFLibrary;
using System.ServiceModel;
using System.Windows.Forms;
using System.Configuration;

namespace WCFHost_Form
{
    public partial class MainForm : Form
    {
        ServiceHost host;

        public MainForm()
        {
            InitializeComponent();
        }

        //应用程序加载
        private void MainForm_Load(object sender, EventArgs e)
        {
            host = new ServiceHost(typeof(User));
            //打开宿主
            host.Open();
            this.lblState.Text = "WCF中的HTTP监听已启动....";
        }

        //应用程序关闭
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            host.Close();
        }
    }
}

运作程序如下图所示:

lovebet爱博体育官网 12

  建构客户端

  同下面的Console程序一样,这里要引用的地址为:<add
baseAddress=”http://localhost:8081/User"/&gt;

  在那些例子中与Console应用程序分化的是,大家在Console配置是直接写在程序中的,而在本例中大家采纳的是安插文件,不一致在于壹旦写在计划文件中等射程序运营时直接到安插文件里抽取相关的布局节去成立ServiceHost类。

五、WAS宿主

  Windows 进程激活服务 (WAS)
概述
.aspx)  

  IIS七允许通过HTTP外的协议进行激活和互连网通信。此条件适合开垦可通过WCF帮衬的其余网络协议(包含http、net.tcp、net.pipe、net.msmq)实行通讯的WCF服务。安插简单、管理有利于,那个互联网协议在布署时可像Http同样,直接丢到IIS柒上就能够,大家在底下的例子中以net.tcp为协商为例。IIS7以下的本子只可以辅助Http的通讯。

  1、确定保证已设置IIS7的激活零部件

  在行使WAS宿主时,必须确定保障IIS七的激活零部件安装好。展开“调节面板”–>“展开或关闭Windows功用”–>“功用”,小编的机器上曾经安装过,如下图所示(WCF激活与非WCF激活):

lovebet爱博体育官网 13

  借使未有设置,点击“加多新职能”,然后勾选“WCF激活”,如下图所示:

lovebet爱博体育官网 14

  安装成功后我们展开IIS,点击“默许网址(任1个网站就可以)”–>“绑定”–>“增加”,在类型中会出现非IIS援助的此外品种。如下图所示

lovebet爱博体育官网 15

  表明安装成功。

  2、增多net.tcp的网址绑定

  在上图中,大家挑选连串net.tcp,然后在绑定音信中填入“80捌:*”,点击鲜明。

  3、开通net.tcp的协议 

  在安装成功还要在钦点的网址上绑定了net.tcp今后,大家还要开通.net.tcp协议,点击我们要计划WCF的网址,在IIS管理器的操作作用区有1项“高档设置”点击后出现如下图所示高端配置的窗体

lovebet爱博体育官网 16

  在启用的情商业中学加多net.tcp协议(原本只对http协议扶助,今后把tcp协议追加上去),中间用逗号隔断开,如上海体育场地所示。

  注意:那多少个步骤叁个也不可能少,不然会出现:“找不到独具绑定
NetTcpBinding 的终结点的与方案 net.tcp 相称的基址。注册的基址方案是
[http]
”的错误新闻。

   lovebet爱博体育官网,4、建构服务程序

  (一)在消除方案下新建WCF服务应用程序项目 WCFHost_WAS。

  (2)建立IUser与User,代码同例二同样。

  (三)修改配置文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpBindConfig">
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="MyBehavior" name="WCFHost_WAS.User">
        <endpoint address="" binding="netTcpBinding" contract="WCFHost_WAS.IUser" bindingConfiguration="netTcpBindConfig"></endpoint>
        <!--元数据交换的终结点-->
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" ></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior" >
          <serviceMetadata/>
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="6553600"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

(5)安插服务

  像任何的Web应用程序一样,把有关的文书丢到劳动器端内定目录就能够。

  鼠标右键浏览User.svc,如现如下所示:

lovebet爱博体育官网 17

  表明安排成功,如上所示的劳动地点为:net.tcp://服务器名/User.svc/mex

  (陆)创设客户端

  创建客户端也与任何的1致,如下图所示:

lovebet爱博体育官网 18

  我们那时候看客户端的安插文件:

<client>
      <endpoint address="http://localhost:8080/User" binding="wsHttpBinding"
        contract="WCFHost_Console.IUser" />
      <endpoint address="http://localhost:8081/User" binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IUser" contract="WCFHost_Form.IUser"
        name="WSHttpBinding_IUser">
        <identity>
          <userPrincipalName value="WIN-EOUTAA4CP4O\Administrator" />
        </identity>
      </endpoint>
      <endpoint address="net.tcp://win-eoutaa4cp4o/User.svc" binding="netTcpBinding"
        bindingConfiguration="NetTcpBinding_IUser" contract="WCFHost_WAS.IUser"
        name="NetTcpBinding_IUser" />
    </client>

我们在三个Web应用程序中调用了三种分化宿主的劳务。 

七、总结

  通过上边的多少个例子,大家兑现了调节台宿主、Form宿主、WAS宿主(基于TCP协议)的贯彻。在其实的支付进度中,不常候我们还有恐怕会用到基于Windows服务的宿主,但大很多份都利用IIS做宿主,方便、神速。

 

原著链接:http://www.cnblogs.com/iamlilinfeng/archive/2012/10/01/2706353.html

相关文章