【问题标题】:ASHX including code-behind class -ASHX 包括代码隐藏类 -
【发布时间】:2012-06-12 16:24:04
【问题描述】:

我正在尝试使用外部代码文件为多个 .ashx 处理程序包含一些帮助程序类。示例之一是使用 ListToJSON,它只是将嵌套列表(正在使用的诸如 List<List<whatevers>> 之类的东西)转换为 JSON(将被扔进 context.response)

ListToJSON 类在同一个文件中时可以正常工作。我正在尝试将它放入一个 Helper.cs 文件中,该文件包含在 VS2010 的同一个项目中,因为这些类在几个不同的处理程序中使用。

我的印象是“使用 Helper;”是我需要做的,但我仍然收到错误“找不到类型或命名空间帮助程序(您是否缺少指令或程序集引用?” (而智能感知也看不到它)

我也尝试将两个代码文件放入同一个命名空间。同样的错误。

它不是一个DLL文件,它只是同一个项目中的一个c#代码文件。我真的应该将它编译为 DLL 来执行此操作吗?如果是这样,我该怎么做? (一旦我这样做了,我可以右键单击->添加参考,对吗?)

我想我应该使用 App_Code 文件夹,但我不确定如何在 VS 中设置它以便正确引用它。

我的处理程序文件(骨架)

<%@ WebHandler Language="C#" Class="generateReport" %>

using System;
using System.Web;
using System.Configuration;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Diagnostics;
using Helper;
public class generateReport : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        ListToJSON Converter = new ListToJSON();
        //context.Response stuff goes here.
    }
}

我的帮助文件,Helper.cs - 这是在同一个项目目录中,并包含在项目中:

using <stuff>;
namespace Helper
{
    public class ListToJSON
    {
        //class definition here
    }
}

更新: 所以,我把 Helper.cs 放到了/App_Code/ 文件夹中,它看起来运行良好。在我完成 using Helper; 之后,Intellisense 正在 Helper.cs 中收集东西 当我在 IIS 上尝试它时,我得到了以下熟悉的错误:

Compiler Error Message: CS0246: The type or namespace name 'Helper' could not be found (are you missing a using directive or an assembly reference?)
Line 19: using Helper;
Source File: <path>\info.ashx    Line: 19

通过 Visual Studio 的 IIS 模拟器运行此程序时,我没有收到任何错误。当我通过 IIS (localhost) 运行它时,我得到描述的 IIS 内部服务器错误。 App_Code文件夹是通过VS制作的,我右键选择Add ASP.NET Folder &gt; App Code\

编辑:添加标签iis

【问题讨论】:

  • 这很奇怪。尝试将其放入 App_Code 中,看看是否可以修复它。当所有内容都在同一个项目中时,您不必设置任何引用。
  • 我使用了一个快速修复方法,将我的助手类放在 App_Code 文件夹中。不过,期待看到一个真正的答案。
  • 是的,我认为 App_Code 文件夹实际上是执行此操作的“正确”方式(假设您不想制作预编译的 dll)

标签: c# asp.net iis code-behind ashx


【解决方案1】:

我假设您使用的是WebSite 而不是WebApplication

Website 中添加新的Class 文件时,它应该在App_Code 文件夹中以避免Accessibility 问题。

编辑 - 1 => 请参阅下面的发布详细信息。

Edit = 2 => 尝试在 bin 文件夹中添加个人 Assembly,如下所述。这将确认 App_Code 文件夹 Dll 已合并。

【讨论】:

  • 是的。直到我专门开始使用 App_Code 进行搜索,我才找到了合适的解决方案。解释文件夹结构的 MSDN 链接:msdn.microsoft.com/en-us/library/t990ks23.aspx
  • 好的。它通过 VS 工作,但当我尝试在 IIS 中使用它时却没有。怎么回事?
  • 重建完整的解决方案。发布前,选择“发布前删除所有文件”选项并再次检查。
  • 不。我没有看到您描述的选项,但即使我手动删除旧版本,我仍然看到相同的 IIS 错误。我需要更改 IIS 中的设置吗? /bin/ 文件夹中有 App_Code.dll 和 App_Code.compiled 文件。这不应该使 Helper 命名空间可访问吗?
  • 在哪里可以找到这个“发布 Web”对话框?我正在构建 > 发布网站,它看起来不像那样。无论哪种方式,我都将它发布到一个干净的输出文件夹,但它没有修复错误。
【解决方案2】:

为了让 IIS 从 App_Code 文件夹中正确读取类,App_Code 文件夹(或 bin 文件夹,用于已编译的程序集)需要位于 IIS 根目录中才能检测到其中的类。

在我的例子中,我发布到 IIS 根目录的子文件夹,因此 IIS 看不到其中的类。

【讨论】:

  • 那么,您将文件夹保留为现有文件夹的子文件夹?
  • 差不多。该网站位于 [iis root] /app/app_name/ 中,因此 Visual Studio 将 App_Code 文件夹放在 /app/app_name/App_Code 中 - 这导致 App_Code 在 Visual Studio 的 iis 模拟器中正常工作(因为它将站点根目录放在项目中root),但是当我告诉它导出到 IIS 时它不起作用,因为 App_Code 位于错误的位置。它与手动移动到 IIS 根文件夹的 App_Code 文件夹一起正常工作。 Bin 文件夹具有相同的警告 - /bin/ 必须位于 IIS 根目录中才能运行。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2012-03-21
  • 2023-01-12
  • 2018-05-30
  • 1970-01-01
  • 2011-07-13
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多