如何在IIS中嵌入简单外部应用实现HTTP POST转TCP请求
IIS POST请求转TCP转发方案答疑
问题1:实现该需求是否必须创建ASP.NET应用
- 不需要。IIS的请求处理架构不强制依赖ASP.NET技术栈,你完全可以通过原生模块、通用宿主、请求分流等方式实现需求,不需要专门开发ASP.NET应用。现有Angular静态站点的GET请求处理逻辑完全不受影响,只需要把POST请求单独分流到对应的处理单元即可。
问题2:非ASP.NET技术栈的可适配IIS方案
以下方案均满足无GUI、轻量运行的要求,可按需选择:
- IIS原生组件+独立转发服务方案:启用IIS自带的URL重写模块和ARR(Application Request Routing)模块,配置规则将所有HTTP POST请求分流到本地端口运行的轻量转发服务。该转发服务可以用任意你熟悉的语言开发(Go/Rust/C++/Node.js等均可),只需要实现「接收HTTP POST请求→建立到目标PC的TCP连接→转发请求内容→返回TCP响应」的逻辑即可,不需要和IIS做深度集成,部署成本最低。
- IIS原生模块方案:基于IIS原生SDK开发C++编写的HTTP模块,直接注册到IIS请求处理管道,拦截匹配路径的POST请求,在模块内部直接完成TCP转发逻辑。该方案性能最高,不依赖任何托管运行时,编译完成后仅需将dll文件挂载到IIS站点即可生效。
- HttpPlatformHandler挂载通用控制台程序方案:通过IIS官方提供的HttpPlatformHandler组件,可以将任意无GUI控制台程序(支持Java/Python/Go/Rust/Node.js等所有能编译为可执行文件的语言)挂载到IIS站点下,由IIS自动负责进程启停、端口映射、请求转发,你只需要开发一个实现HTTP到TCP转换逻辑的控制台程序即可,几乎不需要做额外的IIS适配工作。
- FastCGI挂载方案:如果你开发的处理程序支持FastCGI协议,可以直接通过IIS自带的FastCGI模块挂载,同样不需要ASP.NET运行时支持。
附:通过Microsoft.Web.Administration操作IIS添加应用的示例代码
你可以用这段代码直接操作IIS配置,将你开发的处理程序挂载到现有Angular站点下,无需手动在IIS管理器中配置:
using System; using System.Text; using Microsoft.Web.Administration; internal static class Sample { private static void Main() { using (ServerManager serverManager = new ServerManager()) { Configuration config = serverManager.GetApplicationHostConfiguration(); ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites"); ConfigurationElementCollection sitesCollection = sitesSection.GetCollection(); ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Contoso"); if (siteElement == null) throw new InvalidOperationException("Element not found!"); ConfigurationElementCollection siteCollection = siteElement.GetCollection(); ConfigurationElement applicationElement = siteCollection.CreateElement("application"); applicationElement["path"] = @"/ShoppingCart"; ConfigurationElementCollection applicationCollection = applicationElement.GetCollection(); ConfigurationElement virtualDirectoryElement = applicationCollection.CreateElement("virtualDirectory"); virtualDirectoryElement["path"] = @"/"; virtualDirectoryElement["physicalPath"] = @"C:\Inetpub\Contoso\ShoppingCart"; applicationCollection.Add(virtualDirectoryElement); siteCollection.Add(applicationElement); serverManager.CommitChanges(); } } private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues) { foreach (ConfigurationElement element in collection) { if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase)) { bool matches = true; for (int i = 0; i < keyValues.Length; i += 2) { object o = element.GetAttributeValue(keyValues[i]); string value = null; if (o != null) { value = o.ToString(); } if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase)) { matches = false; break; } } if (matches) { return element; } } } return null; } }
内容的提问来源于stack exchange,提问作者Zvi Vered
相关产品推荐
相关产品推荐

