`
ruilin215
  • 浏览: 1143196 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

试用EF开发WEB应用程序(8): CGI环境变量

阅读更多

题记:用“易语言.飞扬”(EF)开发WEB应用程序,此前还没有先例。但因为EF本地开发包(EFNDK)已经发布,用C/C++开发一个EF类库,使其支持EF开发WEB应用程序,应该并非难事。当然也可想而知,其中必有诸多难点有待解决。此系列文章,为本人探索过程之记录,对外人未必有多大价值。如有网友乐观其事,还请理性待之。作者:liigo。转载请务必注明出处:http://blog.csdn.net/liigo/在线留言


试用EF开发WEB应用程序(8):CGI环境变量

  FastCGI 是对 CGI 技术的扩展和改进,要写好 FastCGI / CGI 程序,了解、熟悉、深入掌握“CGI环境变量”是必需的。本文将重点介绍CGI规范中规定的标准环境变量,以及FastCGI扩展的环境变量。

  在 CGI / FastCGI 规范中,WEB服务器和CGI/FastCGI程序之间交流信息的主要途径是环境变量(以及标准输入输出流)。这里说到的环境变量,是指操作系统中的环境变量。(Windows系统下,PATH 是很常见的一个环境变量;熟悉JAVA的朋友通常都知道一个叫 CLASSPATH 的环境变量;学“易语言.飞扬”(EF) 的哥们也肯定听说过 EF_LIB_PATHS 这个环境变量;……) CGI规范对CGI程序中使用的环境变量名称及其含义做了具体而明确的规定,通常把这些环境变量称为“CGI环境变量”。

下表:CGI环境变量及其介绍

CGI 环境变量名称 说明
REQUEST_METHOD 请求类型,如 "GET" 或 "POST"
CONTENT_TYPE 被发送数据的类型
CONTENT_LENGTH 客户端向标准输入设备发送的数据长度,单位为字节
QUERY_STRING 查询参数,如 "id=10010&sn=liigo"
SCRIPT_NAME CGI脚本程序名称,如 "/xyz.efcgi"
PATH_INFO CGI脚本程序的附加路径
PATH_TRANSLATED PATH_INFO对应的绝对路径
REMOTE_ADDR 发送此次请求的主机IP
REMOTE_HOST 发送此次请求的主机名
REMOTE_USER 已被验证合法的用户名
REMOTE_IDENT WEB服务器的登录用户名
AUTH_TYPE 验证类型
GATEWAY_INTERFACE 服务器遵守的CGI版本,如 "CGI/1.1"
SERVER_NAME 服务器主机名、域名或IP
SERVER_PORT 服务器端口号
SERVER_PROTOCOL 服务器协议,如 "HTTP/1.1"
SERVER_SOFTWARE 服务器软件的描述文本
DOCUMENT_ROOT 文档根目录
HTTP_ACCEPT 客户端可以接收的MIME类型,以逗号(,)分隔
HTTP_USER_AGENT 发送此次请求的WEB浏览器
HTTP_REFERER 调用此脚本程序的文档
HTTP_COOKIE 获取COOKIE键值对,多项之间以分号(;)分隔,如 "key1=value1; key2=value2"

下表:FastCGI 扩展的环境变量

FastCGI 环境变量名称 说明
FCGI_ROLE 当前 FastCGI 程序担任的角色,如 "RESPONDER", "AUTHORIZER", "FILTER"
FCGI_DATA_LENGTH 服务器发送的数据长度。仅当 FCGI_ROLE 值为 "FILTER" 时有效。
FILE_LAST_MOD 输入文件(input file)的最后修改时间,其值为自1970年1月1日零时零分零秒(世界标准时间,UTC)至今的秒数。仅当 FCGI_ROLE 值为 "FILTER" 时有效。

  对于以上所有 CGI 环境变量,和 FastCGI 扩展的环境变量,EF类库 fastcgi.efn 中的 FCGI 类均提供同名属性方法,用于读取该环境变量的值。一般来说,这些方法返回文本数据;只有几个例外,是返回整数数据:CONTENT_LENGTH(), FCGI_DATA_LENGTH(), FILE_LAST_MOD()。

  此外,WEB服务器通常也会扩展一些环境变量,这种情况下,可用EF类库 fastcgi.efn 中提供的FCGI.getenv() 方法读取任意指定名称的环境变量的值。

  下面,我们用EF写一个WEB程序,列出以上所有CGI环境变量及其内容,亲身感受一下CGI环境变量的真实面目,以便加深对它们的理解:

引入fastcgi;

公开类启动类
{
常量文本s
=["Content-type:text/html

<html><head>
<metahttp-equiv="content-type"content="text/html;charset=utf-8">
<title>$(title)</title>
</head>
<body>
<h1>$(title)</h1>
<hr></hr>
<h3>PARAMS:</h3>
<p>$(params)</p>
<hr></hr>
<h3>CGIENVVARS:</h3>
<p>$(cgivars)</p>
<hr></hr>
<p>byliigo,index:$(index)</p>
</body>
</html>
"];

公开静态启动()
{
intcount=0;
FCGIfcgi
=newFCGI;
while(fcgi.Accept()>=0)
{
文本t=s.替换全部("$(title)","CGIVARS(byliigo)");
t
=t.替换("$(params)",get_params(fcgi));
t
=t.替换("$(cgivars)",get_cgivars(fcgi));
t
=t.替换("$(index)",count.到文本());
fcgi.Output(t.到UTF8());
count
++;
}
}

staticstringget_params(FCGIfcgi)
{
strings;
foreach (fcgi.QUERY_STRING_NAMES(),文本name)
{
s
+="<p>"+name+":"+fcgi.QUERY_STRING(name)+"</p>";
}
returns;
}

staticstringget_cgivars(FCGIfcgi)
{
strings;

s
+="<p>REQUEST_METHOD:"+fcgi.REQUEST_METHOD+"</p>";
s
+="<p>CONTENT_TYPE:"+fcgi.CONTENT_TYPE+"</p>";
s
+="<p>CONTENT_LENGTH:"+fcgi.CONTENT_LENGTH.到文本()+"</p>";
if(fcgi.CONTENT_LENGTH>0)
{
binarycontent
=fcgi.ReadData(fcgi.CONTENT_LENGTH);
s
+="<p>CONTENT:"+content.到文本()+"</p>";
s
+="<p>CONTENT(text):</p><p>"+content.UTF8到文本().替换全部(" ","<br/>")+"</p>";
}
s
+="<p>QUERY_STRING:"+fcgi.QUERY_STRING+"</p>";
s
+="<p>QUERY_STRING_NAMES:"+fcgi.QUERY_STRING_NAMES().到文本()+"</p>";
s
+="<p>QUERY_STRING_UNDECODED:"+fcgi.QUERY_STRING_UNDECODED+"</p>";
s
+="<p>SCRIPT_NAME:"+fcgi.SCRIPT_NAME+"</p>";
s
+="<p>PATH_INFO:"+fcgi.PATH_INFO+"</p>";
s
+="<p>PATH_TRANSLATED:"+fcgi.PATH_TRANSLATED+"</p>";
s
+="<p>REMOTE_ADDR:"+fcgi.REMOTE_ADDR+"</p>";
s
+="<p>REMOTE_HOST:"+fcgi.REMOTE_HOST+"</p>";
s
+="<p>REMOTE_USER:"+fcgi.REMOTE_USER+"</p>";
s
+="<p>REMOTE_IDENT:"+fcgi.REMOTE_IDENT+"</p>";
s
+="<p>AUTH_TYPE:"+fcgi.AUTH_TYPE+"</p>";

s
+="<p>GATEWAY_INTERFACE:"+fcgi.GATEWAY_INTERFACE+"</p>";
s
+="<p>SERVER_NAME:"+fcgi.SERVER_NAME+"</p>";
s
+="<p>SERVER_PORT:"+fcgi.SERVER_PORT.到文本()+"</p>";
s
+="<p>SERVER_PROTOCOL:"+fcgi.SERVER_PROTOCOL+"</p>";
s
+="<p>SERVER_SOFTWARE:"+fcgi.SERVER_SOFTWARE+"</p>";
s
+="<p>DOCUMENT_ROOT:"+fcgi.DOCUMENT_ROOT+"</p>";

s
+="<p>HTTP_ACCEPT:"+fcgi.HTTP_ACCEPT+"</p>";
s
+="<p>HTTP_USER_AGENT:"+fcgi.HTTP_USER_AGENT+"</p>";
s
+="<p>HTTP_REFERER:"+fcgi.HTTP_REFERER+"</p>";
s
+="<p>HTTP_COOKIE:"+fcgi.HTTP_COOKIE+"</p>";

s
+="<p>FCGI_ROLE:"+fcgi.FCGI_ROLE+"</p>";
s
+="<p>FCGI_DATA_LENGTH:"+fcgi.FCGI_DATA_LENGTH.到文本()+"</p>";
s
+="<p>FILE_LAST_MOD:"+fcgi.FILE_LAST_MOD.到文本()+"</p>";

returns;
}
}

下图是以上程序的执行结果(左图由URL提交,右图由FORM提交(<form action = "cgivars.efcgi" method="post" enctype="multipart/form-data">)),近距离感受它们吧(点击放大图片):

 

参考:

http://www.fastcgi.com

http://hoohoo.ncsa.uiuc.edu/cgi/

下篇预告:???


一点题外话:上面提到JAVA使用了一个叫 CLASSPATH 的环境变量,我一直觉得这个环境变量的名称取得“太霸道”,你凭什么把这样一个“通用名称”占用了呀,怎么说也该加上一个"JAVA" 或 "J" 前缀吧:JAVA_CLASSPATH, J_CLASSPATH。要不然,后面再出来几个编程语言,也需要使用“类路径”之类的环境变量的话,让人家做何选择?呵呵。相对来说,“易语言.飞扬”就厚道一些,使用了“EF_LIB_PATHS”,加了自己的前缀(EF)。

分享到:
评论

相关推荐

    全堆栈ASP。NET核心(.NET 8)web应用程序,具有CRUD、N轮胎体系结构、验证功能.zip

    ASP.NET Core是微软开发的一个开源、跨平台的框架,用于构建高性能、现代化的互联网规模的应用程序。在这个全堆栈的ASP.NET Core项目中,我们关注的是.NET 8版本,它带来了许多新特性和性能改进。这个项目展示了如何...

    基于.netCore 6 +EF 实现webApi增删查改基础应用,开箱即用

    只需更改`appsettings.json`或环境变量中的数据库连接字符串,这个项目就可以在不同环境中运行。 总结来说,`.NET Core 6 + EF`的组合提供了高效且灵活的Web API开发体验。通过上述步骤,你可以快速搭建起一个可...

    EFCore+WebAPi增删改查

    在本项目中,"EFCore+WebApi增删改查"是一个使用Entity Framework Core(简称EFCore)和Web API技术构建的.NET应用示例。这个框架主要用于演示如何通过Web服务接口进行数据操作,如添加、删除、修改和查询,前端展示...

    asp.net源码:WebSamples,是WEB程序开发的好示例。

    ASP.NET 是微软公司推出的用于构建动态网站、Web应用程序和Web服务的一种强大框架。WebSamples 是一个包含多个ASP.NET示例的集合,它为开发者提供了学习和理解ASP.NET特性和功能的宝贵资源。在这个压缩包中,...

    使用C#开发数据库应用程序系统ACCP8.0

    在IT行业中,数据库应用程序系统是不可或缺的一部分,它们用于存储、管理和检索数据,为各种业务...对于希望在IT领域从事数据库应用开发的人员来说,“使用C#开发数据库应用程序系统ACCP8.0”是一次宝贵的学习经历。

    一个应用.Net中C#技术开发的实用Web案例

    在.NET框架下,C#是一种广泛使用的编程语言,尤其在开发Web应用程序时。这个案例——"一个应用.Net中C#技术开发的实用Web案例",展示了如何利用C#的强大力量来构建一个功能完善的B2C(Business to Consumer)在线...

    【ASP.Net Core Web应用程序】 创建数据库

    ASP.NET Core Web应用程序是Microsoft开发的一个跨平台的框架,用于构建现代、高性能的Web应用。在本场景中,我们关注的重点是如何在ASP.NET Core中创建数据库。这通常涉及到使用Entity Framework Core (EF Core),...

    ASP.NET数据库应用程序开发教程

    ASP.NET Core同样支持数据库应用开发,并与EF Core紧密结合。 九、部署与调试 在完成ASP.NET数据库应用程序的开发后,可以通过IIS或IIS Express进行本地或远程部署。Visual Studio集成的调试工具能帮助开发者定位并...

    Dome-ASP.NET CORE 6 webapi 使用 EF DBFirst 配合 sql server

    ASP.NET Core 6 WebAPI与Entity Framework (EF) DBFirst结合使用是开发高效、数据库驱动的Web服务的常见方法。这个技术栈允许开发者利用SQL Server的强大功能,同时借助EF简化数据访问层的实现。以下是对这个主题的...

    Asp.Net Core Web应用程序入门源码

    这个源码包“KibaAspNetCore-master”是针对初学者设计的,旨在帮助他们理解并入门Asp.Net Core Web应用程序的开发。 1. **Asp.Net Core基础** Asp.Net Core是对经典Asp.Net的重构,它采用模块化设计,允许开发者...

    Laborator-DAW:实验室和材料-Web应用程序开发

    实验室和材料-Web应用程序开发 :warning: :warning: 考试信息(技巧和窍门) 使用脚手架或尝试重现自动创建部分(使用实体框架的带有视图的控制器) 对于数据表,您可以使用以下示例: 在REPO的解决方案领域中...

    学习C# .Net6+EFcore+MySQL.zip

    这是一套完整的教程,旨在帮助初学者和有一定经验的开发者掌握现代Web应用程序开发的核心技术。 C#是微软公司推出的面向对象的编程语言,广泛应用于Windows平台、移动设备以及游戏开发。.NET 6是.NET框架的最新版本...

    c# MVC完整项目 EF连接数据库 webapi

    首先,C# MVC(Model-View-Controller)是一种用于构建可维护性和可测试性的Web应用程序的设计模式。它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型负责业务逻辑和数据...

    web聊天室(.net core MVC + signalr + EF + Authorize)

    "web聊天室(.net core MVC + signalr + EF + Authorize)" 描述了一款基于.NET Core MVC框架、使用SignalR实现实时通信、Entity Framework(EF)进行数据库操作,并结合Authorize进行权限控制的Web聊天室应用。...

    asp.net MVC + EF 音乐店程序源码.zip

    源码说明: MVC 音乐店是用来介绍和展示使用 ASP.NETMVC 以及 Visual Studio 进行 Web 开发的示例应用程序,我们将从基础知识开始,一步一步地进行介绍,因此,初学者也可以去的很好的学习体验。 这个示例程序使用 ...

    angularjs+webapi+EF

    标题中的“angularjs+webapi+EF”是一个典型的前后端分离的Web开发技术组合,其中AngularJS是前端框架,WebAPI是后端数据接口,而Entity Framework(EF)则是一种常用的ORM(对象关系映射)工具,用于简化数据库操作...

    web网页设计(c#):学生管理系统

    【标题】"Web网页设计(C#):学生管理系统"是一个使用C#编程语言和Web技术构建的应用程序,主要用于管理教育机构中的学生信息。这个系统通常包括对学生数据的增、删、改、查等基本功能,是计算机科学尤其是软件工程...

    EF+MVC+增删改查+webapi+异步上传文件+类库大全

    2. MVC (Model-View-Controller):这是一种设计模式,常用于Web应用开发,如ASP.NET MVC。它将应用程序分为三个主要组件:模型(Model)负责数据管理,视图(View)负责显示用户界面,控制器(Controller)处理用户...

    ASP.NET Core 和EF Core官方中文文档

    ASP.NET Core和Entity Framework Core(简称EF Core)是Microsoft开发的两个关键的开源框架,用于构建现代、云就绪的互联网应用程序。ASP.NET Core是下一代的ASP.NET框架,而EF Core是轻量级且高性能的对象关系映射...

Global site tag (gtag.js) - Google Analytics