我怎样才能让ASP.Net处理一些XML请求,但仍然返回物理XML文件

本文关键字:XML 请求 返回 文件 ASP 处理 Net | 更新日期: 2023-09-27 18:10:13

语言:c# 5.0
平台:ASP。. Net 4.5在IIS 7.5上运行
操作系统:Windows Server 2008 R2 Standard 64位

我正在开发一个旧的Web Forms应用程序,以添加从我们的数据库动态生成的XML站点地图。我创建了一个通用处理程序(.ashx),并使用XmlWriter构建XML。我打电话给site.com/SitemapIndex.ashx,瞧!到目前为止一切顺利。

我有一个业务需求,站点地图以.xml扩展名结尾。我在我的网页中添加了一个简单的URL重写规则。我的本地rig通过SitemapIndex处理SitemapIndex.xml。ashx文件。

当我将解决方案部署到我们的暂存服务器时,我在SitemapIndex.xml文件上得到了404 not found错误。但是.ashx仍然可以工作,所以我在该服务器上添加了一个处理程序映射。对于使用System.Web.UI.SimpleHandlerFactory的路径*.xml,我使用了一个托管处理程序。当我再次请求SitemapIndex.xml时,输出呈现正确。

然后我尝试在服务器上请求物理XML文件,并收到以下错误消息:"没有为扩展名'. XML '注册的构建提供程序。"您可以在机器部分注册一个。Config或web.config。确保它有一个BuildProviderAppliesToAttribute属性,其中包括值'Web'或'All'。"

现在我可以通过我的。ashx处理程序动态地处理。xml文件,但是真正的xml文件将不再被服务。我需要两样都做。任何帮助非常感激!

我怎样才能让ASP.Net处理一些XML请求,但仍然返回物理XML文件

我认为问题是"返回物理XML文件"

所以你应该正确设置你的标题信息。

在您的ashx中,

内容类型应为

- type: 应用程序/八进制

                 context.Response.ContentType = "application/octet-stream"; 
                 context.Response.AddHeader("Content-Transfer-Encoding", "binary");
                FileInfo fileInfo = new FileInfo(xmlFileName);
                long length = fileInfo.Length;
                context.Response.WriteFile(xmlFileName, 0, length);

我希望我能很好地理解这个问题,与URLRewrite无关,它是关于中继的。

我使用的解决方案是删除我为*.xml创建的处理程序映射,仅为我想要ASP的特定文件添加一个。网处理。在我的开发设备上,一切都运行得很好,所以我在登台和发布配置上使用配置转换来添加我想要的部署处理程序。我的web.staging.config文件的相关部分如下所示:

<system.webServer>
  <!-- Handler mappings for our xml sitemaps-->
  <handlers>
    <add name="SimpleHandlerFactory-SitemapIndex" path="SitemapIndex.xml" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" preCondition="integratedMode" xdt:Transform="Insert"  />
  </handlers>
</system.webServer>