.NET 下的几种可执行文件
在net中,比较常见的几种脚本后戳名有,aspx,ashx,asmx,svc等等。(asp等其实并不是由net程序去处理)
在net程序中所有未预编译的程序最终都会进入BuildManager,System.Web.Compilation.BulidManager
负责整站的动态编译。
如果开发者在程序根目录的PrecompiledApp.config
中设置了不更新编译内容后,那么最终在BuildManager
的GetVPathBuildResultInternal
方法中会进行判断,如果用户设置了禁止更新编译内容且此时程序内置变量allowBuildInPrecompile
为false(反向为true)。那么就会抛出程序未预编译的异常
不同后戳的程序会交给不同的handler进行处理,而这些handler最终都会走向GetVPathBuildResultInternal
,来判断程序是否需要编译。
而大多数handler在进入GetVPathBuildResultInternal
时。对allowBuildInPrecompile
的赋值都是false
因此,判断后戳程序是否为可执行程序,只需要跟进其处理的handler,看它最终是否会进入GetVPathBuildResultInternal
或者一些其他动态编译方法就可以。
在net.framework框架初始的web.config
就定义了一些文件的处理handler。
文件路径:C:\Windows\Microsoft.NET\Framework64\{version}\Config\Web.config
如常见几种文件类型所对应的处理handler
aspx -> System.Web.UI.PageHandlerFactory
ashx -> System.Web.UI.SimpleHandlerFactory
asmx -> System.Web.Script.Services.ScriptHandlerFactory
svc -> System.ServiceModel.Activation.HttpHandler
通过初始web.config中可以看到net程序中其实还有很多可执行程序的文件类型。
如比较冷门,且鲜为人知的几种类型:
rem -> System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory
soap -> System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory
xamlx -> System.Xaml.Hosting.XamlHttpHandlerFactory
这里主要讲解soap,可见rem和soap的处理handler其实是同一个,在HttpRemotingHandlerFactory
的GetHandler
方法中,当请求方法为GET且文件真实存在时。会先交由WebServiceHandlerFactory
去处理
而后续也会调用GetCompiledType
方法进入BulidManager
对文件内容进行动态编译处理。
soap本身实现的是一种远程服务,在写法上,soap和asmx类似。soap需要继承MarshalByRefObject
,而asmx则继承WebService
如Demo:
<%@ WebService Language="C#" Class="Test" %>
using System;
using System.Web;
using System.IO;
using System.Web.Services.Protocols;
public class Test : MarshalByRefObject
{
[WebMethod(Description="Test")]
public string Chopper(String name) {
return name;
}
}
上传到web根目录就可以直接运行,因为soap格式的处理在net框架的web.config中就已经声明了。除用户自定义了后戳的处理handler或者删掉了不需要使用的handler。在net中默认可以使用.soap后戳的可执行程序
在调用上,soap和asmx类似,不过需要有一个地方需要注意,在页面提供测试方法以及测试的具体请求包是不能直接调用的,需要先在x.soap?wsdl
中获取到soapAction
.然后加入到请求头中。就可正常调用相关方法。
安全防范:
对于一些没有用到的handler可以删除掉.且net2.0没有xamlx.xamlx基本用不到,了解一下就行