ISAPI 是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ISAPI 是啥相关的知识,希望对你有一定的参考价值。

ISAPI 是什么
哪为高手解释一下

参考技术A 可以翻译作"网络脚本应用程序接口"吧.

ISAPI = Internet Script Application Program Interface

简单地讲,就是让某一扩展名由指定的应用程序(或应用程序扩展)来接管.由应用程序接管的,扩展名为.exe,由应用程序扩展接管的,扩展名为.dll

你可以在Internet 信息服务(IIS)管理器中找到它.
在某一网站上点右键,属性,主目录,配置.在"映射"选项卡中可以看到.

例如:ASP对应的ISAPI映射为:"%SYSTEMROOT%\inetsrv\asp.dll"
参考技术B 是语言解释器
一般是.dll结尾
比如php的isapi就是在PHP安装里有
CGI就是PERL.DLL

在 ISAPI 过滤器中,用于多个进程的公共日志文件的好方法是啥?

【中文标题】在 ISAPI 过滤器中,用于多个进程的公共日志文件的好方法是啥?【英文标题】:In an ISAPI filter, what is a good approach for a common logfile for multiple processes?在 ISAPI 过滤器中,用于多个进程的公共日志文件的好方法是什么? 【发布时间】:2009-10-02 19:08:07 【问题描述】:

我有一个在 IIS6 或 7 上运行的 ISAPI 过滤器。当有多个工作进程(“Web garden”)时,过滤器将被加载并在每个 w3wp.exe 中运行。

如何有效地允许过滤器将其活动记录在单个合并日志文件中?

来自不同(并发)进程的日志消息不得相互干扰。换句话说,从任何 w3wp.exe 发出的单个日志消息必须在日志文件中实现为单个连续行。

日志文件的争用应该最小。这些网站每秒可以处理 100 个请求。

首选严格的时间顺序。换句话说,如果 w3wp.exe 进程 #1 在 t1 发出一条消息,然后进程 #2 在 t2 发出一条消息,然后进程 #1 在 t3 发出一条消息,则这些消息应该以正确的时间顺序出现在日志文件中。

我目前的方法是每个进程都拥有一个单独的日志文件。这有明显的缺点。

一些想法:

指定 w3wp.exe 之一为“日志文件所有者”,并通过该特殊进程发送所有日志消息。这在工作进程回收的情况下存在问题。

使用操作系统互斥锁来保护对日志文件的访问。这足够高性能吗?在这种情况下,每个 w3wp.exe 在同一个文件系统文件上都有一个 FILE。每次写入后我必须刷新日志文件吗?这行得通吗?

有什么建议吗?

【问题讨论】:

【参考方案1】:

起初我想说我最喜欢你当前的方法,因为每个进程都不共享任何内容,然后我意识到,嗯,它们可能都在下面共享同一个硬盘驱动器。因此,仍然存在发生争用的瓶颈。或者操作系统和硬盘控制器在处理这些方面真的很聪明?

我认为您想要做的是让日志的写入不会减慢正在执行实际工作的线程。

所以,在同一台机器上运行另一个进程(较低优先级?),它实际上将日志消息写入磁盘。不使用建议的 UDP 与其他进程通信,而是使用进程共享的内存。令人困惑的是,也称为内存映射文件。更多关于memory mapped files。在我的公司,我们发现内存映射文件比环回 TCP/IP 在同一个机器上进行通信要快得多,所以我假设它也会比 UDP 快。

对于初学者来说,您在共享内存中实际拥有的可能是一个 std::queue,其中使用互斥锁保护推送和弹出。您的 ISAPI 线程将抓取互斥体以将内容放入队列中。日志记录过程将获取互斥体以将事物从队列中拉出,释放互斥体,然后将条目写入磁盘。互斥锁只保护共享内存的更新,而不是文件的更新,所以理论上互斥锁的持有时间更短,造成的瓶颈更少。

日志记录过程甚至可以重新安排其写入内容的顺序以按顺序获取时间戳。

这是另一个变体:继续为每个进程拥有一个单独的日志,但在每个进程中都有一个记录器线程,以便主时间关键线程不必等待记录发生即可继续其工作。

我在这里写的所有内容的问题在于,整个系统——硬件、操作系统、多核 CPU L1/L2 缓存的工作方式、你的软件——太复杂了,无法通过简单的思考来轻松预测。编写一些简单的概念验证应用程序,为它们设置一些时间,然后在真实硬件上试用它们。

【讨论】:

【参考方案2】:

在这里记录到数据库有意义吗?

【讨论】:

登录到数据库将完全解决我的问题,除了它会引入一个新问题:对数据库的依赖。所以我不想使用数据库,甚至是 MSMQ,它是免费的,但并不总是安装。【参考方案3】:

我过去使用过基于 UDP 的日志记录系统,我对这种解决方案很满意。

日志通过 UDP 发送到日志收集器进程,该进程负责定期将其保存到文件中。

我不知道它是否可以在您的高性能环境中工作,但我对在压力较小的应用程序中的解决方案感到满意。

希望对你有帮助。

【讨论】:

这是 UNIX 处理日志的方式。 syslogd 守护进程侦听 UDP 并写入一个(或多个,取决于配置)文本文件,每次我使用它时似乎都没有任何问题(包括当进程失控和垃圾邮件 syslog 时)。跨度> 【参考方案4】:

您可以使用带有 LockFile() 和 UnlockFile() 的 Win32 文件锁定机制,而不是使用 OS Mutex 来控制对文件的访问。

【讨论】:

【参考方案5】:

我的建议是将消息异步 (UDP) 发送到负责记录日志的进程。 该过程将: - 一个线程接收器将消息放入队列中; - 一个线程负责从队列中删除消息,放入时间排序列表中; - 列表中只有一个线程监控消息,并且只有时间长度大于最小值的消息才应保存在文件中(以防止延迟消息被无序写入)。

【讨论】:

【参考方案6】:

您可以继续记录到单独的文件,然后查找/编写一个工具以稍后合并它们(可能是自动的,或者您可以在要使用文件的时候运行它。)

【讨论】:

【参考方案7】:

Event Tracing for Windows,包含在 Windows Vista 及更高版本中,为此提供了很好的功能。

摘录:

Windows 事件跟踪 (ETW) 是一种高效的内核级跟踪工具,可让您将内核或应用程序定义的事件记录到日志文件中。您可以实时或从日志文件中使用事件,并使用它们来调试应用程序或确定应用程序中出现性能问题的位置。

【讨论】:

以上是关于ISAPI 是啥的主要内容,如果未能解决你的问题,请参考以下文章

win7 IIS管理其中没有“ISAPI 和 CGI 限制”选项是啥原因?

在asp.net中aspnet_filter.dll文件和aspnet_isapi.dll文件的作用各是啥

[Windows] IIS6 部署ISAPI

从 mod_rewrite 到 isapi_rewrite

海康isapi协议原理学习(Intelligent Security API 智能安全API)

[Windows] IIS7.5 部署ISAPI