前后购买了N个WCF的书籍,中国人写书,就怕文字不够数一样,密密麻麻写了一大堆,又难看懂,又浪费时间,其实我们都想快速见效,文字太多看来看去看得头大、容易导致晕书症,建议出书的人多插图,少写字。
本文只做入门参考用,WCF服务器端注意事项
1:WCF服务器端配置文件如何写很关键、例如多个服务怎么一同发布?
2:如何用最简单的程序,把WCF服务器发布好?
3:配置文件如何配置,客户端才能正常引用已发布的服务?
其实这3个问题,是服务器端编写程序的核心关键问题,这解决了,就算是好入门了,接着可以深入某个问题了。
工程的效果图如下:
以下程序是启动WCF服务用的程序参考:
//
读取配置文件
Configuration configuration
=
ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);
ServiceModelSectionGroup serviceModelSectionGroup
=
(ServiceModelSectionGroup)configuration.GetSectionGroup(
"
system.serviceModel
"
);
//
开启每个服务
foreach
(ServiceElement serviceElement
in
serviceModelSectionGroup.Services.Services)
{
var serviceHost
=
new
ServiceHost(Assembly.Load(
"
DotNet.Service
"
).GetType(serviceElement.Name), serviceElement.Endpoints[
0
].Address);
serviceHost.Opened
+=
delegate
{ Console.WriteLine(
"
{0}
"
, serviceHost.BaseAddresses[
0
]); };
serviceHost.Open();
}
以下文件为 WCF的服务器端配置文件:
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
configuration
>
<
system.serviceModel
>
<
services
>
<
service name
=
"
DotNet.Service.BusinessCardService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/BusinessCardService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IBusinessCardService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.ExceptionService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ExceptionService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IExceptionService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.FileService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/FileService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IFileService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.FolderService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/FolderService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IFolderService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.ItemDetailsService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ItemDetailsService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IItemDetailsService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.ItemsService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ItemsService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IItemsService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.LoginService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/LoginService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.ILoginService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.LogService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/LogService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.ILogService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.MessageService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/MessageService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IMessageService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.ModuleService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ModuleService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IModuleService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.OrganizeService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/OrganizeService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IOrganizeService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.ParameterService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ParameterService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IParameterService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.PermissionAdminService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/PermissionAdminService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IPermissionAdminService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.PermissionService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/PermissionService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IPermissionService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.RoleService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/RoleService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IRoleService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.SequenceService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/SequenceService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.ISequenceService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.StaffService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/StaffService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IStaffService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.UserService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/UserService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IUserService
"
>
</
endpoint
>
</
service
>
<
service name
=
"
DotNet.Service.WorkReportService
"
behaviorConfiguration
=
"
Internet
"
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/WorkReportService/
"
binding
=
"
basicHttpBinding
"
contract
=
"
DotNet.IService.IWorkReportService
"
>
</
endpoint
>
</
service
>
</
services
>
<
behaviors
>
<
serviceBehaviors
>
<
behavior name
=
"
Internet
"
>
<
serviceMetadata httpGetEnabled
=
"
true
"
/>
</
behavior
>
</
serviceBehaviors
>
</
behaviors
>
</
system.serviceModel
>
</
configuration
>
接口文件参考:
//
------------------------------------------------------------
//
All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd.
//
------------------------------------------------------------
using
System.Data;
using
System.ServiceModel;
namespace
DotNet.IService
{
using
DotNet.Utilities;
///
<summary>
///
ILoginService
///
///
修改纪录
///
///
2009.04.15 版本:1.0 JiRiGaLa 添加接口定义。
///
///
版本:1.0
///
///
<author>
///
<name>
JiRiGaLa
</name>
///
<date>
2009.04.15
</date>
///
</author>
///
</summary>
[ServiceContract]
public
interface
ILoginService
{
///
<summary>
///
获得登录用户列表
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<returns>
数据表
</returns>
[OperationContract]
DataTable GetUserDT(BaseUserInfo userInfo);
///
<summary>
///
获得内部员工列表
///
</summary>
///
<param name="userInfo"></param>
///
<returns></returns>
[OperationContract]
DataTable GetStaffDT(BaseUserInfo userInfo);
///
<summary>
///
按唯一识别码登录
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="suid">
唯一识别码
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
用户实体
</returns>
[OperationContract]
BaseUserInfo LoginBySuid(BaseUserInfo userInfo,
string
suid,
out
string
statusCode,
out
string
statusMessage);
///
<summary>
///
按用户名登录
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="userName">
用户名
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
用户实体
</returns>
[OperationContract]
BaseUserInfo LoginByUserName(BaseUserInfo userInfo,
string
userName,
out
string
statusCode,
out
string
statusMessage);
///
<summary>
///
登录
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="userName">
用户名
</param>
///
<param name="password">
密码
</param>
///
<param name="ipAddress">
IP地址
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
登录实体类
</returns>
[OperationContract]
BaseUserInfo UserLogin(BaseUserInfo userInfo,
string
userName,
string
password,
out
string
statusCode,
out
string
statusMessage);
///
<summary>
///
操作员退出应用程序
///
</summary>
///
<param name="userInfo">
用户
</param>
[OperationContract]
void
OnExit(BaseUserInfo userInfo);
///
<summary>
///
检查在线状态(服务器专用)
///
</summary>
///
<returns>
离线人数
</returns>
[OperationContract]
int
ServerCheckOnLine();
///
<summary>
///
检查在线状态
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<returns>
离线人数
</returns>
[OperationContract]
int
CheckOnLine(BaseUserInfo userInfo);
///
<summary>
///
获取在线用户列表
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<returns>
数据表
</returns>
[OperationContract]
DataTable GetOnLineState(BaseUserInfo userInfo);
///
<summary>
///
设置密码
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="userIds">
被设置的用户主键
</param>
///
<param name="password">
新密码
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
影响行数
</returns>
[OperationContract]
int
SetPassword(BaseUserInfo userInfo,
string
[] userIds,
string
password,
out
string
statusCode,
out
string
statusMessage);
///
<summary>
///
修改密码
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="oldPassword">
原始密码
</param>
///
<param name="newPassword">
新密码
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
影响行数
</returns>
[OperationContract]
int
ChangePassword(BaseUserInfo userInfo,
string
oldPassword,
string
newPassword,
out
string
statusCode,
out
string
statusMessage);
}
}
服务实现参考:
//
------------------------------------------------------------
//
All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd.
//
------------------------------------------------------------
using
System;
using
System.Data;
using
System.Reflection;
namespace
DotNet.Service
{
using
DotNet.Business;
using
DotNet.DbUtilities;
using
DotNet.IService;
using
DotNet.Model;
using
DotNet.Utilities;
///
<summary>
///
ILoginService
///
///
修改纪录
///
///
2009.04.15 版本:1.0 JiRiGaLa 添加接口定义。
///
///
版本:1.0
///
///
<author>
///
<name>
JiRiGaLa
</name>
///
<date>
2009.04.15
</date>
///
</author>
///
</summary>
public
class
LoginService : System.MarshalByRefObject, ILoginService
{
#region
public void Load()
///
<summary>
///
加载服务层
///
</summary>
public
void
Load()
{
}
#endregion
#region
public DataTable GetUserDT(BaseUserInfo userInfo) 获得用户列表
///
<summary>
///
获得用户列表
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<returns>
数据表
</returns>
public
DataTable GetUserDT(BaseUserInfo userInfo)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
DataTable dataTable
=
new
DataTable(BaseStaffTable.TableName);
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
//
检查用户在线状态(服务器专用)
BaseUserManager userManager
=
new
BaseUserManager(dbHelper, userInfo);
userManager.CheckOnLine();
//
获取允许登录列表
string
[] names
=
new
string
[] { BaseUserTable.FieldEnabled, BaseUserTable.FieldDeleteMark};
Object[] values
=
new
Object[] {
1
,
0
};
dataTable
=
userManager.GetDT(names, values);
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
}
catch
(Exception ex)
{
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
dataTable;
}
#endregion
#region
public DataTable GetUserDT(BaseUserInfo userInfo) 获得内部职员列表
///
<summary>
///
获得内部职员列表
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<returns>
数据表
</returns>
public
DataTable GetStaffDT(BaseUserInfo userInfo)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
DataTable dataTable
=
new
DataTable(BaseStaffTable.TableName);
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
//
检查用户在线状态(服务器专用)
BaseUserManager userManager
=
new
BaseUserManager(dbHelper);
userManager.CheckOnLine();
//
获取允许登录列表
string
[] names
=
new
string
[]{BaseUserTable.FieldEnabled, BaseUserTable.FieldDeleteMark, BaseUserTable.FieldIsStaff};
Object[] values
=
new
Object[] {
1
,
0
,
1
};
dataTable
=
userManager.GetDT(names, values);
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
}
catch
(Exception ex)
{
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
dataTable;
}
#endregion
#region
public BaseUserInfo LoginBySuid(BaseUserInfo userInfo, string suid, out string statusCode, out string statusMessage) 按唯一识别码登录
///
<summary>
///
按唯一识别码登录
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="suid">
唯一识别码
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
用户实体
</returns>
public
BaseUserInfo LoginBySuid(BaseUserInfo userInfo,
string
suid,
out
string
statusCode,
out
string
statusMessage)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
BaseUserInfo returnUserInfo
=
null
;
statusCode
=
string
.Empty;
statusMessage
=
string
.Empty;
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
BaseUserManager userManager
=
new
BaseUserManager(dbHelper, userInfo);
//
先侦测是否在线
userManager.CheckOnLine();
//
再进行登录
returnUserInfo
=
userManager.LoginBySuid(suid, userInfo.IPAddress, userInfo.MACAddress,
out
statusCode);
statusMessage
=
userManager.GetStateMessage(statusCode);
//
登录时会自动记录进行日志记录,所以不需要进行重复日志记录
//
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
}
catch
(Exception ex)
{
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
returnUserInfo;
}
#endregion
#region
public BaseUserInfo LoginByUserName(BaseUserInfo userInfo, string userName, out string statusCode, out string statusMessage) 按用户名登录
///
<summary>
///
按用户名登录
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="userName">
用户名
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
用户实体
</returns>
public
BaseUserInfo LoginByUserName(BaseUserInfo userInfo,
string
userName,
out
string
statusCode,
out
string
statusMessage)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
BaseUserInfo returnUserInfo
=
null
;
statusCode
=
string
.Empty;
statusMessage
=
string
.Empty;
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
BaseUserManager userManager
=
new
BaseUserManager(dbHelper, userInfo);
//
先侦测是否在线
userManager.CheckOnLine();
//
再进行登录
returnUserInfo
=
userManager.LoginByUserName(userName, userInfo.IPAddress, userInfo.MACAddress,
out
statusCode);
statusMessage
=
userManager.GetStateMessage(statusCode);
//
登录时会自动记录进行日志记录,所以不需要进行重复日志记录
//
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
}
catch
(Exception ex)
{
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
returnUserInfo;
}
#endregion
#region
public BaseUserInfo UserLogin(BaseUserInfo userInfo, string userName, string password, out string statusCode, out string statusMessage) 用户登录
///
<summary>
///
用户登录
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="userName">
用户名
</param>
///
<param name="password">
密码
</param>
///
<param name="ipAddress">
IP地址
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
用户实体
</returns>
public
BaseUserInfo UserLogin(BaseUserInfo userInfo,
string
userName,
string
password,
out
string
statusCode,
out
string
statusMessage)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
BaseUserInfo returnUserInfo
=
null
;
statusCode
=
string
.Empty;
statusMessage
=
string
.Empty;
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
BaseUserManager userManager
=
new
BaseUserManager(dbHelper, userInfo);
//
先侦测是否在线
userManager.CheckOnLine();
//
再进行登录
returnUserInfo
=
userManager.Login(userName, password, userInfo.IPAddress, userInfo.MACAddress,
out
statusCode);
if
(returnUserInfo
!=
null
)
{
PermissionService permissionService
=
new
PermissionService();
returnUserInfo.IsAdministrator
=
permissionService.IsAdministratorByUser(dbHelper, userInfo, returnUserInfo.Id);
}
statusMessage
=
userManager.GetStateMessage(statusCode);
//
登录时会自动记录进行日志记录,所以不需要进行重复日志记录
//
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
}
catch
(Exception ex)
{
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
returnUserInfo;
}
#endregion
#region
public void OnExit(BaseUserInfo userInfo) 用户退出应用程序
///
<summary>
///
用户退出应用程序
///
</summary>
///
<param name="userInfo">
用户
</param>
public
void
OnExit(BaseUserInfo userInfo)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
BaseUserManager userManager
=
new
BaseUserManager(dbHelper, userInfo);
userManager.OnExit(userInfo.Id);
}
catch
(Exception ex)
{
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
}
#endregion
#region
public int ServerCheckOnLine() 服务器端检查在线状态
///
<summary>
///
服务器端检查在线状态
///
</summary>
///
<returns>
离线人数
</returns>
public
int
ServerCheckOnLine()
{
int
returnValue
=
0
;
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
BaseUserManager userManager
=
new
BaseUserManager(dbHelper);
returnValue
=
userManager.CheckOnLine();
}
catch
(Exception ex)
{
BaseInterfaceLogic.WriteException(ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
return
returnValue;
}
#endregion
#region
public int CheckOnLine(BaseUserInfo userInfo) 检查在线状态
///
<summary>
///
检查在线状态
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<returns>
离线人数
</returns>
public
int
CheckOnLine(BaseUserInfo userInfo)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
int
returnValue
=
0
;
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
BaseUserManager userManager
=
new
BaseUserManager(dbHelper);
//
设置为在线状态
userManager.OnLine(userInfo.Id);
returnValue
=
userManager.CheckOnLine();
}
catch
(Exception ex)
{
BaseInterfaceLogic.WriteException(ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
returnValue;
}
#endregion
#region
public DataTable GetOnLineState(BaseUserInfo userInfo) 获取在线用户列表
///
<summary>
///
获取在线用户列表
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<returns>
数据表
</returns>
public
DataTable GetOnLineState(BaseUserInfo userInfo)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
DataTable dataTable
=
new
DataTable();
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
BaseUserManager userManager
=
new
BaseUserManager(dbHelper, userInfo);
if
(MessageService.LaseCheck
==
DateTime.MinValue)
{
//
设置为在线状态
userManager.OnLine(userInfo.Id);
//
检查用户在线状态(服务器专用)
userManager.CheckOnLine();
MessageService.LaseCheck
=
DateTime.Now;
}
else
{
//
2008.01.23 JiRiGaLa 修正错误
TimeSpan timeSpan
=
DateTime.Now
-
MessageService.LaseCheck;
if
((timeSpan.Minutes
*
60
+
timeSpan.Seconds)
>=
BaseSystemInfo.OnLineCheck)
{
//
设置为在线状态
userManager.OnLine(userInfo.Id);
//
检查用户在线状态(服务器专用)
userManager.CheckOnLine();
MessageService.LaseCheck
=
DateTime.Now;
}
}
//
获取在线状态列表
dataTable
=
userManager.GetOnLineStateDT();
//
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
}
catch
(Exception ex)
{
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
dataTable;
}
#endregion
#region
public int SetPassword(BaseUserInfo userInfo, string[] userIds, string password, out string statusCode, out string statusMessage) 设置密码
///
<summary>
///
设置密码
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="userId">
被设置的职员主键
</param>
///
<param name="password">
新密码
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
影响行数
</returns>
public
int
SetPassword(BaseUserInfo userInfo,
string
[] userIds,
string
password,
out
string
statusCode,
out
string
statusMessage)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
statusCode
=
string
.Empty;
statusMessage
=
string
.Empty;
int
returnValue
=
0
;
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
BaseUserManager userManager
=
new
BaseUserManager(dbHelper, userInfo);
returnValue
=
userManager.BatchSetPassword(userIds, password,
out
statusCode);
//
获得状态消息
statusMessage
=
userManager.GetStateMessage(statusCode);
}
catch
(Exception ex)
{
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
returnValue;
}
#endregion
#region
public int ChangePassword(BaseUserInfo userInfo, string oldPassword, string newPassword, out string statusCode, out string statusMessage) 修改密码
///
<summary>
///
修改密码
///
</summary>
///
<param name="userInfo">
用户
</param>
///
<param name="oldPassword">
原始密码
</param>
///
<param name="newPassword">
新密码
</param>
///
<param name="statusCode">
返回状态码
</param>
///
<param name="statusMessage">
返回状消息
</param>
///
<returns>
影响行数
</returns>
public
int
ChangePassword(BaseUserInfo userInfo,
string
oldPassword,
string
newPassword,
out
string
statusCode,
out
string
statusMessage)
{
//
写入调试信息
#if
(DEBUG)
int
milliStart
=
BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
#endif
statusCode
=
string
.Empty;
statusMessage
=
string
.Empty;
int
returnValue
=
0
;
IDbHelper dbHelper
=
DbHelperFactory.GetHelper();
try
{
dbHelper.Open();
//
事务开始
//
dbHelper.BeginTransaction();
BaseLogManager.Instance.Add(dbHelper, userInfo, MethodBase.GetCurrentMethod());
BaseUserManager userManager
=
new
BaseUserManager(dbHelper, userInfo);
returnValue
=
userManager.ChangePassword(oldPassword, newPassword,
out
statusCode);
//
获得状态消息
statusMessage
=
userManager.GetStateMessage(statusCode);
//
事务递交
//
dbHelper.CommitTransaction();
}
catch
(Exception ex)
{
//
事务回滚
//
dbHelper.RollbackTransaction();
BaseExceptionManager.LogException(dbHelper, userInfo, ex);
throw
ex;
}
finally
{
dbHelper.Close();
}
//
写入调试信息
#if
(DEBUG)
BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
#endif
return
returnValue;
}
#endregion
}
}
WCF 客户端程序注意事项
1:如何不用一个个引用,用程序方式,实现各服务的灵活调用?
2:返回值的长度限制问题解决、如何进行设置?
3:客户端多个endpoint的定义如何设置?最少的配置文件写法?
以下是客户端的配置文件参考
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
configuration
>
<
system.serviceModel
>
<
client
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/BusinessCardService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IBusinessCardService
"
name
=
"
DotNet.Service.BusinessCardService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ExceptionService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IExceptionService
"
name
=
"
DotNet.Service.ExceptionService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/FileService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IFileService
"
name
=
"
DotNet.Service.FileService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/FolderService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IFolderService
"
name
=
"
DotNet.Service.FolderService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ItemDetailsService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IItemDetailsService
"
name
=
"
DotNet.Service.ItemDetailsService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ItemsService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IItemsService
"
name
=
"
DotNet.Service.ItemsService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/LoginService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.ILoginService
"
name
=
"
DotNet.Service.LoginService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/LogService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.ILogService
"
name
=
"
DotNet.Service.LogService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/MessageService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IMessageService
"
name
=
"
DotNet.Service.MessageService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ModuleService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IModuleService
"
name
=
"
DotNet.Service.ModuleService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/OrganizeService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IOrganizeService
"
name
=
"
DotNet.Service.OrganizeService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/ParameterService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IParameterService
"
name
=
"
DotNet.Service.ParameterService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/PermissionAdminService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IPermissionAdminService
"
name
=
"
DotNet.Service.PermissionAdminService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/PermissionService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IPermissionService
"
name
=
"
DotNet.Service.PermissionService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/RoleService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IRoleService
"
name
=
"
DotNet.Service.RoleService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/SequenceService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.ISequenceService
"
name
=
"
DotNet.Service.SequenceService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/StaffService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IStaffService
"
name
=
"
DotNet.Service.StaffService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/UserService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IUserService
"
name
=
"
DotNet.Service.UserService
"
></
endpoint
>
<
endpoint address
=
"
http://localhost:8888/DotNet.Service/WorkReportService/
"
binding
=
"
basicHttpBinding
"
bindingConfiguration
=
"
HTTP
"
contract
=
"
DotNet.IService.IWorkReportService
"
name
=
"
DotNet.Service.WorkReportService
"
></
endpoint
>
</
client
>
<
bindings
>
<
basicHttpBinding
>
<
binding name
=
"
HTTP
"
maxBufferPoolSize
=
"
2147483647
"
maxReceivedMessageSize
=
"
2147483647
"
>
</
binding
>
</
basicHttpBinding
>
</
bindings
>
</
system.serviceModel
>
</
configuration
>
以下是客户端调用服务器端代码的实现参考
//
------------------------------------------------------------
//
All Rights Reserved , Copyright (C) 2009 , Jirisoft , Ltd.
//
------------------------------------------------------------
using
System.ServiceModel;
namespace
DotNet.WCFClient
{
using
DotNet.IService;
///
<summary>
///
ServiceFactory
///
本地服务的具体实现接口
///
///
修改纪录
///
///
2009.09.20 版本:1.0 JiRiGaLa 创建。
///
///
版本:1.0
///
///
<author>
///
<name>
JiRiGaLa
</name>
///
<date>
2009.09.20
</date>
///
</author>
///
</summary>
public
class
ServiceFactory : IServiceFactory
{
public
ISequenceService CreateSequenceService()
{
ChannelFactory
<
ISequenceService
>
channelFactory
=
new
ChannelFactory
<
ISequenceService
>
(
"
DotNet.Service.SequenceService
"
);
ISequenceService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IUserService CreateUserService()
{
ChannelFactory
<
IUserService
>
channelFactory
=
new
ChannelFactory
<
IUserService
>
(
"
DotNet.Service.UserService
"
);
IUserService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
ILoginService CreateLoginService()
{
ChannelFactory
<
ILoginService
>
channelFactory
=
new
ChannelFactory
<
ILoginService
>
(
"
DotNet.Service.LoginService
"
);
ILoginService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
ILogService CreateLogService()
{
ChannelFactory
<
ILogService
>
channelFactory
=
new
ChannelFactory
<
ILogService
>
(
"
DotNet.Service.LogService
"
);
ILogService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IExceptionService CreateExceptionService()
{
ChannelFactory
<
IExceptionService
>
channelFactory
=
new
ChannelFactory
<
IExceptionService
>
(
"
DotNet.Service.ExceptionService
"
);
IExceptionService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IPermissionAdminService CreatePermissionAdminService()
{
ChannelFactory
<
IPermissionAdminService
>
channelFactory
=
new
ChannelFactory
<
IPermissionAdminService
>
(
"
DotNet.Service.PermissionAdminService
"
);
IPermissionAdminService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IOrganizeService CreateOrganizeService()
{
ChannelFactory
<
IOrganizeService
>
channelFactory
=
new
ChannelFactory
<
IOrganizeService
>
(
"
DotNet.Service.OrganizeService
"
);
IOrganizeService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IItemsService CreateItemsService()
{
ChannelFactory
<
IItemsService
>
channelFactory
=
new
ChannelFactory
<
IItemsService
>
(
"
DotNet.Service.ItemsService
"
);
IItemsService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IItemDetailsService CreateItemDetailsService()
{
ChannelFactory
<
IItemDetailsService
>
channelFactory
=
new
ChannelFactory
<
IItemDetailsService
>
(
"
DotNet.Service.ItemDetailsService
"
);
IItemDetailsService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IModuleService CreateModuleService()
{
ChannelFactory
<
IModuleService
>
channelFactory
=
new
ChannelFactory
<
IModuleService
>
(
"
DotNet.Service.ModuleService
"
);
IModuleService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IStaffService CreateStaffService()
{
ChannelFactory
<
IStaffService
>
channelFactory
=
new
ChannelFactory
<
IStaffService
>
(
"
DotNet.Service.StaffService
"
);
IStaffService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IRoleService CreateRoleService()
{
ChannelFactory
<
IRoleService
>
channelFactory
=
new
ChannelFactory
<
IRoleService
>
(
"
DotNet.Service.RoleService
"
);
IRoleService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IMessageService CreateMessageService()
{
ChannelFactory
<
IMessageService
>
channelFactory
=
new
ChannelFactory
<
IMessageService
>
(
"
DotNet.Service.MessageService
"
);
IMessageService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IFileService CreateFileService()
{
ChannelFactory
<
IFileService
>
channelFactory
=
new
ChannelFactory
<
IFileService
>
(
"
DotNet.Service.FileService
"
);
IFileService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IFolderService CreateFolderService()
{
ChannelFactory
<
IFolderService
>
channelFactory
=
new
ChannelFactory
<
IFolderService
>
(
"
DotNet.Service.FolderService
"
);
IFolderService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IParameterService CreateParameterService()
{
ChannelFactory
<
IParameterService
>
channelFactory
=
new
ChannelFactory
<
IParameterService
>
(
"
DotNet.Service.ParameterService
"
);
IParameterService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IPermissionService CreatePermissionService()
{
ChannelFactory
<
IPermissionService
>
channelFactory
=
new
ChannelFactory
<
IPermissionService
>
(
"
DotNet.Service.PermissionService
"
);
IPermissionService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
public
IBusinessCardService CreateBusinessCardService()
{
ChannelFactory
<
IBusinessCardService
>
channelFactory
=
new
ChannelFactory
<
IBusinessCardService
>
(
"
DotNet.Service.BusinessCardService
"
);
IBusinessCardService proxy
=
channelFactory.CreateChannel();
return
proxy;
}
}
}
程序的运行效果如下图:
以上的写法核心解决的问题有:
WCF服务器端、WCF客户端配置文件的正确写法。
多个服务的定义及调用方法。
用程序、接口的方式调用WCF服务,减少命名空间不同,无法正常调用远程WCF服务的问题,这样程序用最少的改动量,支持WCF技术了。
只要入门了,接下就是肯投入多少时间,在于研究什么细节问题了,铺平了入门的道路了,进入了轨道了,发展就快了。
C# ASP.NET 通用权限管理系统组件源码中WCF例子程序服务器端运行详细配置参考
C# ASP.NET 通用权限管理系统组件源码中WCF例子程序客户端运行详细配置参考