发明内容
为了解决以上技术问题,本发明提出了一种基于配置的超时分层控制方法。尤其适用于比较复杂的业务系统中对服务端请求的超时控制,能够满足复杂业务系统中对超时的个性化需求。
本发明的技术方案是:
该方法主要由客户端控制和服务端控制两部分组成。详细的控制方法的步骤如下:
步骤一:定义客户端控制的配置实体类。实体类的定义的信息包括产品级配置实体类和用户个性化配置实体类;
步骤二:配置对应的配置文件。基于步骤一定义的配置实体类,对配置文件进行超时的配置;
步骤三:超时控制服务的调用。超时控制服务的调用分为三种情况:使用定义功能点超时时间、使用默认模块超时时间和使用全局默认的超时时间;
步骤四:客户端超时配置的控制。对于客户端的超时配置的控制,配置分为用户级配置和产品级配置,如果存在用户级配置,优先级高于产品级配置;
步骤五:服务端超时配置的控制。根据定义好的规则,重新设置本次请求的服务端超时时间;
步骤六:根据配置,访问资源。根据步骤四和五设置的超时配置时间,对资源进行访问。
其中,产品级配置实体类和用户个性化配置实体类分别包括配置实体类和模块实体类;
其配置的实体类包含的属性为:配置节名称(SectionName),默认值(DefaultValue),模块配置集合(NamedElementCollection<ModuleConfig>)。其中模块实体类又包含的属性:关键应用默认值,属性集合。
进一步的,所述的配置对应的配置文件,配置文件包含两层配置文件:产品级配置(Configuration.config)和用户级配置(Configuration_User.config)。首先配置全局的默认值(DefaultValue),该值的作用是对于未配置的功能点,并且该功能点所属的模块也未进行配置时的超时时间,根据需要进行配置;模块的默认超时时间,是针对某一模块来说的默认值,如果在模块内部未配置对应功能点的超时时间,则本模块所有未配置的功能点的超时时间,都是本模块的默认时间;模块内部的功能点的超时时间,是为特殊识别的功能点准备的,以便满足其个别功能点需要个别配置的需求。以上配置都是对产品级配置文件来说明的,如果用户有个性化的配置,在用户配置文件中进行配置。在用户级配置文件存在的情况下,其各个配置的优先级:用户级的功能点配置>产品级的功能点配置>用户级的模块配置>产品及的模块配置>用户级全局默认配置>产品级全局默认配置。
进一步的,所述的超时控制服务的调用。超时控制服务的调用分为三种情况:使用定义功能点超时时间、使用默认模块超时时间和使用全局默认的超时时间。如果该功能点配置了自己的个性化超时时间,需要在调用请求之前,传入在配置文件中配置对应功能点的名称,以便超时配置组件在发送http请求时,根据名称获取其配置的超时时间;对于其他的功能点请求,则无需传入名称,超时控制模块会根据你所属的模块信息,如果配置了模块默认值,则按照默认值设置,如果未配置模块默认超时时间,则按照其全局默认值处理。
进一步的,所述的超时配置的主要处理逻辑,其主要的步骤包括以下几步:
1、用户请求服务端资源,调用超时配置服务;
2、判断该客户端是否存在用户配置,如果存在用户配置,则转入用户配置处理,如果不存在,则转入产品配置处理;
3、对于用户配置处理,查询其功能点的个性化配置,如果存在其配置,则直接返回,如果不存在,查询产品的功能点配置,如果存在,则直接返回;
4、查询模块配置,如果存在用户配置,则查询用户的模块配置,如果存在其个性化结果,则返回;如果不存在用户级模块配置,则查询产品级模块配置,如果存在,直接返回结果;
5、查询全局默认值,如果存在用户配置,则查询用户级全局默认值,存在则直接返回;如果不存在用户级全局默认值,则查询产品级全局默认值,返回查询结果。
进一步的,所述的服务端超时配置的控制。服务端实现了一个HttpModule的拦截,根据设置的客户端时间和web.config中配置的服务端超时时间,如果客户端超时时间-服务端超时时间>10,则将本次请求的服务端超时时间,设置为客户端超时时间,否则不设置,仍然使用web.config中配置的时间。
本方法基于微软企业库的配置管理机制,能够通过配置灵活的控制请求的超时时间,尤其对于业务复杂系统中对于请求的超时时间的个性化需求。该控制方法对于超时的控制分为两部分:客户端控制和服务端的控制,同时客户端又分为产品级和用户级的控制,同时每个级别又分为功能点、模块和全局的控制,通过以上的多层控制,满足了用户对于请求超时的不同粒度控制。
具体实施方式
下面对本发明的内容进行更加详细的阐述:
本发明的一种基于配置的超时分层控制方法,其具体操作步骤为:
步骤一:定义客户端控制的配置实体类。实体类的定义的信息包括产品级配置实体类和用户个性化配置实体类。
(1)配置实体类主要属性
[ConfigurationProperty("DefaultValue")]
[DisplayName("默认值")]
public string DefaultValue
{
get { return (string)this["DefaultValue"]; }
set { this["DefaultValue"] = value; }
}
[ConfigurationProperty("Modules")]
public NamedElementCollection<ModuleConfig> ModuleConfigs
{
get { return (NamedElementCollection<ModuleConfig>)base["Modules"]; }
set { base["Modules"] = value; }
}
(2)模块实体类主要属性
[ConfigurationProperty("DefaultValue", IsRequired = true)]
[DisplayName("关键应用默认值")]
public string DefaultValue
{
get { return (string)this["DefaultValue"]; }
set
{
DataValidator.CheckForBlankString(value, "DefaultValue");
this["DefaultValue"] = (object)value;
this.Name = value;
}
}
步骤二:配置对应的配置文件。基于步骤一定义的配置实体类,对配置文件进行超时的配置;
<RequestTimeout DefaultValue="0">
<Modules>
<add name="模块名称" DefaultValue="120">
<TimeoutConfigs>
<add PropertyName="功能点名称1" Value="180" name="功能点名称1" />
<add PropertyName="功能点名称2" Value="300" name="功能点名称2" />
</TimeoutConfigs>
</add>
</Modules>
</RequestTimeout>
步骤三:超时控制服务的调用。超时控制服务的调用分为三种情况:使用定义功能点超时时间、使用默认模块超时时间和使用全局默认的超时时间;
步骤四:客户端超时配置的控制。对于客户端的超时配置的控制,配置分为用户级配置和产品级配置,如果存在用户级配置,优先级高于产品级配置。其提供的服务端接口如下:
/// <summary>
/// 根据动作名称,获取超时时间 单位:毫秒
/// </summary>
/// <param name="moduleName">模块名称</param>
/// <param name="timeoutConfigKey">动作名称</param>
/// <returns>超时时间</returns>
public int GetRequestTimeout(string moduleName, stringtimeoutConfigKey = "")
步骤五:服务端超时配置的控制。根据定义好的规则,重新设置本次请求的服务端超时时;
public class RequestTimeoutHandler: IHttpModule
{
public void Init(HttpApplication context)
private void context_BeginRequest(object sender, EventArgs e)
}
步骤六:根据配置,访问资源。根据步骤四和五设置的超时配置时间,对资源进行访问。