基于WCF通信的C/S系统快速开发框架的部分架构设计
基于WCF通信的C/S系统快速开发框架的部分架构设计
WCF合约部分代码:
四、ServiceHost类参考:
五、客户端调用WCF接口
开发框架代码参考:
一、WCF架构通信流程图 (WCF Communication Flow)
二、WCF层包含两个逻辑层:分别是WCF服务层,WCF客户端代理层。
WCF客户端代理层封装在CSFrameworkV5.WebRef.dll
三、WCF服务端代码参考
WCF接口和WCF合约代码列表。
WCF接口部分代码:
C# Code:
namespace CSFrameworkV5.WCFContract
{
[ServiceContract(Namespace = "http://www.csframework.com")]
public interface ICommonService
{
[OperationContract]
byte[] GetAttachedFiles(byte[] loginTicket, string docID);
[OperationContract]
byte[] GetBackupHistory(byte[] loginTicket, int topList);
[OperationContract]
byte[] GetBusinessTables(byte[] loginTicket);
//.....省略很多接口的代码.....
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
namespace CSFrameworkV5.WCFContract
{
[ServiceContract(Namespace = "http://www.csframework.com")]
public interface ICommonService
{
[OperationContract]
byte[] GetAttachedFiles(byte[] loginTicket, string docID);
[OperationContract]
byte[] GetBackupHistory(byte[] loginTicket, int topList);
[OperationContract]
byte[] GetBusinessTables(byte[] loginTicket);
//.....省略很多接口的代码.....
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
WCF合约部分代码:
C# Code:
namespace CSFrameworkV5.WCFContract.WCF_Class
{
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[WCF_ExceptionBehaviour(typeof(WCF_ExceptionHandler))]
public class CommonService : ICommonService
{
public byte[] GetAttachedFiles(byte[] loginTicket, string docID)
{
try
{
Loginer loginer = WebSecurity.ValidateLoginer(loginTicket);
DataTable data = new dalAttachFile(loginer).GetData(docID);
return ZipTools.CompressionDataSet(ServerLibrary.TableToDataSet(data));
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
}
public byte[] GetBackupHistory(byte[] loginTicket, int topList)
{
try
{
Loginer loginer = WebSecurity.ValidateLoginer(loginTicket);
DataTable data = new dalCommon(null).GetBackupHistory(topList);
return ZipTools.CompressionDataSet(ServerLibrary.TableToDataSet(data));
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
}
public byte[] GetBusinessTables(byte[] loginTicket)
{
try
{
Loginer loginer = WebSecurity.ValidateLoginer(loginTicket);
DataTable data = new dalCommon(loginer).GetBusinessTables();
return ZipTools.CompressionDataSet(ServerLibrary.TableToDataSet(data));
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
} //.....省略很多接口的代码.....
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
namespace CSFrameworkV5.WCFContract.WCF_Class
{
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[WCF_ExceptionBehaviour(typeof(WCF_ExceptionHandler))]
public class CommonService : ICommonService
{
public byte[] GetAttachedFiles(byte[] loginTicket, string docID)
{
try
{
Loginer loginer = WebSecurity.ValidateLoginer(loginTicket);
DataTable data = new dalAttachFile(loginer).GetData(docID);
return ZipTools.CompressionDataSet(ServerLibrary.TableToDataSet(data));
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
}
public byte[] GetBackupHistory(byte[] loginTicket, int topList)
{
try
{
Loginer loginer = WebSecurity.ValidateLoginer(loginTicket);
DataTable data = new dalCommon(null).GetBackupHistory(topList);
return ZipTools.CompressionDataSet(ServerLibrary.TableToDataSet(data));
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
}
public byte[] GetBusinessTables(byte[] loginTicket)
{
try
{
Loginer loginer = WebSecurity.ValidateLoginer(loginTicket);
DataTable data = new dalCommon(loginer).GetBusinessTables();
return ZipTools.CompressionDataSet(ServerLibrary.TableToDataSet(data));
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
} //.....省略很多接口的代码.....
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
四、ServiceHost类参考:
启动WCF服务器
C# Code:
/// <summary>
/// 启动WCF服务
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
//this.WriteLog("准备启动服务...");
Debugger.Launch(); //运行调试程序!!!必须
LogUserOperate.Write("准备启动服务...");
ServiceHost host = null;
//获取WCF服务清单s
List<Type> list = WCFServiceProvider.GetWCFServiceType();
foreach (Type type in list)
{
//this.WriteLog("准备启动服务..." + type.FullName);
try
{
//根据服务名称从app.config文件取URL地址
Uri address = new Uri(ConfigurationManager.AppSettings[type.Name]);
host = new ServiceHost(type, address);
Binding myBinding = WCFServiceProvider.CreateBinding(BindingType.NetTcpBinding);
host.AddServiceEndpoint(WCFServiceProvider.GetWCFInterfaceType(type), myBinding, address);
host.UnknownMessageReceived += Host_UnknownMessageReceived;
host.Closing += Host_Closing;
host.Faulted += Host_Faulted;
host.CloseTimeout = new TimeSpan(24, 0, 0);
host.Open();
//添加到服务列表
_HostList.Add(host);
LogUserOperate.Write("启动" + type.Name + "服务成功:" + address.AbsoluteUri);
}
catch (Exception ex)
{
LogUserOperate.Write("启动" + type.Name + "服务失败!" + ex.Message);
if (host != null) host.Abort();
}
host = null;//初始null,准备下一次实例化
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
/// <summary>
/// 启动WCF服务
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
//this.WriteLog("准备启动服务...");
Debugger.Launch(); //运行调试程序!!!必须
LogUserOperate.Write("准备启动服务...");
ServiceHost host = null;
//获取WCF服务清单s
List<Type> list = WCFServiceProvider.GetWCFServiceType();
foreach (Type type in list)
{
//this.WriteLog("准备启动服务..." + type.FullName);
try
{
//根据服务名称从app.config文件取URL地址
Uri address = new Uri(ConfigurationManager.AppSettings[type.Name]);
host = new ServiceHost(type, address);
Binding myBinding = WCFServiceProvider.CreateBinding(BindingType.NetTcpBinding);
host.AddServiceEndpoint(WCFServiceProvider.GetWCFInterfaceType(type), myBinding, address);
host.UnknownMessageReceived += Host_UnknownMessageReceived;
host.Closing += Host_Closing;
host.Faulted += Host_Faulted;
host.CloseTimeout = new TimeSpan(24, 0, 0);
host.Open();
//添加到服务列表
_HostList.Add(host);
LogUserOperate.Write("启动" + type.Name + "服务成功:" + address.AbsoluteUri);
}
catch (Exception ex)
{
LogUserOperate.Write("启动" + type.Name + "服务失败!" + ex.Message);
if (host != null) host.Abort();
}
host = null;//初始null,准备下一次实例化
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
五、客户端调用WCF接口
1.客户端使用透明代理机制创建WCF实例,然后调用接口方法存取数据。
2.开发框架预设使用net.tcp协议
3.调用WCF接口需要传入用户登陆信息,将对象转换为byte数组格式,提高系统安全性。
C# Code:
/// <summary>
/// 测试客户端访问WCF接口
/// </summary>
private void TestCommonService()
{
string uri = "net.tcp://localhost:8585/CommonService";
//创建透明代理
ICommonService svc = WCFInvokeContext.CreateWCFService<ICommonService>(uri, BindingType.NetTcpBinding);
try
{
(svc as ICommunicationObject).Open();//打开WCF通道
//模拟用户登陆信息
byte[] loginTicket = new byte[] { 22, 141, 34, 123, 55, 2, 23, 73, 22 };
//调用WCF接口
byte[] bs = svc.GetAttachedFiles(loginTicket, "PO201805130002");
//将byte数组转换为DataSet
DataSet ds = ZipTools.DecompressionDataSet(bs);
}
finally
{
(svc as ICommunicationObject).Close();//关闭通道
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
/// <summary>
/// 测试客户端访问WCF接口
/// </summary>
private void TestCommonService()
{
string uri = "net.tcp://localhost:8585/CommonService";
//创建透明代理
ICommonService svc = WCFInvokeContext.CreateWCFService<ICommonService>(uri, BindingType.NetTcpBinding);
try
{
(svc as ICommunicationObject).Open();//打开WCF通道
//模拟用户登陆信息
byte[] loginTicket = new byte[] { 22, 141, 34, 123, 55, 2, 23, 73, 22 };
//调用WCF接口
byte[] bs = svc.GetAttachedFiles(loginTicket, "PO201805130002");
//将byte数组转换为DataSet
DataSet ds = ZipTools.DecompressionDataSet(bs);
}
finally
{
(svc as ICommunicationObject).Close();//关闭通道
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
开发框架代码参考:
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网