练习 配置WCF服务

来源:互联网 发布:天干地支的简便算法 编辑:程序博客网 时间:2024/04/28 17:52

图1


1,OrderTrack.Windows.KZT  : 控制台应用 程序,用于调试 wcf服务端 接口问题,

2,OrderTrack.Windows.Service :  windows服务,可以发布到服务端,

怎么创建 windows 服务 ,可以参考   链接地址  wcf服务注册windows服务

3,FluentAdo.SqlServer   数据源适合wcf服务的那种调用方式,跟常用的调用sqlhelp 有很大区别。

4,WcfWebApplication   展示 客户端调用,

5,其它的 类库 分别 是  接口,实现,实体。


1,展示下 控制台应用程序配置


web.config配置

<?xml version="1.0" encoding="utf-8" ?><configuration>  <configSections>  </configSections>  <appSettings>    <add key="Travel"  value="Data Source=服务器名;Initial Catalog=xxx;User ID=帐号;Password=密码;Asynchronous Processing=True;MultipleActiveResultSets=True"/>    <add key="OrderTrackRouter"  value="Data Source=服务器名;Initial Catalog=数据库名;User ID=帐号;Password=密码"/>  </appSettings>  <connectionStrings>  </connectionStrings>  <system.serviceModel>    <behaviors>      <serviceBehaviors>        <behavior name="Wcf.MyBehaviorConfiguration">          <serviceMetadata httpGetEnabled="false" />          <serviceDebug includeExceptionDetailInFaults="false" />          <dataContractSerializer maxItemsInObjectGraph="2147483647" />        </behavior>      </serviceBehaviors>    </behaviors>    <bindings>            <!-- wcf协议 -->      <netTcpBinding>        <binding name="netTcpBinding_Mybinding"                   closeTimeout="00:10:00"                   openTimeout="00:10:00"                   receiveTimeout="00:10:00"                   sendTimeout="00:10:00"                   transactionFlow="false"                   transferMode="Buffered"                   transactionProtocol="OleTransactions"                   hostNameComparisonMode="StrongWildcard"                   listenBacklog="10"                   maxBufferPoolSize="2147483647 "                   maxBufferSize="2147483647 "                   maxConnections="10"                   maxReceivedMessageSize="2147483647 ">          <readerQuotas maxDepth="64" maxStringContentLength="2147483647 " maxArrayLength="2147483647 " maxBytesPerRead="4096" maxNameTableCharCount="16384" />          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />          <security mode="None"></security>        </binding>      </netTcpBinding>    </bindings>    <services>      <!--订单跟踪 -->      <service name="OrderTrack.DAL.OrderTrackRouter_Service">        <endpoint  address="net.tcp://127.0.0.1:6438/OrderTrack.DAL.OrderTrackRouter_Service"                   contract="OrderTrack.Interface.OrderTrackRouter_IService"                                                                          binding="netTcpBinding" bindingConfiguration="netTcpBinding_Mybinding"  />      </service>            <!-- RTX跟踪 -->      <service name="OrderTrack.DAL.RTXhistoryDAL">        <endpoint  address="net.tcp://127.0.0.1:5789/OrderTrack.DAL.RTXhistoryDAL"                  contract="OrderTrack.Interface.IRTXhistoryDAL"                    binding="netTcpBinding" bindingConfiguration="netTcpBinding_Mybinding"  />      </service>    </services>    <client>  </system.serviceModel></configuration>


注意事项:  1,wcf协议可以共用一个

                2,tcp服务端口部署到服务器,端口号不能重复重复之后,windows服务启动不了,会产生错误日志。出现服务启用不了,

                    修改 端口号,除了这个原因,还有别的原因也会导致服务启动不了。可以到事件查看器 查看对应错误,如:图2

  右键点击错误日志属性查看错误


using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using OrderTrack.DAL;/*    创建人 谈勇 2012-11-7 */namespace OrderTrack.Windows.Service.WCFService{    internal class RtxStartService    {        /// <summary>        /// 创建服务主机对象        /// </summary>        internal static ServiceHost serviceHost = null;        /// <summary>        /// 启动服务函数        /// </summary>        internal static void StartService()        {            if (serviceHost != null)            {                serviceHost.Close();            }            serviceHost = new ServiceHost(typeof(RTXhistoryDAL));            serviceHost.Open();        }        /// <summary>        /// 停止服务        /// </summary>        internal static void StopService()        {            if (serviceHost != null)            {                serviceHost.Close();                serviceHost = null;            }        }    }}

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Linq;using System.ServiceProcess;using System.Text;using OrderTrack.Windows.KZT.WCFService;namespace OrderTrack.Windows.KZT{    partial class WindowsService : ServiceBase    {        /// <summary>        /// 服务名称        /// </summary>        internal const string SERVICE_NAME = "WCFServiceHost";        protected static void WCFServiceHost_Start()        {            //订单跟踪服务启动            OrderTrackRouter_WCFService.StartService();            //rtx 服务启动            RtxStartService.StartService();        }        protected static void WCFServiceHost_Stop()        {            //调用服务停止函数           // WhetherStartService.StopService();            //rtx 服务关闭            //RtxStartService.StopService();        }        public WindowsService()        {            //InitializeComponent();            ServiceName = SERVICE_NAME;        }        protected override void OnStart(string[] args)        {            // TODO: 在此处添加代码以启动服务。            WCFServiceHost_Start();        }        protected override void OnStop()        {            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。            WCFServiceHost_Stop();        }        private static void RunAsConsole()        {            ///添加控制台TITLE             Console.Title = "我的地盘听我的";            WCFServiceHost_Start();            Console.ReadKey();  //不做控制台程序可以 修改成 Consolse.Read();         }        private static void RunAsService()        {            //Run(new WindowsService());            ServiceBase[] ServicesToRun;            ServicesToRun = new ServiceBase[] { new WindowsService() };            ServiceBase.Run(ServicesToRun);        }        public static void Main()        {            if (Environment.UserInteractive)            {                RunAsConsole();            }            else            {                RunAsService();            }        }    }}


图3, 服务配置


图4 ,wcf接口的实现


      <!-- RTX跟踪 -->
      <service name="OrderTrack.DAL.RTXhistoryDAL">
        <endpoint  address="net.tcp://127.0.0.1:5789/OrderTrack.DAL.RTXhistoryDAL"
                  contract="OrderTrack.Interface.IRTXhistoryDAL"
                    binding="netTcpBinding" bindingConfiguration="netTcpBinding_Mybinding"  />
      </service>

  注意看图 4 和 协议的配置 是有关联的。


总结一下,wcf配置一定要细心,监听和协议有一点不一样,那个客户端 调用 服务器 接口 是 ping 不通的。


5. 展示客户端调用


要下载个 wcf插件

ACorns.WCF.DynamicClientProxy   文件  可以用一个专门的类型去封装 那个 wcf插件文件包

客户端引用 只要拿 那个 dll文件就行。


总结:编写wcf接口服务 调用 设计的越简单越好,这样别人拿到你的接口 ,引用几个 dll文件。就能实现你接口的方法
完成对应功能。


客户端的web配置

<?xml version="1.0"?><!--  有关如何配置 ASP.NET 应用程序的详细信息,请访问  http://go.microsoft.com/fwlink/?LinkId=169433  --><configuration>  <connectionStrings />  <system.web>    <compilation debug="true" targetFramework="4.0" />    <authentication mode="Forms">      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />    </authentication>    <membership>      <providers>        <clear/>        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"             applicationName="/" />      </providers>    </membership>    <profile>      <providers>        <clear/>        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>      </providers>    </profile>    <roleManager enabled="false">      <providers>        <clear/>        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />      </providers>    </roleManager>  </system.web>  <system.webServer>     <modules runAllManagedModulesForAllRequests="true"/>  </system.webServer>  <!-- wcf 配置 begin-->  <system.serviceModel>    <bindings>      <netTcpBinding>        <binding name="netTcpBinding_Mybinding"                     closeTimeout="00:10:00"                     openTimeout="00:10:00"                     receiveTimeout="00:10:00"                     sendTimeout="00:10:00"                     transactionFlow="false"                     transferMode="Buffered"                     transactionProtocol="OleTransactions"                     hostNameComparisonMode="StrongWildcard"                     listenBacklog="10"                     maxBufferPoolSize="2147483647 "                     maxBufferSize="2147483647 "                     maxConnections="10"                     maxReceivedMessageSize="2147483647 ">          <readerQuotas maxDepth="64" maxStringContentLength="2147483647 " maxArrayLength="2147483647 " maxBytesPerRead="4096" maxNameTableCharCount="16384" />          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />          <security mode="None"></security>        </binding>      </netTcpBinding>    </bindings>    <client>      <!-- 订单跟踪 -->      <endpoint  address="net.tcp://127.0.0.1:6438/OrderTrack.DAL.OrderTrackRouter_Service" contract="OrderTrack.Interface.OrderTrackRouter_IService"                 binding="netTcpBinding" bindingConfiguration="netTcpBinding_Mybinding" name="orderTrack"/>      <!-- RTX跟踪 -->      <endpoint  address="net.tcp://127.0.0.1:5789/OrderTrack.DAL.RTXhistoryDAL" contract="OrderTrack.Interface.IRTXhistoryDAL"           binding="netTcpBinding" bindingConfiguration="netTcpBinding_Mybinding" name="rtxTrack"/>    </client>  </system.serviceModel>  <!-- wcf 配置  end--></configuration>


客户端后台调用 展示 追加RTX记录方法

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using Uzai.OrderTrack.Interface;using ACorns.WCF.DynamicClientProxy;using OrderTrack.DataEntities;namespace WcfWebApplication{    public partial class RTXTrackTest : System.Web.UI.Page    {        protected void Page_Load(object sender, EventArgs e)        {            RTXWcfNetTcp();        }        public void RTXWcfNetTcp()        {            IRTXhistoryDAL iwt = WCFClientProxy<IRTXhistoryDAL>.GetReusableFaultUnwrappingInstance("rtxTrack");            RTXhistory model = new RTXhistory();            model.orderType = TrackOrderEnum.MeteradJustable;            model.objorderModel.ordercode = "N23151234";            model.objorderModel.dateofDeparture = DateTime.Now;            model.objorderModel.Person = 2;            model.objorderModel.Child = 1;            model.objorderModel.productId = 4788;            model.objorderModel.productName = "菲律宾一日游";            model.objorderModel.prodcutPrice = 4888.88m;            model.objorderModel.OPAdminID = "581";            model.objorderModel.OPAdmin = "tanyong";            model.objorderModel.JDAdminID = "581";            model.objorderModel.JDAdmin = "tanyong";            string strResult = iwt.addRtxHostory(model);            Response.Write(strResult);        }    }}


//这个是rtxTrack是webConfig 协议的name



原创粉丝点击