[转]VC2005从开MFC ActiveX ocx控件到公布到.net网站的满贯进程

初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充吧。学习WCF之前,有必要先来了解下SOA

[version]    

Library](http://blog.csdn.net/xieyufei/article/details/39022511);[WCF服务应用程序

WCF服务库](https://social.msdn.microsoft.com/Forums/zh-CN/864d7236-ca3b-49bc-9cbf-da092ddfa3a0/vs2010-wcf-wcf-?forum=wcfzhchs&forum=wcfzhchs);

当列工作负,推荐以 WCF服务库,某个服务的类定义为一个独门可以编译的类库,低耦合,可以呢其它门类以、提高代码的复用性。

下的 WCF服务,包含2单 WCF 服务库(具体的单身的劳务,CalculateService
和 CertificateService)和1只 ASP.NET 空 Web
应用程序(包含2独WCF服务类库,对外提供服务)

[1].
创建WCF服务库

率先,分别创建2只单身的WCF服务库:CalculateService(计算服务) 和
CertificateService(注册服务),下面直接给来代码:

(1)CalculateService

图片 1图片 2

 1 namespace RVC.WCF.Calculate
 2 {
 3     [ServiceContract]
 4     public interface ICalculateService
 5     {
 6         [OperationContract]
 7         double Add(double a, double b);
 8         [OperationContract]
 9         double Minus(double a, double b);
10         [OperationContract]
11         double Multiple(double a, double b);
12         [OperationContract]
13         double Divide(double a, double b);
14     }
15 }

ICalculateService.cs

图片 3图片 4

 1 namespace RVC.WCF.Calculate
 2 {
 3     public class CalculateService : ICalculateService
 4     {
 5         public double Add(double a, double b) {
 6             return a + b;
 7         }
 8         
 9         public double Minus(double a, double b) {
10             return a - b;
11         }
12 
13         public double Multiple(double a, double b) {
14             return a * b;
15         }
16 
17         public double Divide(double a, double b) {
18             if ((int)b == 0){
19                 return double.MaxValue;
20             }
21             return a * 1.0 / b;
22         }
23     }
24 }

CalculateService.svc.cs

(2)CertificateService

图片 5图片 6

 1 namespace RVC.WCF.Certificate
 2 {
 3     [ServiceContract]
 4     public interface ICertificateService
 5     {
 6         [OperationContract]
 7         string CertificateUser(string userName, string passWord);
 8         [OperationContract]
 9         UserInfo GetUserInfo(string userID);
10         [OperationContract]
11         bool CancelUser(string userID);
12     }
13 }

ICertificateService.cs

图片 7图片 8

namespace RVC.WCF.Certificate
{
    public class CertificateService : ICertificateService
    {
        private static Dictionary<string, UserInfo> UserDic = new Dictionary<string, UserInfo>();

        public string CertificateUser(string userName, string passWord)
        {
            string userID = DateTime.Now.ToShortTimeString() + passWord;
            UserInfo user = new UserInfo() {
                UserID = userID,
                UserName = userName,
                Password = passWord,
                CertTime = DateTime.Now
            };

            if (UserDic.ContainsKey(user.UserID)) {
                throw new Exception("该用户已存在");
            }
            UserDic.Add(user.UserID, user);

            return userID;
        }

        public UserInfo GetUserInfo(string userID)
        {
            UserInfo ret = new UserInfo();

            if (!UserDic.ContainsKey(userID)){
                throw new Exception("该用户不存在");
            }
            ret = UserDic[userID];

            return ret;
        }

        public bool CancelUser(string userID)
        {
            if (!UserDic.ContainsKey(userID)){
                throw new Exception("该用户不存在");
            }
            UserDic.Remove(userID);
            return true;
        }
    }
}

CertificateService.svc.cs

图片 9图片 10

 1 namespace RVC.WCF.Certificate
 2 {
 3     [DataContract] 
 4     public class UserInfo
 5     {
 6         [DataMember] 
 7         public string UserID;
 8         [DataMember] 
 9         public string UserName;
10         [DataMember] 
11         public string Password;
12         [DataMember] 
13         public DateTime CertTime;
14     }
15 }

UserInfo

创建的 WCF服务库,仅用新增 .cs接口文件 和 .svc.cs接口实现公文,配置文件
App.config 暂时无需变更。注意代码仅供参考,不要过分强调细节。

[2].
包装WCF服务库

创立好的 WCF服务库不能够一直运行,需要宿主托管才能够尽。通过  VS新建项目 -> ASP.NET 空 Web
应用程序,作为该 WCF服务类库的 Host 将上述 WCF服务类库包含进来。

各级一个 ASP.NET Web服务
都兼备一个 .asmx 文件,客户端通过访问 .asmx 文件落实对相应 web
服务之调用。类似,每个 WCF 服务为兼具一个应和之文书,即 .svc 文件。基于
IIS 的服务寄宿要求对应的 WCF 服务具有相应的 .svc 文件,.svc 文件部署为
IIS 站点中,对 WCF 服务之调用体现在针对 .svc 文件的拜会达到。

(1)右键项目,添加一个文书夹,命名也 Services

(2)右键 Services 文件夹,添加 WCF服务 文件,分别命名也
CalculateService.svc 和 CertificateService.svc,同时以 .cs接口文件 和
.svc.cs接口实现文件去,只留 .svc服务托管文件

(3)依次修改 .svc 文件为如下形式,分别指向对应的劳务实现公文

// CalculatorService
<%@ ServiceHost Language="C#" Debug="true" Service="RVC.WCF.Calculator.CalculatorService" CodeBehind="CalculateService.svc.cs" %>

// CertificateService
<%@ ServiceHost Language="C#" Debug="true" Service="RVC.WCF.Certificate.CertificateService" CodeBehind="CertificateService.svc.cs" %>

其中 Service = “命名空间.服务号” 表示提供的劳务,CodeBehind =
“服务接口实现文件” 表示服务实现类似。

除外,Web.config
暂无改变。至此,服务相关文书全部创了,下面为起资源结构图

图片 11

里,右图是以调节好,将2只WCF服务类库项目增长到了该Web应用程序中。

为了印证服务是否能运行,右键 RVC.WCF.Service,选择 在浏览器中查看 并登 Services 文件夹

图片 12

点击即可查看服务运作状况。

[3]. 在 IIS
上发布 WCF
服务

同等是右键 RVC.WCF.Service,选择 生成部署包,生成文书路径:…\RVC.WCF.Service\obj\Debug\Package\PackageTmp 

以欠文件夹下的文书复制到 IIS 的相干路线下,在 IIS -> 网站 -> 添加网站 或 IIS -> 网站 -> Default Web Site ->
添加应用程序 并指向该路线即可。

从那之后,将拖欠 WCF 服务成功发布到 IIS 上。

推荐文章:WCF4.0新特征体验(7):IIS无SVC文件托管WCF服务(IIS
hosting without an SVC file
);

以 WCF
学习中遇见的一些问题

[1]. 如何读取配置文件被 endpoint 结点的地址?

// 方法1
SqhServiceClient SqhClient = new SqhServiceClient();
var endpoint = SqhClient.Endpoint;

// 方法2
string sectionPath = "system.serviceModel/client";
var clientNode = (ClientSection)ConfigurationManager.GetSection(sectionPath);
var endpoints = clientNode.Endpoints;

其间,方法1只有会读取某个终结点的信息,而艺术2好读取该服务下有终结点的音。

关于艺术2的实际解决智参见:http://www.cnblogs.com/huangxincheng/p/4396284.html

参考:

  • WCF入门教程;
    我的WCF之旅;
  • 专辑:传说被的WCF; 
    搭的路 –
    WCF全析;

1.       点击“视图”,打开“类视图”窗口。

SOA

Service-Oriented Architecture,面向服务架构,粗粒度、开放式、松耦合的服务结构,将应用程序的例外功效单元(称为服务)通过这些劳动期间定义美的接口和契约关系起。接口采用中立之点子定义,独立为实现服务之硬件平台、操作系统及编程语言(跨平台)。

SOA既是同栽编程方式,也是软件开发的同样种植架构方法,服务层是SOA的功底,核心是“服务”,本质就是是将服务做起来并对外提供接口。SOA架构的技艺基础是SOAP(Simple
Object Access
Protocol,简易对象看协议)标准,SOAP用XML语言定义一个服务操作方法所发送和接收信息的内容。

贯彻SOA思想之技艺

  • Web Service
  • WCF

参考:针对SOA的一些明亮;漫谈SOA;

有关 web service 的学习,参见:Web Service –
sqh;

至于 Web Service 和
WCF,异同点作简单的印证

  • 数据交换/通信方式:Web 服务在HTTP上通过SOAP与端点通信,WCF
    服务可择采取不同的协商进行通信
  • 运作方式:Web 服务总是运行在 IIS 上,WCF 服务可选适宜宿主

至于WCF与Web
Service的分别参见:http://www.cnblogs.com/xiurui12345/archive/2012/03/30/2425445.html。下面要研究
WCF。

 

WCF

Windows Communication Foundation(WCF)是出于微软开发之同雨后春笋支持弹性数据通信的应用程序框架,可以解为Windows通讯支出平台。作为微软主推的一个报道组件或者平台,不仅支持以及集成Web
Service,还配合和有着微软前期技术的特征,整合了原来windows通讯的 .Net
Remoting、WebService、Socket机制,融合有HTTP和FTP相关技能,是白手起家在Web
Service架构上的一个新通信平台。WCF可以解吧Web Service的升级版。

微软官说:WCF(之前的本子名也 Indigo)是截然采用托管代码建立与周转面向服务应用程序的汇合框架,使开发者能够树立一个跨平台的平安、可信赖、事务性的解决方案,且能和已发网配合协作

  • Microsoft为构建 面向服务 的用提供的 分布式通信框架
  • WCF是.NET Framework
    3.5底要部分
  • Web服务同长途技术相结合的通用基础结构,提供创建远程服务并与那个通信的框架
  • 微软分布式应用程序支付的集大成者,整合了.Net平台与分布式系统的关于技术,是Win平台上出分布式应用最佳的执行措施

WCF是平套框架,用来创造各种劳动,且会创造兼容Web服务之劳务,也就是说可以创建能够和Web服务互联互通的服务。WCF最核心的通信机制是SOAP,保证系统之间的互操作性。WCF技术允许创建服务,可以跨进程、计算机与网自外应用程序访问这些劳务。利用这些劳动,可以在多单应用程序中共享功能,提供数据源或抽象复杂过程。

优点

  • 统一性、兼容性,支持过平台交流
  • 有着互操作性的Web服务,支持.Net与.Net通信、分布式事务、消息队列(Message
    Queue)
  • 安全可靠的音讯通信,灵活安排支持单工、半双工、全双工
  • 支撑HTTP或TCP通信,寄宿在web服务器、windows服务还是本人寄宿

其余相关信息可参看:WCF .vs.
Web
Service

WCF做啥

WCF 是面向服务之,跨平台的安全、可信赖、事务性的缓解方案,作为
WebService,.Net Remoting,Enterprise
Service,WSE,MSMQ
的并集,以面向服务吗考虑提供了含有通讯、事务、并发、队列、安全等同样层层之全方位的分布式开发方案。

  • WCF最终目标是由此进程要不同的系统、通过本地网络或是通过Internet收发客户端服务器之间的音讯
  • WCF专门用于面向服务(Service-Oriented)开发

图片 13

WCF 是 .NET
提供的一致种服务,可以将写的到位一定功能的次第(如自数据库中读取数据操作等)封装成服务,然后发布到服务器上会见变卦一个网址,客户端编程时可以引用这服务,使用劳务中提供的效应。关于
WCF
的别样消息参考:http://blog.csdn.net/fynjy/article/details/46874597

WCF架构

WCF Service通过 终结点(Endpoint)
发布服务来实现网络体系依次应用程序间的通信,一个WCF
Service由一个Endpoint集合组成。Endpoint是WCF实现通信的主干元素,是劳务器间通信调用的输入,客户端和服务端通过Endpoint交换信息。

当我们下榻 WCF
服务经常,必须定义一个要多只终结点,然后 Serivce
端通过监听这些终结点来拍卖 Client 发来之请。由于应用程序之间因
Endpoint 通信,那么 Client 端也须定义终结点,只有 Client 与 Service
的扫尾点全匹配时才能够通信。

namespace System.ServiceModel.Desc
{
    // 表示允许服务的客户端查找并与服务通信的服务的终结点
    public class ServiceEndpoint
    {
        public string Name { get; set; } // 服务终结点的名称
        public EndpointAddress Address { get; set; }  // 服务终结点的终结点地址
        public ContractDescription Contract { get; set; } // 服务终结点的协定
        public Binding Binding { get; set; } // 服务终结点的绑定
    }
}

Endpoint由三单关键部分构成:

 A:地址 –
Address,服务之岗位,Where to locate
the WCF
Service?:唯一定位服务,提供额外的寻址信息以及认证信息

右键 SqhService.svc
,选择于浏览器中查,获取该服务的唯一地址标识URI(WCF Service
Address):http://localhost:18583/SqhService.svc

里面,URI(Uniform
Resource Identifier)统一资源标识,格式:[Schema传输协议]://[主机名|域名|IP地址]:[端口号]/[资源路经过] 

namespace System.ServiceModel
{
    // 提供客户端用来与服务终结点进行通信的唯一网络地址。
    public class EndpointAddress
    {
        public Uri Uri { get; } // 终结点的 URI,服务的唯一标识
        public EndpointIdentity Identity { get; } // 用于验证终结点的标识
        public AddressHeaderCollection Headers { get; } // 获取生成器可以创建的终结点的地址标头的集合
    }
}

对此终结点地址,是分别为劳动地方的:终结点地址是服务地方之子地址,或相对地址;服务地方是终结点地址之父地址,或基地址,示例

劳动地方:江陵路xx小区2哀号楼,楼房地址,只发一个,唯一标识服务

终结点地址:江陵路xx小区2号楼601室,门牌号地址,一个劳动得蕴涵多只终结点

下面给出网上的同一段子示例代码,有助于了解服务地方和终结点地址之关联

// 服务地址
Uri baseAddress = new Uri("http://localhost:8000/MyService"); 

// 服务宿主
using(ServiceHost host = new ServiceHost(typeof(HelloWCFService), baseAddress))
{
    // 添加终结点(地址、绑定、服务协定)
    host.AddServiceEndpoint(typeof(IHelloWCFService), new WSHttpBinding(), "HelloWCFService");  

    // 元数据交换结点,用于元数据交换,并指定启用元数据交换行为
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();  
    smb.HttpGetEnabled = true;  
    host.Description.Behaviors.Add(smb);  

    // 启动服务
    host.Open();  
    // doSomething(...)
    host.Close(); 
}

骨子里,以上信息全都好以配置文件被贯彻,当配置起反时方可不用再行编译程序集。

 B:绑定 –
Binding,服务之通信方式,How to
communicate with
service?,实现Client和Service通信的装有根细节,解决WCF服务之通信问题;

在即时吃起支持双工通信的有数栽协议:

  • wsDualHttpBinding:基于HTTP传输协议,HTTP协议是冲请求-回复的传输协议,基于HTTP的大路本质上是才为的
  • netTcpBinding:完全依据支持双工通信的TCP协议

wsDualHttpBinding
实际上创建了一定量只通道,一个用于客户端向劳动端的通信,而任何一个则用来服务端到客户端的通信,从而间接地提供了双工通信的兑现。

 C:契约 –
Contract,服务的情,What
functionalities do the Service
provide?,见下;

除了,还有一个
Behavior,用于定制Endpoint在运作时之部分必要的动作相当。

WCF架构体系是基于拦截机制的,一个完好的 WCF 解决方案包括如下四独片:

  1. 契约(Contracts):主要定义了实现那些服务,如何看服务
  2. 劳(Services):实现契约定义的法
  3. 宿主程序(Hosting):提供低层传输功能的支持
  4. 客户端(Client):
    根据契约访问服务

Metadata(元数据)

头数据交换(Metadata
Exchange):服务端要提供劳务的接口描述(或项目描述)、操作的法子签名,相关的数码描述等深受客户端

配置文件

这边叫出布局文件之共同体结构代码,其中:

  • services:[必须],配置服务、接口及终结点
  • bindings:[而是产生可不论是],配置绑定协议
  • behaviors:[只是发出可无论是],配置行为、认证等





    // 宿主服务地址





    // 服务终结点

    // 元数据交换结点













下面给起一个简练的 WCF 程序的资源结构图

  图片 14

专注,其中的 .svc 文件就是服务托管文件

3.1 契约

WCF的基本概念是因 契约(Contract
来定义双方通信的磋商,合约必须要为接口的法门来反映,而其实的劳动代码必须要出于这些合同接口派生并促成。契约和平台无关、以XML格式发布,是信参与者中的预定,提供服务通信所必需的冠数据。首先,了解下代码中的几乎种植契约属性之款式

// 数据协定
// 指定该类型要定义或实现一个数据协定,并可由序列化程序(如 System.Runtime.Serialization.DataContractSerializer)进行序列化
// 若要使其类型可序列化,类型作者必须为其类型定义数据协定
[DataContract]

// 数据成员协定
// 当应用于类型的成员时,指定该成员是数据协定的一部分并可由 System.Runtime.Serialization.DataContractSerializer 进行序列化
[DataMember]

// 服务协定
// 指示接口或类在 应用程序中定义服务协定
[ServiceContract]

// 操作协定
// 指示方法定义一个操作,该操作是 应用程序中服务协定的一部分
[OperationContract]

脚通过代码示例,具体研究各个契约的用法

  • 劳务契约(Service
    Contract):定义整个服务(接口
  • 操作契约(Operation
    Contract):定义服务提供的主意

    using System.ServiceModel;
    using System.Runtime.Serialization;
    using SqhWcfFunction;
    namespace SqhWcfService
    {

    [ServiceContract]  // 服务契约
    public interface ISqhService{
        [OperationContract]   // 操作契约
        QueryOut QueryPersonInfoService(QueryIn inParam);
    }
    

    }

:可以于特色中应用Namespace和Name属性,实现对命名空间及签订方法名称的加密。具体信息以Service
References:SqhService下的SqhService.wsdl文件被查阅。其中,WSDL(网络服务描述语言,Web
Services Description Language)是基于XML的言语,用于描述Web
Services、服务元数据和怎样对它进行走访。=> WSDL 教程 |
W3School

下的劳动协定接口的贯彻

namespace SqhWcfService
{
    public class SqhService : ISqhService
    {
        public QueryOut QueryPersonInfoService(QueryIn inParam)
        {
            QueryOut outParam = new QueryOut();
            try
            {
                outParam = SqhServiceFunction.QueryPersonInfo(inParam);
            }
            catch (Exception e)
            {
                outParam.ErrMsg = "查询person信息时发生异常," + e.Message;
                outParam.isSuccessed = false;
                return outParam;
            }
            return outParam;   
        }
    }
}

中间,SqhWcfFunction.SqhServiceFunction 是特别定义的数量处理函数类。

  • 多少契约(Data
    Contract):定义双方通信时之数码格式,类型可序列化,用于数据传。使用数据协定可以活决定什么成员可以吃客户端识别。

    using System.ServiceModel;
    using System.Runtime.Serialization;
    namespace SqhWcfFunction
    {

    [DataContract]  // 数据契约
    public class QueryIn{
        [DataMember]   // 数据成员契约,标识类型可序列化
        public string personID;
        [DataMember]
        public string personName;
    }
    
    [DataContract]
    public class QueryOut{
        [DataMember]
        public string personResInfo;
        [DataMember]
        public bool isSuccessed;
    }
    

    }

关于数据协定的详细使用,可参见:WCF –
数据协定;

  • 信契约(Message
    Contract):定义在通信期间改写消息内容的正儿八经和消息格式化方式

双重好地操纵SOAP头和SOAP体,支持序列化期间的安全体制。所有的音讯契约必须兑现一个public的无参构造函数。

于闹一个 WCF 的简易
Demo,参见:http://www.cnblogs.com/iamlilinfeng/p/4083827.html

3.2 宿主程序

WCF本身不克独立运行,必须寄宿在一个宿主进程(Host
Process)中。服务寄宿的目的就是是开启一个历程,为WCF服务提供一个运转的环境。单个宿主进程可以托管多只劳务,相同的劳务啊足以托管在差不多个宿主进程遭到。

  • Windows进程激活服务:WAS,支持所有的绑定协议
  • IIS:客户端第一次等呼吁时宿主进程自动启动,管理宿主进程的生命周期
  • 自驻留(自托管):Self-Hosting,控制台程序、窗体程序等,由开发者提供和保管宿主进程生命周期,且适应任意WCF传输协议,但平稳性差

class=”token li”> class=”token lf”> class=”token md md-li”>关于通过控制高承载寄宿服务

连带材料可参见

  • http://blog.csdn.net/songyefei/article/details/7363296

class=”token li”> class=”token lf”>关于在 IIS 中寄宿 WCF
服务

每当 IIS
中宿主服务的要优点:发生客户端请求时宿主进程会叫电动启动,并且可以凭借
IIS
管理宿主进程的生命周期

连锁材料可参见:

  • http://blog.csdn.net/songyefei/article/details/7381595
  • WCF 部署在IIS上

率先,一个服务如部署及 IIS
上,必须要生成待部署之公文管,具体操作:

[1]. 右键项目,生成部署包
[2]. ...\obj\Debug\Package\PackageTmp\ 目录下的文件就是待部署的文件
[3]. PackageTmp 下的文件全部拷贝到 IIS 下的相关文件夹中即可

下面对 IIS 寄宿 WCF
服务着相见的几只问题进行总结:

问题1:
“/SQHWCFSERVICE”应用程序中的服务器错误。
配置错误
 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。
 分析器错误消息: 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
源错误:
     <compilation debug="true" targetFramework="4.0"/>
版本信息: Microsoft .NET Framework 版本:2.0.50727.4961; ASP.NET 版本:2.0.50727.4955 

因:.NET Framework 版本不般配,IIS 配置 和 程序配置的版本不同等

化解方式:修改.NET Framework
版本也对应版本,将 2.0 改吗 4.0 版本

现实参见:http://blog.csdn.net/muchlin/article/details/6800863

问题2:
应用程序“NET/CRM”中的服务器错误  Internet Information Services 7.5
错误摘要:HTTP 错误 404.2 - Not Found
由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。

原因:ISAPI和CGI限制没有许用的版

缓解方法:具体而参见上面的链接。

在意,如果ISAPI和CGI限制列表中未含有需要之版,需要手动添加 C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

问题3:
通过IIS直接浏览页面时报错:HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。
如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

釜底抽薪方法:为 IIS 重新登记 .net
framework
4.0,具体参见:http://blog.csdn.net/g200407331/article/details/9078219

  • 担保 控制面板->打开或关闭windows功能->Internet信息服务->万维网服务->应用程序开发效益 勾选上
    “.net扩展性”和“ASP.NET”,保存后,重开 IIS
  • Visual Studio 命令提示工具被,输入指令:  aspnet_regiis -i,注册
    .net framework 4.0

只顾,要为管理员权限运行Visual Studio
命令提示工具,该工具在微机左下角的开始面临可找到。

为保险起见,在 IIS 根目录下,双击 MIME 类型,添加如下信

文件扩展名:.json
MIME 类型:application/json

3.3 服务

Service:服务概念,注重逻辑

using System.ServiceModel;
using System.Runtime.Serialization;
using SqhWcfFunction;
namespace SqhWcfService{
    public class SqhService : ISqhService
    {
        public QueryOut QueryPersonInfoService(QueryIn inParam)
        {
            QueryOut outParam = new QueryOut();
            try{
                outParam = SqhServiceFunction.QueryPersonInfo(inParam);
            }
            catch (Exception e){
                outParam.ErrMsg = "查询person信息时发生异常," + e.Message;
                outParam.isSuccessed = false;
                return outParam;
            }
            return outParam;   
        }
    }
}

Function:服务函数,具体贯彻

namespace SqhWcfFunction{
    public class SqhServiceFunction
    {
        public static QueryOut QueryPersonInfo(QueryIn inParam)
        {
            QueryOut outParam = new QueryOut();
            try{
                // 动态SQL、访问数据库等其他各种操作
                outParam.isSuccessed = true;
                outParam.personResInfo = string.Format("My WCF Service:{0}-{1}", inParam.personID, inParam.personName);
            }
            catch (Exception e){
                outParam.ErrMsg = "查询失败" + e.Message;
                outParam.isSuccessed = false;
                return outParam;
            }
            return outParam;
        }
    }
}

3.4 客户端

客户端应用程序通过代理类与WCF服务进行通信,代理类为WCF服务实现了劳务契约接口,对是接口的操作方法的有着调用都重定向到WCF服务达到。

using System.ServiceModel;
using System.Runtime.Serialization;
using SqhWcfClient.SqhService;
namespace SqhWcfClient
{
    public class Program{
        static void Main(string[] args){
            SqhServiceClient SqhClient = new SqhServiceClient();  // 客户端
            QueryIn inParam = new QueryIn(){ personID = "001", personName = "sqh" };
            QueryOut outParam = SqhClient.QueryPersonInfoService(inParam);
            if(outParam.isSuccessed)
                Console.WriteLine(outParam.personResInfo);
            SqhClient.Close();   // 关闭客户端
        }
    }
} 

至于双工消息通信模式(异步)的实现

WCF 支持多音格式:单向、请求/回复、双工,但不能不绑定对应之协议。

  • 要/回复:basicHttpBinding,客户端并等待服务端处理结果
  • 一头:OperationContract
    操作立下必须标明 IsOneWay = true 属性,相应操作方法不得声明输出参数out、引用参数或返回值
  • 双工:wsDualHttpBinding,ServiceContract
    服务协定必须标明 CallbackContract = typeof(服务回调协定接口)
    属性,回调协定接口里的道标明 IsOneWay =
    true 属性

其三种办法的主干流程参见:WCF
通信模式;

欠部分通过一个简便的加法方法来打探 WCF 的双工通信方式:

[1].
服务端

第一给闹劳协定接口的代码,注意服务接口和劳务回调接口的命名方式

using System.ServiceModel;
namespace sqhWcfService
{
    [ServiceContract(SessionMode = SessionMode.Required,
        CallbackContract = typeof(IServiceAsyncCallback))]
    public interface IServiceAsync
    {
        [OperationContract(IsOneWay = true)]
        void AddTwoInteger(int a, int b);
    }

    [ServiceContract]
    public interface IServiceAsyncCallback
    {
        [OperationContract(IsOneWay = true)]
        void ReturnResult(int c);
    }
}

在服务端,需要实现服务协定接口的章程,服务协定回调接口的方以客户端实现。服务协定接口必须指明 SessionMode.Required 和
回调协定属性。注意接口命名格式,推荐: 服务协定回调接口 = 服务协定接口 + Callback 

using System.ServiceModel;
namespace sqhWcfService
{
    public class ServiceAsync : IServiceAsync
    {
        public void AddTwoInteger(int a, int b)
        {
            int result = a + b;
            Console.WriteLine("AddTwoInteger:{0}", result);
            IServiceAsyncCallback callback 
                = OperationContext.Current.GetCallbackChannel<IServiceAsyncCallback>();
            callback.ReturnResult(result);          
        }
    }  
}

注意,在 Web.config 文件 <system.serviceModel> 结点下上加如下结点

<services>
  <service name="sqhWcfService.ServiceAsync">       
    <endpoint address="ServiceAsync" binding="wsDualHttpBinding" contract="sqhWcfService.IServiceAsync" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>

在意,双工通信必须是 wsDualHttpBinding
绑定,该属性会建立两修绑定实现互动调用,也堪是 NetTcpBinding。

至今,服务端配置了,记录下服务之地址备用。

[2].
客户端

第一添加服务引用,命名吧:sqhWcfServiceReference,然后实现劳务回调接口的方

using sqhWcfClient.sqhWcfServiceReference;
namespace sqhWcfClient
{
    public class ServicAsyncCallback : IServiceAsyncCallback
    {
        public void ReturnResult(int c)
        {
            int result = c;
            Console.WriteLine("ReturnResult:{0}", result);
        }
    }
}

下面是实例化客户端、调用服务之代码

using sqhWcfClient.sqhWcfServiceReference;
namespace sqhWcfClient
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // 服务回调对象
            ServicAsyncCallback callbackObj = new ServicAsyncCallback();
            // 服务回调上下文,维护一个服务回调对象
            InstanceContext callbackInstance = new InstanceContext(callbackObj);

            // 利用上下文实例对象初始化代理客户端对象
            ServiceAsyncClient client
                = new ServiceAsyncClient(callbackInstance);

            client.AddTwoInteger(1, 2);
        }
    }
}

迄今,客户端代码配置了。运行客户端,即可调用服务方法好加法实现。为了查看异步调用的效力,可以重复客户端代码和服务端代码中上加延时。

翔实现信息参见:消息通信模式(下)-
双工;当 WCF
中落实双工通信深入明 –
Artech;

关于以
WCF服务库 提供服务

地方介绍的 WCF 服务全是经 VS新建项目 ->
WCF服务应用程序 的法提供劳务,此处介绍通过 VS新建项目 -> WCF服务库
的计提供服务并布置及 IIS 上。首先了解下 WCF服务应用程序 和 WCF服务库 的区分:

  • WCF服务应用程序 有单独的长河、是可以实施之次序,该档模板就因 IIS 托管
  • WCF服务库
    包含WCF服务及契约定义的类库、不克一直运行,需要宿主托管执行

其余区别的详细信息可以参见:[WCF Service Application -VS- WCF Service

图片 15

 

// CActivexDemoApp::InitInstance – DLL 初始化

    return bInit;
}

(10) 点击“下一致步”后,如下图 10
所显示,会唤起已到位数字签名向导,点击“完成”后还会提醒您输入私钥密码,就到位代码签名证书之代码签名。

本文转自:http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html

开篇语:最近在弄ocx控件发布到asp.net网站上以,就是用户以用过程被,自动下载安装ocx控件。(此文章也是总了网上广大总人口形容的文章,我只是汇总一下,加上有和谐的东西,在此间谢谢所有以网上发表相关内容的情人等。)

 

 

2.       输入项目名称为“ActiveXDemo”和项目位置。点击“确定”按钮,打开向导对话框。

图片 16

     WoSign代码签名证书之根证书链为:
UTN-USERFirst-Object- WoSign Code
Signing Authority

2.       展开“ActiveXDemoLib”项,选中“_DActiveXDemo”项。点击鼠标右键,选择“添加”下之“添加方法”。

  http://support.microsoft.com/kb/168371/en-us

8、单击”下一样步(N)”按钮,选择要进行数字签名的还早已做成CAB包的文件Dome.cab文件;

  http://support.microsoft.com/kb/161873/en-us

    
时间穿服务十分重要,添加时间戳后,即使你的代码签名证书已经晚点,但由你的代码是以关系有效期内签约的,则时间戳服务保证了这代码仍然可信,最终用户仍然可放心下载,使得即使代码签名证书已经过期,您吗无需重新签和再次发布就签约的代码。

图片 17

3、创建CER文件(公司关系),在命令执行遭输入”makecert -sk demo.pvk
demo.cer”,然后回车,如图8所著,若出现”Successed”提示,则会以E:\
demo目录下生成demo.cer文件;

图片 18

file-win32-x86=thiscab    
//告诉ie到乌去得这dll,file一共包括三单部分,第一有些是file,这个永远都是这样的(至少目前来说);第二有的报告声明支持之OS,win32意味着windows,mac就是苹果MAC  OX了;第三片凡是CPU类型,比如说x86、  ppc  (Power  PC)、  mips或者alpha了   
//其中“thiscab”是一个重要字,表示 CAB 包含此 DLL,也不过经过点名同久绝对要相对路径,从一个 HTTP 位置下载所用的 DLL,   
例如:  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL   
RegisterServer=yes    

图片 19图片 20代码

利用MFC开发ActiveX控件

  用VC5.0开发之这种控件,功能而扩展性强,理论及独立的VC5.0程序有所的功能,该控件都能实现,例如控件直接绘制浏览器,可以应用OpenGL等图库,图形图像功能强大。实时数码刷新频率理论及而上毫秒级,用户通过鼠标可以兑现各交互操作,如旋转、缩放,图2就是平等帧GL图形,并发出一个缩放工具条进行缩放操作。如果是当微机达见到,可以观看这几个三维图在时时刻刻转动。

  应该说,较好的开发工具可径直用API编程或应用ATL模板库,利用MFC开发ActiveX控件不是一个好之选择,因为控件运行需要MFC
DLL的支持。假如客户机器及无这些类库(这种场面十分少,但确有),第一次等下载就要花数时日。不过对此熟悉MFC的开发员来说,这些题材相对MFC提供的利来说还是好忽略的。

  由于VC5.0对ActiveX控件的付出提供了很多便利,所以开一个ActiveX控件并无像许多人想像中的那么紧复杂,通过VC
5.0的AppWizard,实现控件的主类从ColeControl类派生出,该类则是CWnd的一个子类,所以若可以像对窗口类编程一样对是主类编程。为了落实地方提及的效力,首先必要重载它的OnDraw函数加入消绘制的目标,加入Winsock类(CSocket或CAsyncSocket),以贯彻与后端数据服务器底通信。如果用因此OpenGL绘制丰富多彩的立体图,则使初始化GL环境。其他的做事就在于用户如何控制程序的调度,使得每职能都能正常办事都与其它一些正常通信。此外,后端服务器程序也使长对应为该控件的接口。

  这样的一个序编译通过后,就成一个可用于Web的控件,后缀名是OCX。按照前面叙述的方式将拖欠OCX置入主页,基本的工作就是成功。

  综上所述,利用VC5.0开发ActiveX控件用于Web浏览,主要发生以下几只性状:

  1.运用Winsock的通信机制,速度快、控制灵活、效率高;

  2.控件采用VC5.0编制,功能可扩展性很强;

  4.控件第一浅下充斥虽然稍费时间,但下载后便当用户机上注册,以后可径直调用,速度效率都好;

  5.ActiveX技术是微软腾飞的要,且早已改成当下软件发展之潮流所于,发展空间广阔;

  6.系统采用VC开发,可以利用就有的用C语言编制的网,开发工作量大大减少。

  Web页面的支出要分为三类:静态Web页面、半动态Web页面以及Client端动态页面。本文重点阐述基于ActiveX
Control(控件)动态实时页面的开支。

regsvr32 netshare.ocx        注册netshare.ocx控件

regsvr32 /u netshare.ocx    解除netshare.ocx控件的注册

 

图片 21

当Web页中入ActiveX 控件

在修改了IE的平安设置后,依然未可知调用控件的办法,需要拿做客的站点设置也“受信站点”,则正能够正常使用控件
在<html> 和<head>之间插入
<!– saved from url=(0017)http://localhost/ –>
虽说以IE窗口上方不见面弹有黄色提示条 。

  以HTML页面中行使ActiveX控件包含三单基本操作:将控件放入HTML中;将拖欠控件下充斥于用户;在用户机器及安该控件。如果只有是本着IE用户,在HTML中插ActiveX控件便比较简单;如果还要兼顾IE和Netscape用户,则使召开还多干活儿。大家知晓,HTML文件由文本和各种标志(tags)组成,ActiveX
控件对于IE在HTML中的标志是<OBJECT>,该标记有几个主要的参数特性,它们是:

  1.ID:为控件提供一个标识名称,为HTML代码提供平等栽访问该控件的章程。

  2.CLASSID:是拖欠控件唯一的UUID,告诉IE装入哪个目标。如果运用已经支付好的控件,它的CLASSID可以经过调用Win95还是NT下的施用Regedit来索。从开始菜单中运作该次,展开HKEY_CLASSES_ROOT项,可以看到仍字母顺序排列的注册表,找到需要采取的控件名,例如WClnt,展开时只是看一个CLSID文件夹,里面纵使是该控件的CLASSID。

  如果是友善用VC开发控件,该UUID可以于ActiveX控件项目受到的ODL(对象描述库)文件中找到;通过查阅控件的近乎消息注释来定位一定控件的UUID,例如,要找到CMyControl控件的UUID,则需找到以下代码:

  // Class information for CMyControl

  [uuid
(051C4748-1262-11D2-87C1-00A024D948FB),

  licensed,

  helpstring(“CmyControl Control”),
control ]

  uuid后面括号丁之始末就是是欠控件的UUID。

  3.CODEBASE:如果在用户机器及无控件的目前本,该参数告诉用户浏览器在哪而找到要下载的控件和新颖版本号.当控件作了改动后,可以还改版本号强制用户更下载。

  4.PARAM:该标记用于安装控件的起来属性值,它来点儿个特点:Name和Value,即属性名称和属性值。

  此外还有一部分符号,如:Width代表该控件所占有的宽,Height表示高度等,总体来说,这样一个插入控件的HTML代码和插Java
Applet的HTML代码非常相像。

  下面是一个嵌有ActiveX控件的HTML代码示例:

 

ID=“CMyControl”

CLASSID=“clsid:051C4748-1262-11D2-87C1-00A024D948FB

CODEBASE=“http://www.mysite.com.cn/ocxdir/mycontrol.ocx#version=1,0,0,1”

WIDTH=400

HEIGHT=200

ALIGN=center

HSPACE=0

VSPACE=0

  如果要控件还会当Netscape中运作,除了Netscape需加装插件外,HTML也使加以有外加标记,下面的例证中EMBED段就是也Netscape加上的。如果使用MFC开发OCX控件,则少数用户率先差做客时除了下载OCX文件外,还要下载相应的MFC
DLL,下载量变充分,这时可拿相关文件在服务器端打包改成可以以客户端起解压安装的CAB文件。经过修改后底HTML代码段如下:

<ALIGN=“CENTER” CLASSID=“clsid:

7BCA18C6-2178-11D2-87C1-00A024D948FB”

WIDTH=“1200” HEIGHT=“900” ID=“marquee”

CODEBASE=“http://218.168.188.188/scadaweb/

WClnt.cab#version=1,0,0,1”>

<EMBED
ALIGN=“CENTER”CLASSID=“clsid:7BCA18C6- 2178-11D2-87C1-00A024D948FB”

WIDTH=“1200” HEIGHT=“900” ID=“marqueequot;”

CODEBASE=“http://218.168.188.188/scadaweb/

WClnt.OCX#version=1,0,0,1”

TYPE=“application/oleobject” >

 

 

 

 

 

 

// CActivexDemoApp::ExitInstance – DLL 终止

[ActivexDemo.ocx]

[Add.Code]

 

请注意:不克惟签约CAB文件,CAB包被装有DLL文件还设先行签后还封装,再签字CAB文件,否则IE浏览器会显示为“未证明的发行者”而影响健康下,甚至杀毒软件会以为是毒而为剔除!如下图所出示之莫过于案例:

9、选择好CAB包后单击”下同样步(N)”按钮,在挑想如果的签类型里摘”自定议(C)”并单击”下同样步(N)”按钮;

图片 22

图片 23

(8) 如下图 8
所出示,要求填写该签名代码的效能描述,推荐一定要认真填写,因为此音将会以最终用户下载者代码时显示,有助于最终用户了解之代码的效力为确定是否下载安装。第一实践“描述”是乘是代码的效果文字描述,第二执“
Web
位置”则受最终用户点击文字描述来详细了解是代码的效益以及下方法齐,本演示着的“
Web 位置”为WoTrust代码签名证书简介页面:

16、完成,单击”下一致步(N)”按钮便可来数字签名向导的末段一步,即操作总览,如图26所展示,单击”完成”按钮便只是怪功告成;

 

(11) 现在,需要运用 chktrust.exe 来视察已经签约的代码, chktrust.exe
文件已打包在 signtool.rar饱受。进入
DOS 命令提示符,并跻身都签约的公文所在目录 ( 如:
d:\sign\TestCA.cab) ,键入命令: chktrust testcs.cab
,则会显示实际行使时以 IE 浏览器下载页面的景,如下图 11 所展示,对于Win
XP操作系统,会来得软件名称和发行者名称,其中软件名称即使是公在第(8)步输入的叙述,点击是称号即使链接到您当第(8)步填写的网址,而点击发行者名称,则会来得你的签名信以及时戳信息。对于Win2000操作系统,则有些有不同,第
1
行的红线部分即是光阴戳记录的签约时之地头时间,请留意:此日不是抱签名电脑的日子,而是提供日戳服务的服务器计算出来的署名电脑安装的处处时区的地方时间。第
1 行蓝色文字虽是在第 8 步着输入的叙说文字,点击是蓝色文字虽可拜于第
8 步着输入的 Web 描述页面。第 2
行蓝色文字虽也该代码的发行者,也便是代码签名证书的申请者(拥有者)(
如:深圳市沃通电子商务服务有限公司) ,点击可以翻证书之详细信息;第 2
行有革命下划线部分显得“发行商可靠性由 WoSign Code Signing Authority 验证
”就是者代码签名证书的证件颁发者。

  ActiveX于远程IE页面上实行,需要实现平安接口。

5、创建INF文件,用笔记本编辑以下信息:

当VS2005还是VS2008安后意识路**VC7\Common7\Tools\Bin\生出为数不少粗器,我本着含蓄Cert的文件较感兴趣。经过研究,发现是有关证件与签约的,当然,该证件未吃证明认证部门承认。下面列出这些工具与自我的施用体验。
1。Makecert.exe —证书创建工具
2。Cert2Spc.exe —发行者证书测试工具
3。Signcode.exe —文件签字工具(VS2008带动的凡signtool)

    
时间穿服务非常重要,添加时间戳后,即使你的代码签名证书已经过,但由你的代码是以关系有效期内签署的,则时间戳服务包了之代码仍然可信,最终用户仍然可以放心下载,使得即使代码签名证书已经晚点,您为随便需还签和再次公布就签署的代码。

图片 24

 

sk-代表主题的潜在钥容器位置,is-颁发者的证书存储名称,
n-证书颁发对象,ic-颁发者的证明存储位置,-$-授权范围(用于代码签名);

ActiveX控件用于Web的长河是用控件嵌入主页中,用户通过浏览器访问该主页时,将主页中之控件下载,并在用户机器上登记,以后就是不过于用户之浏览器上运行。控件下充斥同赖后虽驻留于用户本地机械上,下次重拜同之主页时,可不再下充斥该控件,而是直接运行用户本地的控件。这里控件容器就是浏览器,用户不需要经浏览器调用控件的属性或措施。因此,开发面向Web的ActiveX控件比付出桌面的控件还要简单些,所复杂的凡怎样以欠控件很好地停放主页,使用户会正常浏览。下面介绍是问题。

BOOL CActivexDemoApp::InitInstance()
{
    BOOL bInit = COleControlModule::InitInstance();

图片 25

图片 26

CActivexDemoApp theApp;

 图片 27

 ActiveX打包与颁布

图片 28

4、创建SPC测试软件出版商证明书,在指令执行被输入”cert2spc demo.cer
demo.spc”,然后回车;

 (3) 如下图 3
所展示,点击“从文本选择”签名证书 ( 公钥文件 ),如: WotoneCS.spc :

依照使用指南演示如何利用WoSign代码签名证书来给微软代码签名,Thawte和VeriSign代码签名证书吗是用相同方式,只是用不同的时刻戳URL。

图片 29

图片 30

二.        添加控件方法

VC2005会为咱自行创建好MFC
ActiveX程序框架,我们要被该ActiveX控件添加方法即可。现在咱们被控件添加一个“AddFun”方法,这个法子是将简单个数相加并回到结果。

图片 31

 

1.       打开VS2005新建MFC项目。这里我们取名为“ActiveXDemo”。

图片 32

signature=”$CHICAGO$”

 

图片 33

 

图片 34

// 创建组件种类    
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription) 
{    
    ICatRegister* pcr = NULL ;    
    HRESULT hr = S_OK ;    
    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    
    if (FAILED(hr)) return hr;    
    // Make sure the HKCR\Component Categories\{..catid…}    
    // key is registered.    
    CATEGORYINFO catinfo;    
    catinfo.catid = catid;    
    catinfo.lcid = 0x0409 ; // english    
    // Make sure the provided description is not too long.    
    // Only copy the first 127 characters if it is.    
    int len = wcslen(catDescription);    
    if (len>127) len = 127;    
    wcsncpy(catinfo.szDescription, catDescription, len);    
    // Make sure the description is null terminated.    
    catinfo.szDescription[len] = ‘\0’;    
    hr = pcr->RegisterCategories(1, &catinfo);    
    pcr->Release();    
    return hr;    
}  

ActivexDemo.ocx=ActivexDemo.ocx

图片 35

3.       选择“控件设置”选项卡,具体装可参照达图。其它选项卡为默认设置。最后点击“完成”按钮保存设置。

图片 36

    if (bInit)
    {
        // TODO: 在是添加你自己之模块初始化代码。
    }

15、现大部份工作且早已好,在联网下的同一步当中是可选的操作,其意图只是吧CAB加入时间穿,此步骤完全可以不举行,VeriSign: 
http://timestamp.verisign.com/scripts/timstamp.dll;

下面是微软代码签名证书(.pvk/.spc)签名指南的以身作则

 (9) 点击“下一致步”后,如下图 9
所显示,选中“将时刻戳添加到数中”,请动:

 

  在ATL写的ActiveX中,用IObjectSafety。

 三、MFC Activex 安全问题:

图片 37

 

    
用户以在线申请代码签名证书时会变证书私钥文件,如:myCert.pvk,而代码签名证书成功发布后的证件文件也公钥文件,如:myCert.spc,又如:软件发行证书(Software
Publishing Certificate) 。
代码签名证书一般都是应用公钥和私钥分离的个别独公文方式,适合为 DOS
命令行方式的代码签名。如果你而愿意将代码签名证书导入到Windows证书存储区中,从而简化签名操作,请参考:不同证格式转换指南。

(2) 点击“下一致步”后,如下图 2
所示,会要求你选择“签名类型”,缺省的“典型”签名类型;请捎“自定义”
签名类型:

  mfc实现之ocx,要于app实现文件被包括个别独文件:

图片 38

3、       最后生成项目,ocx控件便来了。 

图片 39图片 40代码

 

4.       其它为默认设置,点击“完成”按钮完成增长方法。接下来我们开拓“解决方案资源管理器”打开“ActiveXDemoCtrl.cpp”文件。

     (1) 运行 Signcode.exe , 要求您选择得签的文书,支持:可执行文件
(*.exe; *.dll; *.ocx) ; Cabinet 打包文件 (*.cab) 和目录文件
(*.cat) ,如下图 1 所示 ( 如: TestSign.cab)
,请留意:如果签名的文件已经来数字签名,则会叫新的署名覆盖:

 1、在默认环境下,编译的MFC
Activex控件,只能于当地代码中运作,即当http://localhost/xxx/xxx.htm中执行,而在http://127.0.0.1/xxx/xxx.htm中提示无相关属性,需要设置其初始化和脚本运行的安全性

图片 41

WoSign 免费供的辰穿服务URL:
http://timestamp.wosign.com/timestamp

图片 42

6、创建CAB文件,在命令执行中输入”cabarc -s 6144 n demo.cab atl90.dll
Polygon.dll demo.inf”,-s
选项表示在压缩文件中保存用于代码签名的半空中,n命令指定想创建 CAB
文件,然后回车;

 

图片 43

(7) 点击“下一致步”后,如下图 7
所著,选择怎么关系包括到数字签名中,直接点击“下一致步”即可,即挑短省之连根证书:

AdvancedINF=2.0

13、在”证书路径中的证书”中精选”证书路径中之拥有证件,包括根证书(C)”,在”其它证书(可选)”中选择”包括于以下PKCS
#7
证书(.p7b)文件被的关系(P):”,并单击”浏览(R)…”按钮选择demo.spc文件,选择了后单击”下同样步(N)”按钮;

int CActivexDemoApp::ExitInstance()
{
    // TODO: 在这个添加而自己之模块已代码。

    使用微软的 SignCode.exe
就可本着微软的代码进行签字,如果您没有是文件,点击
这里下载。 Signcode.exe 可以以 DOS
命令行方式实现签约,我们引进用户用数字签名向导方式,简单好。请小心:如果你支付的ActiveX为IE加载项,请先数字签名每个CAB文件被的.dll和.ocx等文件,再将这些文件包成.cab文件后再也数字签名.cab文件,以保有IE加载项都被IE验证和亲信,否则会展示“未证明”而可能影响健康运作。

实时动态页面的贯彻方案

  对实时动态页面的渴求多来为一些渴求自动更新实时数据的运中,如电网监控、股市监测等。具体求是:用户仅待选择希望浏览的图片,但不管需与操作,该图就可知依据实时数量不断更新,用户总能观察到最新事态。

  要落实上述作用,结构及起三三两两种方案:一栽是安一个中介服务器,该服务器作为控件和后台系统信息交流的中介;另一样种是勿设中介服务器,但每当提供实时数据的后台服务器上留下有供控件通信用的数量接口,控件可以直接打后台服务器上定时收获当前实时数码。按数量提供方分割吧闹些许栽:一栽是出于客户端定时向服务器发出请求,指明要之实时数据,服务器收到请求后拿满足请求的动态数据发送到相应客户;另一样种植是客户端只请一不行,服务器端便定时用满足请求的实时数据传客户端,直到客户转换要显得的图样或已刷新。上述各方案还来夫长和局限,在采取被但是考虑实际情形使用相应方案。

  工作流程也:用户先从Web服务器上下载包含ActiveX
控件的网页,控件随即于客户机上注册运行,并通过Winsock同中介服务器或直接和提供实时信息的网,如股票信息网相连接,定时取得动态实时数据,并刷新显示。在是体系中,客户发出点儿久线获得消息,一久凡与Web
Server的总是,从立条线上用户访问主页;另一样长条就是控件和后台信息网的连续,从马上漫长线路上用户可看实时数据。后同漫漫路线因此Winsock建立,传输速度远超前一模一样修线,且控制灵活、效率高,不跟主页下充斥争资源。通过就漫漫路线,用户甚至足以传递远程控制信息实现遥控操作。

3.       打开添加道向导窗口。因为咱们是丰富一个加法方法,所以我们设置的归来路也LONG型,方法名设为AddFun,添加两单LONG类型参数Add1,Add2。

图片 44

14、接下去当弹出的”数据描述”窗口中输入公司的名称和网址并单击”下一样步(N)”按钮;

// 注册组件种类    
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
 {    
    // Register your component categories information.    
    ICatRegister* pcr = NULL ;    
    HRESULT hr = S_OK ;    
    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    
    if (SUCCEEDED(hr)) {    
      // Register this category as being “implemented” by the class.    
      CATID rgcatid[1];    
      rgcatid[0] = catid;    
      hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);    
    }    
    if (pcr != NULL) pcr->Release();    
    return hr;    
}    
// 卸载组件种类    
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
 {    
    ICatRegister* pcr = NULL ;    
    HRESULT hr = S_OK ;    
    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,    
            NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    
    if (SUCCEEDED(hr)) {    
      // Unregister this category as being “implemented” by the class.    
      CATID rgcatid[1] ;    
      rgcatid[0] = catid;    
      hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);    
    }    
    if (pcr != NULL) pcr->Release();    
    return hr;    
}    
STDAPI DllRegisterServer(void) 
{    
    HRESULT hr;    
    AFX_MANAGE_STATE(_afxModuleAddrThis);    
    if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))    
        return ResultFromScode(SELFREG_E_TYPELIB);    
    if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))    
        return ResultFromScode(SELFREG_E_CLASS);    
    // 标记控件初始化安全.    
    // 创建初始化安全组件种类    
    hr = CreateComponentCategory(CATID_SafeForInitializing, L”Controls safely initializable from persistent data!”);    
    if (FAILED(hr)) return hr;    
    // 注册初始化安全    
    hr = RegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForInitializing);    
    if (FAILED(hr)) return hr;    
    // 标记控件脚本安全    
    // 创建脚本安全组件种类    
    hr = CreateComponentCategory(CATID_SafeForScripting, L”Controls safely scriptable!”);    
    if (FAILED(hr)) return hr;    
    // 注册脚本安全组件种类    
    hr = RegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForScripting);    
    if (FAILED(hr)) return hr;    
    return NOERROR;    
}    
// DllUnregisterServer – Removes entries from the system registry    
STDAPI DllUnregisterServer(void) 
{    
    HRESULT hr;    
    AFX_MANAGE_STATE(_afxModuleAddrThis);    
    if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))    
        return ResultFromScode(SELFREG_E_TYPELIB);    
    if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))    
        return ResultFromScode(SELFREG_E_CLASS);    
    // 删除控件初始化安全入口.    
    hr=UnRegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForInitializing);    
    if (FAILED(hr)) return hr;    
    // 删除控件脚本安全入口    
    hr=UnRegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForScripting);    
    if (FAILED(hr)) return hr;    
    return NOERROR;    
}  

图片 45

clsid={468E4531-F890-47EC-8368-3BDA4448FF08}    
//“clsid”是快要安装的控件的 CLSID  
DestDir=11    
//它的价是dll将要存到本地硬盘的职位,如果她的价值是10,则拿dll放到\Windows或者\WinNT下;如果是11,则放到\Windows\System或者\WinNT\System32下;如果不指定其他 DestDir(典型气象),则代码安装在一贯的 OCCACHE 目录中。  
FileVersion=1,0,0,1
//说明了atl90.dll的版本号   

7、使用Code Signing Wizard签署一个CAB文件,在控制高输入signtool
signwizard 进入及signtool窗体中;

2、设置项目属于性 将配备型设置成静态库(.lib)

 

    具体签名向导过程如下:

  (5) 点击“下同样步”后,如下图 5
所著,会提示要求输入私钥密码:

 

12) 点击“是”或“运行”,则会提示“ TestSign.cab: Succeeded ”表示代码
TestSign.cab
签名验证有效,可以停放网站及了。请留心:签名后的CAB文件放到网站上急需采取
object 方式。

#include “stdafx.h”
#include “ActivexDemo.h”
#include <comcat.h>    
#include <objsafe.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

5.       打开代码视图,我们见面发现VC2005业已也咱加加了一个“AddFun”方法,我们在法外增补加“return Add1 +
Add2;”语句。

    return COleControlModule::ExitInstance();
}

一如既往、ActiveX发布步骤

  在MFC写的ActiveX中,直接修改注册表。

sk-代表主题的暧昧钥容器位置,ss-主题的关系存储名称,
n-证书颁发对象,r-证书存储位置;

  

10、接下单击”从文本选择(F)”按钮,选择刚刚做的demo.cer;

   (6) 点击“下一致步”后,如下图 6
所出示,会唤醒要求选择散列算法 ( 摘要算法、缩微图算法 ) ,缺省为 sha1
,也可以选 md5 :

const GUID CDECL BASED_CODE _tlid =
        { 0x344B8576, 0xAB2C, 0x4D38, { 0xAE, 0x7, 0x73, 0x74, 0x22, 0x89, 0x72, 0xEA } };
const WORD _wVerMajor = 1;
const WORD _wVerMinor = 0;

如今控件便足以在自登记时即注册也安全控件了。

12、在单击“下一致步(N)”按钮,然后在散列算法中精选“shal”,并单击“下一样步(N)”按钮。

每当此大概说明下,打包activeX需要做证书,具体用到makecert 、cert2spc
、signtool
这三个VS提供的工具,工具在VS文件夹里面,以下制作过程要以工具所在的文本夹下做到!
1、单击”开始”–>”运行(R)”–>输入”cmd”–>回车–>进入到操作的控件所在的目(需要用上面所说的工具,和ocx控件放到一个文书夹下);
2、创建PVK文件(私人密匙文件),在命令执行被输入”makecert -sk demo demo.pvk
-n CN=XXXXXXX公司”,然后回车;

图片 46

 

WoSign 免费提供的岁月穿服务URL:
http://timestamp.wosign.com/timestamp

 在ActivexDemo.cpp 文件被落实以下措施

11、在单击”下一样步(N)”,然后择”CSP中之私钥(K)”;

图片 47

   (4) 点击“下一致步”后,如下图 4
所展示,会要求您选择私钥文件,如: WotoneCS.pvk ,其他参数不用动:

一.        创建MFC ActiveX项目

图片 48