练习 配置WCF服务

时间:2022-09-01 08:52:18

练习 配置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

练习 配置WCF服务

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


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();
}

}
}
}


练习 配置WCF服务图3, 服务配置


练习 配置WCF服务图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服务


要下载个 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