月度归档:2016年06月

ALI SPAM

资料来源于阿里, 备份供查阅:

--------------------------------------------

 

企业邮箱发送IP被反垃圾邮件组织屏蔽后的解封步骤!

      当邮件发送方服务器的IP被国际反垃圾邮件组织屏蔽后解除封锁的步骤首先要做的事:

1、所做测试均在问题服务器上进行。

2、确认问题服务器的IP(或整个IP段)不在SBL、RBL、CBL中

     关于国际黑名单查询,您可以在这里:
http://www.dnsstuff.com/tools/ip4r.ch?ip=(您的IP)  或http://www.kloth.net/services/dnsbl.php (推荐使用)进行查询。

     其他应用范围较广泛的黑名单组织网站:

                                                  
http://www.spamhaus.org/sbl/index.lasso

                                                  
http://www.spamhaus.org/xbl/index.lasso

                                                  
http://www.spamcop.net/bl.shtml

                                                  
http://anti-spam.org.cn/services/rbl.php

                                                 
http://www.senderbase.org/search?page=senders

                                                  
http://openrbl.org/



        如果您很不幸的列在上述组织的黑名单中,那您就需要向他们申请解封。(全英文的,填申请资料过程很繁琐)

一般48小时内给予答复,若这个时间内您的邮件服务器依然向外发送垃圾邮件,而他们又接到举报,他们会在1小时之内把您Blocked 掉

3、确认发信域名能够解析,且问题服务器上设置的域名在有效期内并可正常使用。

4、在问题邮件服务器上完成测试

5、查看自己域名的MX记录

6、TELNET命令测试



    

根据返回的错误代码判断

3.1  错误代码:450 4.7.1 Client host rejected: cannot find your hostname

错误原因:对方服务器未设置反向解析

处理方式:请联络IDC进行处理。

可参考中国互联网协会反垃圾中心提供的设置方式:
http://www.anti-spam.cn/ShowArticle.php?id=2269

3.2   错误代码:450 4.7.1 Helo command rejected: Host not found

错误原因:对方服务器在HELO命令中提供的域名不能被解析

处理方式:请检查其HELO命令提供的域名信息,且保证其符合RFC1035国际标准的规定。

3.3  错误代码:504 5.5.2 Helo command rejected: need fully-qualified hostname

错误原因:对方服务器的HELO信息不是完整的域名

处理方式:请检查HELO命令提供的域名信息,且保证其符合RFC1035国际标准的规定。

3.4   错误代码:501 5.5.2 Helo command rejected: Invalid name

错误原因:对方服务器的HELO信息包含非法的字符

处理方式:RFC规定,HELO命令提供的信息不得包含中文字符。

请对方按照RFC1035国际标准规定,对其HELO信息设置进行修改。

3.5  错误代码:554 5.7.1 Recipient address rejected: Dynamic IP

错误原因:对方服务器使用动态IP


理方式:请对方查看中华人民共和国信息产业部令第38号《互联网电子邮件服务管理办法》中的第四条:第四条  
提供互联网电子邮件服务,应当事先取得增值电信业务经营许可或者依法履行非经营性互联网信息服务备案手续。未取得增值电信业务经营许可或者未履行非经营性
互联网信息服务备案手续,任何组织或者个人不得在中华人民共和国境内开展互联网电子邮件服务。

3.6   错误代码:554 5.7.1 Service unavailable;

错误原因:对方服务器IP被国际权威的反垃圾组织列入黑名单

处理方式:请对方访问
http://www.dnsstuff.com/tools/ip4r.ch?ip=查询并申请解封。解封后即恢复正常。



7 最后将退信,TELNET测试结果,已经公司信息等要求的内容发送给相对应的组织,又是用英文邮件,对方如果审核解除后会给您回复邮件,一般您收到邮件后即可恢复正常。

Adf.Cs 使用 Adf.RegistryServer

参阅:

Adf.cs

http://www.xiaobo.li/adf/513.html

Adf.RegistryServer

http://www.xiaobo.li/adf/516.html

 

客户端支持, 配置模式及注册中心模式

两种模式使用方式完全一致,仅配置节定义区别,如下:

 

配置模式:

<section name="TestServer" type="Adf.Config.IpGroupSection,Adf"/>

 

注册中心模式:

<section name="TestServer" type="Adf.Cs.CsRegistrySection,Adf.Cs"/>

 

完整配置参考:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="TestServer" type="Adf.Config.IpGroupSection,Adf"/>
    <!--<section name="TestServer" type="Adf.Cs.CsRegistrySection,Adf.Cs"/>-->
  </configSections>
  <appSettings>
    <add key="Log:Path" value="c:\Logs\Adf.Cs\TestClient"/>
    <!-- 日志刷新时间间隔(秒) -->
    <add key="Log:FlushInterval" value="10"/>
    <!-- 日志禁用 -->
    <!--<add key="Log:Disabled" value="all"/>-->
  </appSettings>
  <!-- Servers -->
  <TestServer>
    <!--<add ip="127.0.0.1" port="200"/>-->
    <add ip="127.0.0.2" port="4562"/>
    <add ip="127.0.0.3" port="4562"/>
    <add ip="127.0.0.4" port="4562"/>
  </TestServer>
</configuration>

.

Adf.RegistryServer 应用

应用及安装文章:

http://www.xiaobo.li/adf/516.html

 

安装完成后,通过以下方式调用:

以此配置为例: 

<!-- 服务监听IP,不指定默认本机接口 -->
<add key="ServiceMonitorIp" value="127.0.0.1"/>
<!-- 服务监控端口 -->
<add key="ServiceMonitorPort" value="200"/>

 

主机地址: http://127.0.0.1:200

 

注册一个主机到组:

HTTP POST:            http://127.0.0.1:200?action=register

POST DATA:

{
    "group":"group name",        //register group name
    "host":"ip",
    "port":0
    "custom attr1":""        //custom attribute 1
    "custom attr2":""        //custom attribute 2
        ...
    "custom attrN":""        //custom attribute N
}

 

获取一组注册主机:

HTTP GET:             http://127.0.0.1:200?action=get&group={group name}

 

 

Adf.Service

通过 Adf.Service 嵌入,可简单实现一个 .Net 项目的 windows 服务

 

下载:

Adf.Service        http://www.aooshi.org/adf/download/Adf.Service.1.3.zip


源码:

http://www.aooshi.org/adf


应用:

1. 创建控制台应用程序, 版本2.0或以上
2. 引用: adf.dll, adf.service
3. 修改:  Program为共公public访问符
4. Program 继承Adf.Service.IService, Main 函数调用 Adf.Service.ServiceHelper.Entry(args);
5. 建立:  app.config 文件,并配置 ServiceMonitorPort
6. 复制 Tool*.bat 并修改Adf.Service.Test为你的应用程序

Program.cs 参考:

using System;
using System.Collections.Specialized;

namespace Adf.Service.Test
{
    /// <summary>
    /// 程序入口
    /// </summary>
    public class Program : IService
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Adf.Service.ServiceHelper.Entry(args);
        }

        public void Initialize(ServiceContext serviceContext)
        {
            //注册当前服务至注册中心
            //serviceContext.MonitorToRegistry();
        }

        public void Start(ServiceContext serviceContext)
        {
            serviceContext.Logger.Message.WriteLine("My Service Start");
        }

        public void Stop(ServiceContext serviceContext)
        {
            serviceContext.Logger.Message.WriteLine("My Service Stop");
        }

        public System.Net.HttpStatusCode HttpAction(string action, ServiceContext serviceContext, HttpServerContext httpServerContext)
        {
            serviceContext.Logger.Message.WriteLine("httpaction:" + httpServerContext.Url);
            return System.Net.HttpStatusCode.OK;
        }


        public string Status(ServiceContext serviceContext, NameValueCollection queryString)
        {
            return string.Empty;
        }

        public void Dispose()
        {

        }
    }
}

配置参考:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="cluster" type="Adf.Config.IpGroupSection,Adf"/>
    <section name="Registry" type="Adf.Config.IpGroupSection,Adf"/>
    <section name="Authorization" type="System.Configuration.DictionarySectionHandler" />
  </configSections>
  <appSettings>

    <!-- 服务监控IP,不配置则仅本机可浏览 -->
    <!--<add key="ServiceMonitorIp" value="*"/>-->
    
    <!-- 服务监控端口 -->
    <add key="ServiceMonitorPort" value="8456"/>
     <!--日志刷新值--> 
    <add key="Log:FlushInterval" value="10"/>
    <!-- 日志路径 -->
    <add key="Log:Path" value="c:\log\adf.service"/>   

    <!-- 禁止安装完成后自动启动 -->
    <!--<add key="ServiceInstalledStart" value="false"/>-->

    <!-- 服务使用的帐户,默认: LocalSystem, 还可系统帐户 LocalService,NetworkService 系统帐户时不配置密码, 自建帐户需配置密码 --> 
    <!--<add key="ServiceUsername" value=""/>-->
    <!--<add key="ServicePassword" value=""/>-->
    
    <!-- 本服务依赖的服务清单,多个以半角分号隔开 -->
    <!--<add key="ServiceDepended" value="server1;server2;server3"/>-->
  </appSettings>

  <!-- Cluster Check Interval, seconds,default 10 -->
  <!--<cluster check="1">
    <add ip="127.0.0.1" port="8456" level="1" />
    <add ip="127.0.0.2" port="8456" />
    <add ip="127.0.0.3" port="8456" />
  </cluster>-->

  <!-- Registry Server List, check is register period,  suggest: ip use dns name  -->
  <!--<Registry check="60">
    <add ip="127.0.0.1" port="200" />
  </Registry>-->

  <!-- 允许访问的用户名及密码 -->
  <!--<Authorization>
    <add key="username1" value="password" />
    <add key="username2" value="password" />
  </Authorization>-->
  
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

 

调试:

调试配置

1、 右键项目->属性->调试->命令行参数->输入 /c

如图:

点击查看原图

配置完成后按 F5 启动应用

 

监控面板:

此服务自带监控面板

http://ServiceMonitorIp:ServiceMonitorPort /

示例: http://127.0.0.1:8456

 

 

其它:

服务应用成功后, 在Start 方法中初始化一个Adf.Cs.ServerListen 可以搭建一个Cs项目

CS 应用参考 :http://www.xiaobo.li/adf/513.html

参考:

Adf.Cs.ServerListen listen;
public void Start(Adf.Service.ServiceContext serviceContext)
{
    this.listen = new Adf.Cs.ServerListen(serviceContext.Logger);
    //是否自动注册到注册中心
    if (serviceContext.Registry.Enable)
    {
        var node = new Dictionary<string, object>();
        node.Add("group", serviceContext.Setting.ServiceName);
        node.Add("port", this.listen.Port);

        serviceContext.Registry.RegisterNode(node);
    }
}
public void Stop(Adf.Service.ServiceContext serviceContext)
{
    this.listen.Dispose();
}

 

 

 

 

Adf.RegistryServer Install

Adf.RegistryServer 是一个常规主机注册服务

 

下载:

http://www.aooshi.org/adf/download/Adf.RegistryServer.1.0.zip

源代码:

http://www.aooshi.org/adf/

 

安装:

下载后解压

点击目录下 ToolInstallService.bat 进行安装

非管理员时请点击右链选择”以管理员运行“

 

配置说明:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="Authorization" type="System.Configuration.DictionarySectionHandler" />
  </configSections>
  <appSettings>
    <!-- 服务监听IP,不指定默认本机接口 -->
    <!--<add key="ServiceMonitorIp" value="127.0.0.1"/>-->
    <!-- 服务监控端口 -->
    <add key="ServiceMonitorPort" value="200"/>
    <!-- 日志存储路径 -->
    <add key="Log:Path" value="C:\Logs\Adf.RegistryServer"/>
    <!-- 日志刷新时间间隔(秒) -->
    <add key="Log:FlushInterval" value="10"/>
    <!-- 检查周期(秒) -->
    <add key="InspectInterval" value="5"/>
    <!-- 检测成功上线阀值 -->
    <add key="UpThreshold" value="3"/>
    <!-- 检测失败下线阀值 -->
    <add key="DownThreshold" value="3"/>
    
  </appSettings>
  <!-- 允许访问的用户名及密码 -->
  <!--<Authorization>
    <add key="username1" value="password" />
    <add key="username2" value="password" />
  </Authorization>-->
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

参数 ServiceMonitorIp 数默认注释掉,仅本机可加接, 若需其它主机能连接 打开配置并设置值为  *

<add key="ServiceMonitorIp" value="*"/>

 

授权:

默认配置不开启授权, 需要授权时,配置  Authorization 节点,填写相应的帐户名或密码

 

监控面板:

http://host:port/

ServiceMonitorPort 端口默认: 200

示例: http://127.0.0.1:200


点击查看原图

应用参考:

http://www.xiaobo.li/adf/518.html

.

 

License

 

GNU General Public License

GNU General Public License (GPL)的可能是开源项目最常用的许可证。GPL赋予和保证了开源项目开发者广泛的权利。基本上,它允许用户合法复制,分发和修改软件。 这意味着你可以:

  • 复制软件

    复制软件到自己的服务器,客户端的服务器,你自己的电脑,几乎任何你想要的地方,而且没有数量限制。

  • 发布软件

    发布你想要的软件,例如,在你的网站提供下载链接,刻成光盘,打印出来等等。

  • 收取费用

    如果你想在向别人提供软件时收费,如设置在别人的网站上或者其他用途时。GPL允许你这么做,但是你必须给客户提供一个GPL副本,告诉 他们可以在其他地方得到免费版本。当然最好在此之前,告诉客户,你为什么收费。

  • 可以任意修改

    如果你想添加或删除功能,没问题。如果想在其他项目中使用部分代码,也是可以的,但是唯一的限制是此项目也必须按GPL发布。

商业软件不能使用GPL协议的代码。

GNU Lesser General Public License


有另一个GNU License:GNU Lesser General Public License
(LGPL)。比起GPL它授予的权限较少。一般来说,LGPL比较适合连接到非GPL或者非开源文件的库文件。由于GPL的规定,使用到部分GPL代码
的软件,必须也使用GPL,开发人员不能使用GPL来开发收费软件或者专有软件。LGPL则没有这方面的要求,不要求使用与部分代码相同的
License。

商业软件可以使用,但不能修改LGPL协议的代码。

BSD License

BSD
License与其他自由软件License相比,如GPL,限制更少。但是请注意到BSD License两种版本之间的差别:New BSD
License/Modified BSD License 和Simplified BSD License/FreeBSD
License。它们两者都是于GPL兼容的自由软件License。

New
BSD License (”3-clause license”)
可以用于任何作为版权声明和保证许可的免责声明的目的,可以通过无限长的再分发来得以维持,也就是说如果再发布的产品中包含源代码,则在源代码中必须带有
原来代码中的BSD协
议。它还有一个特殊限制条款,不用特别的许可就是限制使用派生工作的工作者名字,也就是说不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

New BSD License和Simplified BSD License的主要区别是,后者忽略了非认可条款。

商业软件可以使用,也可以修改使用BSD协议的代码。

MIT License

MIT是和BSD一样宽松的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二 进制发布的还是以源代码发布的。

  • 你可以使用,复制和修改软件
  • 你可以免费使用软件或出售
  • 唯一的限制是,它是必须附有MIT授权协议

商业软件可以使用,也可以修改MIT协议的代码,甚至可以出售MIT协议的代码。

Mozilla Public License 1.1

Mozilla
Public License 1.1
(MPL)协议允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起者。这种授权维护了商业软件的利益,,它要求基于这种软件得修改无偿贡献
版权给该软件。这样,围绕该软件得所有代码得版权都集中在发起开发人得手中。但MPL是允许修改,无偿使用得。MPL软件对链接没有要求。

商业软件可以使用,也可以修改MPL协议的代码,但修改后的代码版权归软件的发起者。

Common Development and Distribution License

CDDL(Common
Development and Distribution License,通用开发与销售许可)开源协议,是MPL(Mozilla Public
License)的扩展协议,它允许公共版权使用,无专利费,并提供专利保护,可集成于商业软件中,允许自行发布许可。

商业软件可以使用,也可以修改CDDL协议的代码。

Apache License

Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布 (作为开源或商业软件)。需要满足的条件:

  • 需要给代码的用户一份Apache License。
  • 如果你修改了代码,需要在被修改的文件中说明。
  • 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
  • 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache License。你可以在Notice中增加自己的许可,但不可以表现为对Apache License构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

商业软件可以使用,也可以修改使用Apache协议的代码。

Eclipse Public License

Eclipse Public License(EPL)是一个与CPL相类似的许可证,任何扩展自Eclipse源码的代码也必须是开源的。

Creative Commons

Creative Commons(CC)的许可证不太开放源代码授权,它们通常用于设计项目。 CC许可证有着宽广的定义,每个定义都会授予一定的权利。它有四个基本部分,可以单独或者组合使用。下面是部分概述:

  • 署名

    作者必须是作品的原创者。 除此之外,作品可以修改,分发,复制和以其他方式使用。

  • 相同方式共享

    工作可以修改,分发等等,但必须在一个许可证下。

  • 非商业

    可以修改,分发等,但不用于商业目的。 关于什么是“商业”,说法比较含糊(没有提供明确的定义),因此您可能需要在自己的项目中澄清这一点。

  • 禁止修改

    这意味着您可以复制和分发许可工作,但你不能以任何方式修改,或在原有的基础开发。

商业软件的使用要遵从CC协议的具体规定,最严格的许可证将是“署名,非商业,不能修改”的授权。这意味着你可以自由 共享的工作,但不能改变它,你必须把它归功于原创者。

Common Public License 1.0

Common许可证有一些细节性的规定值得参考:

  • 明确了专利授权。一般的开源软件都明确源代码的版权人将自己的修改权、复制权等版权权利向公众许可,但保留署名权,而Common许可证在此基础上还明确 假如源代码中含有专利权,源代码专利权人将复制、使用的专有权利向公众许可。
  • 规定可以将源代码及修改过的源代码与其他类型的不受本许可证约束的代码结合,以新产品的形式发布,只要其中经该许可证获得的源代码及修改过的源代码能按该 许可证的要求发布即可。
  • 细化了该许可证终止的情形,包括发生专利侵权诉讼。
  • 明确了一个独立承担责任的原则,就是假如按该许可证使用源代码的使用者将获得的源代码应用于商业使用,那么他就要对在商业应用中出现的由于使用该源代码程 序而产生的侵权诉讼承担完全责任。这一条规定是比较特殊的,绝大多数开源软件许可证都不这么要求。

商业软件可以使用,也可以修改Common协议的代码,但要承担代码产生的侵权责任。

Links:
http://www.gnu.org/licenses/gpl.html
https://www.codeproject.com/info/Licenses.aspx
https://opensource.org/licenses

队列应用的一些场景

注:以下内容收集于网络:

主题订阅典型产品架构:

点击查看原图

队列模式经典产品架构:

点击查看原图

典型场景之抢红包:

点击查看原图

 

架构描述: 利用消息服务的队列模型,作为抽奖和发放红包高并发场景的缓冲。利用海量消息堆积能力和消息必达的特性。解决业务高并发下的超卖,漏单等常见问题

适用场景描述: 海量商品库数据离线计算后,结果数据准确无误的推送业务系统;抽奖出现促销活动场景,海量高并发订单下单支付,如何防止漏单和超卖

架构优势: 实现负责业务系统之间的解耦,并弹性可扩展

 

典型场景之定时任务

点击查看原图

架构描述: QUEUE作为订单到支付之间的核心处理模块,简化秒杀原本系统需要考虑峰值并发的技术架构。消息延时发送和VIP插队机制,能保障特定用户的特定业务规则

适用场景: 团购,秒杀,促销活动等业务

 

 

 

adf.cs

使用方法简介:

    下载及源码: http://www.aooshi.org/adf

 

项目添加引用:

Adf.dll

Adf.Cs.dll

protobuf-net.dll

三个程序集

 

创建通信接口,示例:

注: 不能含有泛型成员,不能是嵌套类型(类中类)

/// <summary>
/// 业务接口
/// </summary>
public interface ITest
{
    /// <summary>
    /// 告知服务器客户端时间
    /// </summary>
    /// <param name="time"></param>
    /// <returns></returns>
    bool NotifyTime(DateTime time);

    /// <summary>
    /// 返回一个指定SIZE的数组
    /// </summary>
    /// <param name="size"></param>
    /// <returns></returns>
    int[] GetArray(int size);

    /// <summary>
    /// 获取一个分页数据,并指定pageindex,pagesize参数做为hash键
    /// </summary>
    /// <param name="pageindex"></param>
    /// <param name="pagesize"></param>
    /// <param name="totalcount"></param>
    /// <returns></returns>
    [ClientHashKey("pageindex", "pagesize")]
    int[] GetDatas(int pageindex,int pagesize, out int totalcount);
}

 

创建服务端业务,以实例接口,示例:

/// <summary>
/// 服务端示例
/// </summary>
public class TestServer : Adf.Cs.Example.ITest
{
    //注意: 为了安全,用于CS的方法必需标记Command,不标记的为本地方法。 
    //不标记的情况下客户端请求将会出现找不到命令的异常

    /// <summary>
    /// 告知我客户端时间
    /// </summary>
    /// <param name="time"></param>
    /// <returns></returns>
    public bool NotifyTime(DateTime time)
    {
        //收到时间了,返回 true
        return true;
    }

    /// <summary>
    /// 返回指定大小的一组数据
    /// </summary>
    /// <param name="size"></param>
    /// <returns></returns>
    public int[] GetArray(int size)
    {
        var rand = new Random();
        var result = new int[ size ];
        for (int i = 0; i < size; i++)
        {
            //随机生成一个数
            result[i] = rand.Next();
        }
        return result;
    }

    /// <summary>
    /// 返回一个分页数据
    /// </summary>
    /// <param name="pageindex"></param>
    /// <param name="pagesize"></param>
    /// <param name="totalcount"></param>
    /// <returns></returns>
    public int[] GetDatas(int pageindex, int pagesize, out int totalcount)
    {
        //因为是示例,此处业务不完整, 直接返回指定尺寸数据
        totalcount = int.MaxValue;
        return this.GetArray(pagesize);
    }
}    

服务端启动配置,示例

            var logManager = new Adf.LogManager("test");
            var listen = new Adf.Cs.ServerListen(logManager);

服务端需要的配置,示例

<configSections>
    <section name="ServerMap" type="System.Configuration.NameValueSectionHandler"/>
  </configSections>
  <!-- 服务映射 -->
  <ServerMap>
    <!-- 客户端Test映射到 Adf.Cs.ExampleServer 程序集的 Adf.Cs.ExampleServer.TestServer 类 -->
    <add key="Test" value="Adf.Cs.ExampleServer.TestServer,Adf.Cs.ExampleServer"/>
  </ServerMap>
  <appSettings>
    <!-- 服务端口 -->
    <add key="Port" value="4562"/>
    <!-- 日志存储路径 -->
    <add key="Log:Path" value="D:\logs\Adf.Cs\TestServer"/>
    <!-- 日志刷新时间间隔(秒) -->
    <add key="Log:FlushInterval" value="10"/>

  </appSettings>

创建客户端,示例:

/// <summary>
/// 测试客户端
/// </summary>
public static class TestClient
{
    //指示服务名为:           Test
    //服务器为配置文件中的:   TestServer 节点

    /// <summary>
    /// 通用实例
    /// </summary>
    public static ITest Instance = Adf.Cs.CsHelper.GetClient<ITest>("Test", "TestServer");


}

使用示例:

 var notifyResult = TestClient.Instance.NotifyTime(DateTime.Now);
Console.WriteLine("告诉服务器客户端时间:" + notifyResult);

var array = TestClient.Instance.GetArray(5);
Console.WriteLine("从服务器获取到数据:" + Adf.ConvertHelper.ArrayToString(array, ","));

var totalcount = 0;
var datas = TestClient.Instance.GetDatas(1, 10, out totalcount);
Console.WriteLine("从服务器获取第1页数据:" + totalcount + Adf.ConvertHelper.ArrayToString(datas, ","));
Console.WriteLine("数据在服务器的总量为:"+ totalcount);

客户端需要的配置:

  <configSections>
    <section name="TestServer" type="Adf.Config.IpGroupSection,Adf"/>
  </configSections>
  <appSettings>
    <!-- 日志存储路径 -->
    <add key="Log:Path" value="C:\Logs\Adf.Cs\TestClient"/>
    <!-- 日志刷新时间间隔(秒) -->
    <add key="Log:FlushInterval" value="10"/>
  </appSettings>
  <!-- Servers 指定, 当前仅开放一个服务 -->
  <TestServer hash="0">
    <add ip="127.0.0.1" port="4562"/>
  </TestServer>

 

示例项目下载:

  http://www.aooshi.org/adf/download/Adf.Cs.1.x.Example.zip