练习 配置WCF服务

图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



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值