关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » .NET »ASP.NET 跨平台最佳实践分享

    ASP.NET 跨平台最佳实践分享

    2015-11-18 00:00:00 出处:codeceo
    分享

    前言

    八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营。有过短暂的失落和迷茫,但技术转型真的没有想象中那么难。回头审视,其实单从语言本身来看,C#确实比Java更优秀(并非C#天生丽质,而是它站在了巨人的肩膀上)。

    该篇并非为.NET正名而来,而仅仅是分享作者近几年在ASP.NET跨平台方面的研究与实践经验,算是对八年的.NET之路作一个阶段性的总结。

    .NET技术自诞生以来,便一直因其跨平台能力差而广受诟病。这里面有微软有意为之,也有别有用心之人在混淆视听。.NET在一开始便是按公开的语言规范进行设计,随着微软的逐渐妥协,.NET Framework已完全开源。.NET跨平台技术迎来了前所未有的机会,各种.NET跨平台技术必将如雨后春笋般涌现。该篇将介绍作者在.NET跨平台方面的最佳实践经验,希望藉以降低.NET跨平台的技术难度,让.NET真正成为跨平台的生产技术。

    环境

    操作系统选择开源社区较有代表性的Linux服务器版本CentOS(该篇所述的跨平台思路可以成功应用于绝大多数的Linux系统,也包括国产操作系统如中标麒麟);技术平台选择久负盛名的Mono;Web应用中间件选择中国制造的Jexus。涉及的环境与技术详细情况为:

    操作系统:CentOS_6.4_64bit .NET框架:Mono_4.0.4.1 Web应用中间件:Jexus_5.6.5 数据库:MySQL_5.1.73

    目标

    该篇所述实践,将实现ASP.NET应用程序在Linux系统进行部署,并作产品化尝试,使ASP.NET应用在Linux平台易于部署和维护。

    Web应用程序

    该篇的Web应用程序选用ASP.NET MVC 4技术开发,持久层选用ADO.NET Entity Framework 6技术。你可以在src/demo目录下找到它。

    跨平台部署

    一、安装系统

    最小化安装CentOS系统。作为实验环境,可以考虑选用具有快照功能的虚拟机,作者选用的VMWare虚拟机进行试验。系统安装在此不再赘述。系统安装好后,做一个快照留待后续验证产品化安装包正确性所用。

    假设您对跨平台部署ASP.NET应用的实现过程没有兴趣,只想看结果的话,可以直接跳过后续步骤,直接进入产品化章节的通过安装包部署ASP.NET应用部分。

    二、搭建Linux编译环境

    由于该篇选择源码安装Mono,所以需要先搭建Linux编译环境。搭建Linux编译环境需要让系统连接互联网,并进行系统更新。

    首先,需要让你的系统连接互联网。此处以VMWare虚拟机为例讲解如何连接互联网。VMWare虚拟机连接互联网的方式很多,作者选择NAT方式,首先需要将虚拟机网络连接方式设为NAT,如图 1所示。

    图 1 VMWare虚拟机网络连接方式设置

    设置VMnet8为自动获取IP,如图 2所示。

    图 2 设置VMnet8为自动获取IP地址

    之后呢将Linux虚拟机设为DHCP自动分配IP,编辑网卡配置文件:

    [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

    修改该配置文件内容如下:

    DEVICE=eth0
    HWADDR=00:0C:29:F5:09:30
    TYPE=Ethernet
    UUID=74b949f0-57bb-4baa-a5f2-2c97fb533a8b
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=dhcp

    重启网络服务,让网卡设置生效:

    [root@localhost ~]# service network restart

    确认虚拟机已连接互联网:

    [root@localhost ~]# ping yilin.cnblogs.com
    PING yilin.cnblogs.com (42.121.252.58) 56(84) bytes of data.
    64 bytes from 42.121.252.58: icmp_seq=1 ttl=128 time=77.7 ms
    64 bytes from 42.121.252.58: icmp_seq=2 ttl=128 time=78.1 ms
    64 bytes from 42.121.252.58: icmp_seq=3 ttl=128 time=77.5 ms

    更新系统:

    [root@localhost ~]# yum –y update

    安装Mono源码安装需要的组件:

    [root@localhost ~]# yum -y install wget glib2-devel libtiff libtiff-devel libjpeg libjpeg-devel giflib giflib-devel libpng libpng-devel libX11 libX11-devel freetype freetype-devel fontconfig fontconfig-devel libexif libexif-devel gcc-c++ gettext unzip zip

    三、安装GDI+组件

    安装Mono之前,需要先安装其依赖的GDI+组件。联网下载libgdiplus源码安装包(如果在Linux系统中直接下载源码包出现停滞的情况,请返回Windows系统下载libgdiplus源码安装包,并将其上传到Linux系统相应路径后进行安装。后续其他组件安装遇此情况与此雷同,不再赘述):

    [root@localhost ~]# cd /usr
    [root@localhost usr]# wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.tar.bz2

    解压libgdiplus源码安装包:

    [root@localhost usr]# tar jxvf libgdiplus-2.10.tar.bz2

    配置libgdiplus组件安装路径(这里指定安装路径,是为后文产品化制作安装包做准备,Mono、Jexus和MySQL安装也是如此,不再赘述):

    [root@localhost usr]# cd libgdiplus-2.10
    [root@localhost libgdiplus-2.10]# ./configure --prefix=/usr/apollo/hostd/mono/

    编译libgdiplus源码:

    [root@localhost libgdiplus-2.10]# make

    安装libgdiplus组件:

    [root@localhost libgdiplus-2.10]# make install

    四、安装Mono

    Mono是Linux平台的.NET Framework实现,是.NET程序移植到Linux平台的不二选择。首先,联网下载Mono源码安装包:

    [root@localhost libgdiplus-2.10]# cd /usr
    [root@localhost usr]# wget http://download.mono-project.com/sources/mono/mono-4.0.4.1.tar.bz2

    解压Mono源码安装包:

    [root@localhost usr]# tar jxvf mono-4.0.4.1.tar.bz2

    配置Mono安装路径:

    [root@localhost usr]# cd mono-4.0.4
    [root@localhost mono-4.0.4]# ./configure --prefix=/usr/apollo/hostd/mono

    编译Mono源码(此过程耗时一般为半小时到一小时,视系统软硬件配置而定):

    [root@localhost mono-4.0.4]# make

    安装Mono:

    [root@localhost mono-4.0.4]# make install

    通过查看Mono版本,确认Mono是否安装成功(出现如下的版本信息表示Mono安装成功):

    [root@localhost mono-4.0.4]# cd /usr/apollo/hostd/mono/bin/
    [root@localhost bin]# ./mono -V
    Mono JIT compiler version 4.0.4 (Stable 4.0.4.1/5ab4c0d Fri Oct 30 06:56:35 CST 2015)
    Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
            TLS:           __thread
            SIGSEGV:       altstack
            Notifications: epoll
            Architecture:  amd64
            Disabled:      none
            Misc:          softdebug
            LLVM:          supported, not enabled.
            GC:            sgen

    五、安装Jexus

    Jexus是国人开发的Linux平台上的ASP.NET Web应用中间件,类似于Windows平台的IIS。实践证明Jexus安装简单,运行稳定,是Linux平台架设ASP.NET应用的不错选择。首先,联网下载Jexus安装包:

    [root@localhost ~]# cd /usr
    [root@localhost usr]# wget http://www.linuxdot.net/down/jexus-5.6.5.tar.gz

    解压Jexus安装包:

    [root@localhost usr]# tar zxvf jexus-5.6.5.tar.gz

    修改Jexus安装路径:

    [root@localhost usr]# cd jexus-5.6.5
    [root@localhost jexus-5.6.5]# vi install
    
    #!/bin/sh
    
    SRC_DIR=$(cd $(dirname $0);pwd)
    DAT_DIR=${SRC_DIR}/data
    JWS_DIR='/usr/apollo/hostd/jexus'
    …

    安装Jexus:

    [root@localhost jexus-5.6.5]# sudo ./install

    修改Jexus关于mono路径的配置:

    [root@localhost jexus-5.6.5]# cd /usr/apollo/hostd/jexus
    [root@localhost jexus]# vi jws
    
    #!/bin/sh
    
    JWS_HOME=$(cd $(dirname $0);pwd)
    
    export LANG="zh_CN.UTF-8"
    export PATH=/usr/bin:${JWS_HOME}/../mono/bin:$PATH
    export LD_LIBRARY_PATH=/usr/lib:${JWS_HOME}/../mono/lib:$LD_LIBRARY_PATH
    …

    启动Jexus服务,测试Jexus安装是否正确:

    [root@localhost jexus]# ./jws start

    设置Jexus服务开机自启动,增加如下高亮行::

    [root@localhost jexus]# vi /etc/rc.d/rc.local
    
    touch /var/lock/subsys/local
    /usr/apollo/hostd/jexus/jws start

    修改该文件权限并重启:

    [root@localhost jexus]# chmod +x /etc/rc.d/rc.local

    六、部署网站

    创建网站目录:

    [root@localhost jexus]# cd /usr/apollo/
    [root@localhost apollo]# mkdir webapps
    [root@localhost apollo]# cd webapps/
    [root@localhost webapps]# mkdir default
    [root@localhost webapps]# cd default/
    [root@localhost default]# touch index.html
    [root@localhost default]# vi index.html
    <html>
    <head>
        <title>ASP.NET跨平台最佳实践</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
    ASP.NET跨平台最佳实践,看到该页面,表示你的第一个网站已成功部署到Linux系统。
    </body>
    </html>

    修改Jexus网站配置:

    [root@localhost default]# cd /usr/apollo/hostd/jexus/siteconf
    [root@localhost siteconf]# vi default
    
    ######################
    # Web Site: Default
    ########################################
    
    port=80
    root=/ /usr/apollo/webapps/default
    hosts=*    #OR your.com,*.your.com
    …

    开放防火墙80端口:

    [root@localhost siteconf]# vi /etc/sysconfig/iptables
    
    # Firewall configuration written by system-config-firewall
    # Manual customization of this file is not recommended.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT

    重启iptables,使防火墙设置生效:

    [root@localhost siteconf]# /etc/init.d/iptables restart

    重启Jexus服务:

    [root@localhost siteconf]# /usr/apollo/hostd/jexus/jws restart

    终端浏览器输入网址http://ip:port/index.html访问网站:

    图 3 ASP.NET网站成功部署到Linux平台

    七、数据库

    Linux平台免费关系数据库首选当然是MySQL,首先下载MySQL源码安装包:

    [root@localhost siteconf]# cd /usr
    [root@localhost usr]# wget http://downloads.mysql.com/archives/get/file/mysql-5.1.72-linux-x86_64-glibc23.tar.gz

    解压MySQL源码安装包到指定目录,并修改目录名称:

    [root@localhost usr]# tar zxvf mysql-5.1.72-linux-x86_64-glibc23.tar.gz -C /usr/Apollo
    [root@localhost usr]# cd apollo
    [root@localhost apollo]# mv mysql-5.1.72-linux-x86_64-glibc23 data

    将mysql配置文件拷贝至指定目录:

    [root@localhost apollo]# cd data
    [root@localhost data]# cp support-files/my-medium.cnf /etc/my.cnf

    编辑mysql配置文件,在[client]节和[mysqld]节中加入以下高亮行::

    [root@localhost data]# vi /etc/my.cnf
    
    [client]
    #password       = your_password
    port            = 3306
    socket          = /tmp/mysql.sock
    default-character-set = utf8
    
    # Here follows entries for some specific programs
    
    # The MySQL server
    [mysqld]
    port            = 3306
    socket          = /tmp/mysql.sock
    skip-locking
    key_buffer_size = 16M
    max_allowed_packet = 1M
    table_open_cache = 64
    sort_buffer_size = 512K
    net_buffer_length = 8K
    read_buffer_size = 256K
    read_rnd_buffer_size = 512K
    myisam_sort_buffer_size = 8M
    basedir = /usr/apollo/data
    datadir = /usr/apollo/data/data
    character-set-server = utf8
    collation-server = utf8_general_ci
    …

    创建mysql组及用户,并设定目录访问权限:

    [root@localhost data]# groupadd mysql
    [root@localhost data]# useradd -g mysql mysql
    [root@localhost data]# chown -R mysql .
    [root@localhost data]# chgrp -R mysql .
    [root@localhost data]# chown -R root .
    [root@localhost data]# chown -R mysql data

    初始化数据库:

    [root@localhost data]# scripts/mysql_install_db --user=mysql

    运行mysql服务:

    [root@localhost data]# bin/mysqld_safe --user=mysql &

    这种方式启动MySQL是阻塞式的,需要另开一个会话登录Linux系统,继续后续操作。

    设置root用户密码:

    [root@localhost data]# bin/mysqladmin -uroot password 11111111

    设置mysql服务开机自动启动:

    [root@localhost data]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
    [root@localhost data]# chmod 700 /etc/init.d/mysqld
    [root@localhost data]# chkconfig --add mysqld
    [root@localhost data]# chkconfig --level 345 mysqld on

    现在,可以停止之前会话启动的MySQL服务(快捷键Ctrl + C),使用service命令后台启动MySQL服务。

    [root@localhost data]# service mysqld start

    将mysql命令加入系统环境变量中,在文件末尾加上以下两行代码:

    [root@localhost data]# vi /etc/profile
    
    ...
    PATH=$PATH:/usr/apollo/data/bin
    export

    执行配置,并重启系统,让环境变量生效:

    [root@localhost data]# source /etc/profile

    待Linux系统重启后,MySQL服务可以自动启动,MySQL命令也包含在了环境变量中。此时,MySQL服务已经可以在本地访问了,可以通过MySQL命令行创建数据库、执行SQL文件等操作。另外,可以通过MySQL命令行配置允许远程访问MySQL数据库(当网站服务和MySQL数据库服务在一起时,可以不进行该配置):

    [root@localhost ~]# mysql -uroot -p11111111
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '11111111' WITH GRANT OPTION;
    mysql> FLUSH PRIVILEGES;
    mysql> exit;

    还需要防火墙开放3306端口,编辑防火墙规则文件,在防火墙规则文件中添加如下高亮行:

    [root@localhost ~]# vi /etc/sysconfig/iptables
    
    # Firewall configuration written by system-config-firewall
    # Manual customization of this file is not recommended.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT

    重启防火墙服务:

    [root@localhost ~]# /etc/init.d/iptables restart

    此时可以远程访问MySQL数据库了。

    八、部署ASP.NET应用

    本示例提供一个ASP.NET MVC应用,放置在后文制作的tar包webapps目录下,该示例通过Entity Framework实现数据库的自动创建及数据的增删改查。将该目录上传至Linux系统的/usr/apollo/webapps目录下,并配置Jexus网站配置:

    [root@localhost ~]# cd /usr/apollo/hostd/jexus/siteconf/
    [root@localhost siteconf]# cp default demo
    [root@localhost siteconf]# vi demo
    
    …
    port=8080
    root=/ /usr/apollo/webapps/demo
    hosts=*    #OR your.com,*.your.com
    …

    Jexus支持承载多个Web站点,所以这里新增的demo站点和之前创建的default站点可以共存,仅需配置不同的端口号即可。同样的需要开放防火墙8080端口:

    [root@localhost siteconf]# vi /etc/sysconfig/iptables
    
    # Firewall configuration written by system-config-firewall
    # Manual customization of this file is not recommended.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT

    重启iptables,使防火墙设置生效:

    [root@localhost siteconf]# /etc/init.d/iptables restart

    重启Jexus服务:

    [root@localhost siteconf]# /usr/apollo/hostd/jexus/jws restart

    现在可以在终端通过浏览器访问ASP.NET MVC站点了。

    图 4 Linux环境部署ASP.NET MVC应用

    产品化

    通过上述一系列步骤,我们实现了ASP.NET MVC应用在Linux平台的部署,但这仅仅是技术预研,离产品化还有一定的距离。这一系列步骤技术性太强,需要联网,不易操作,这些对于生产和用户环境都是难于实现的。我们需要将.NET跨平台技术产品化,使得ASP.NET应用易于部署。

    一、初始化脚本

    如前文所述,ASP.NET应用在Linux平台部署需要设置防火墙策略、MySQL用户与分组、Jexus与MySQL服务开机自启动等,相当繁琐。我们可以将这些设置集中在一个初始化脚本里执行。

    #!/bin/sh
    
    #echo off
    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    
    #创建软链接,以支持将应用部署到任意目录
    #ln -s -T $DIR /usr/apollo
    
    #拷贝事先配置好的MySQL配置文件到指定目录
    cp -f $DIR/conf/my.cnf /etc/my.cnf
    
    #创建MySQL需要的用户和用户组
    groupadd mysql
    useradd -g mysql mysql
    chown -R root .
    chown -R mysql data
    chgrp -R mysql data
    
    #设置MySQL服务开机自启动
    cp $DIR/data/support-files/mysql.server /etc/rc.d/init.d/mysqld
    chmod 700 /etc/init.d/mysqld
    chkconfig --add mysqld
    chkconfig --level 345 mysqld on
    
    #将MySQL命令加入系统环境变量
    sudo cat $DIR/conf/profile >> /etc/profile
    source /etc/profile
    
    #设置防火墙策略
    cp -f $DIR/conf/iptables /etc/sysconfig/iptables
    
    #设置Jexus服务开机自启动
    sudo cat $DIR/conf/rc.local >> /etc/rc.d/rc.local
    chmod +x /etc/rc.d/rc.local
    chmod a+x $DIR/hostd/jexus/jws
    chmod a+x -R $DIR/hostd/mono/bin
    
    #重启系统
    reboot

    二、制作安装包

    将Linux平台部署ASP.NET应用需要的技术包括Mono、Jexus、MySQL等集成并进行打包分发。

    [root@localhost ~]# tar jcvf crossplatform-1.0.0.0-centos6.4-x86_32_64.tar.bz2 /usr/apollo

    三、通过安装包部署ASP.NET应用

    至此,Linux平台Web应用部署包已打好,将其下载到终端。将虚拟机恢复到初始安装快照状态,之后呢将终端上的部署包上传到Linux系统中并解压:

    [root@localhost usr]# tar jxvf crossplatform-1.0.0.0-centos6.4-x86_32_64.tar.bz2

    执行初始化脚本完成安装:

    [root@localhost usr]# cd apollo
    [root@localhost apollo]# sh ./install

    在终端通过浏览器访问ASP.NET MVC站点,确认部署成功。

    图 5 Linux平台产品化部署ASP.NET MVC应用

    总结

    该篇详细讲解了Linux平台部署ASP.NET应用的最佳实践过程,通过该实践过程了解了ASP.NET应用跨平台部署的方方面面,该过程同样适用于其他Linux分发版本和国产操作系统。另外,该篇对Linux平台部署ASP.NET应用进行了产品化包装,制作的安装包可以直接应用于产品打包,你只需将应用放入指定目录即可。希望该篇所阐述的技术对你有所帮助。

    附件下载:示例源码+该篇PDF版本

    附件下载:产品化部署TAR包

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。