【问题标题】:Possible to map a new file extension to an existing handler in ASP.NET?可以将新的文件扩展名映射到 ASP.NET 中的现有处理程序吗?
【发布时间】:2010-05-18 23:24:37
【问题描述】:
我有一个场景,我的应用程序将发布由 PC 和移动设备使用的服务,并且我有一个 HTTPModule,我只想对移动请求执行工作。所以我认为这样做的最佳方法是将移动请求指向不同的文件扩展名,并让 HTTPModule 决定仅在请求针对此新扩展名时进行处理。
我不需要新扩展的自定义 HTTPHandler;我想像普通的 .ASMX 服务一样对服务进行编程,只是使用不同的扩展名。
首先,我可以这样做吗?如果是这样,我该怎么做才能像处理 .ASMX 请求一样处理对我的新扩展的请求?
其次,这是正确的方法吗?我是否会以错误的方式分离和管理移动与 PC 请求?
谢谢,
戴夫
【问题讨论】:
标签:
asp.net
web-services
asmx
httphandler
httpmodule
【解决方案1】:
是的,可以注册自定义文件扩展名并使其与现有的 .NET 运行时一起使用。您可以执行以下步骤。
您需要在 IIS 中添加一个 ScriptMap(假设 IIS 7)并将其指向 ASP.NET 运行时,以便 IIS 可以将请求转发到正确的处理器。
- 在 IIS7 中转到您的网站,或 IIS 根目录在服务器级别注册
- 在 IIS 组下转到 Handler Mappings
- 在操作下单击添加脚本映射
- 将请求路径设置为 *.xxxx
- 将路径设置为 ASP.NET 运行时 (%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll) 或您正在运行的任何版本。
然后,您需要为文件扩展名注册一个自定义构建提供程序,以便 .NET 运行时可以预编译您的代码,假设您希望它与 *.asmx 服务类似地工作。
以下是一些内置构建提供程序的列表:
<system.web>
<compilation>
<buildProviders>
<add extension=".aspx" type="System.Web.Compilation.PageBuildProvider" />
<add extension=".ascx" type="System.Web.Compilation.UserControlBuildProvider" />
<add extension=".master" type="System.Web.Compilation.MasterPageBuildProvider" />
<add extension=".asix" type="System.Web.Compilation.ImageGeneratorBuildProvider" />
<add extension=".asmx" type="System.Web.Compilation.WebServiceBuildProvider" />
<add extension=".ashx" type="System.Web.Compilation.WebHandlerBuildProvider" />
<add extension=".soap" type="System.Web.Compilation.WebServiceBuildProvider" />
<add extension=".resx" type="System.Web.Compilation.ResXBuildProvider" />
<add extension=".resources" type="System.Web.Compilation.ResourcesBuildProvider" />
<add extension=".wsdl" type="System.Web.Compilation.WsdlBuildProvider" />
<add extension=".xsd" type="System.Web.Compilation.XsdBuildProvider"/>
<add extension=".js" type="System.Web.Compilation.ForceCopyBuildProvider" />
</buildProviders>
</compilation>
</system.web>
您很可能只需根据最匹配您正在做的事情复制现有构建提供程序之一并将其注册到您的应用程序 web.config 中
<system.web>
<compilation>
<buildProviders>
<add extension=".xxxx" type="System.Web.Compilation.WebServiceBuildProvider" />
</buildProviders>
</compilation>
</system.web>