在一个小型的ASP.NET 2.0 Web应用程序中,我有两个ASHX处理程序(一个同步,一个异步)来处理COMET样式的消息传递。同步处理程序接收收件人和消息,而异步处理程序保持与所有客户端的“休眠”连接。
问题:我需要在共享状态下填充某种消息队列。但是,即使两个处理程序位于同一名称空间中,我也无法在另一个名称空间中调用任何(静态或非静态)方法。我甚至无法从任何处理程序访问Global类中的静态方法。这一行只是给我一个编译器错误:
Global.SendMessage(recipient, context.Request["message"]);
编译器错误消息:CS0103:当前上下文中不存在名称“Global”
我不确定我在哪种情况下。
处理程序直接写入.ashx文件,如下所示:
<%@ WebHandler Language="C#" Class="MyApp.MessageHandler" %>
using System;
using System.Web;
namespace MyApp
{
public class MessageHandler : IHttpHandler
任何提示?
修改
正如所建议的,我将该类放在代码隐藏文件中,因此ashx文件中的标记如下所示:
<%@ WebHandler Language="C#" Class="MyApp.MessageHandler" CodeBehind="MessageHandler.ashx.cs" %>
文件后面的代码存在,名称相同。但是,这也给我一个错误:
分析程序错误消息:无法创建类型 'MyApp.MessageHandler'。 来源错误: 第1行:&lt;%@ WebHandler语言=“C#”Class =“MyApp.MessageHandler” CodeBehind =“MessageHandler.ashx.cs”%&gt;
MessageHandler类:
using System;
using System.Web;
namespace MyApp
{
public class MessageHandler : IHttpHandler
{
/*public MessageHandler()
{
}
*/
#region IHttpHandler Members
public bool IsReusable
{
get { return true; }
}
//Called to induce new message from external
public void ProcessRequest(HttpContext context)
{
string recipient = context.Request["recipient"];
context.Response.Write(recipient);
if (recipient == "all" || string.IsNullOrEmpty(recipient))
{
Global.BroadcastMessage(context.Request["message"]);
}
else
{
Global.SendMessage(recipient, context.Request["message"]);
}
}
#endregion
}
}
Global类中的一个示例方法:
public static void SendMessage(string recipient, string message)
{
Client client;
if (clients.ContainsKey(recipient))
{
if (clients.TryGetValue(recipient, out client))
{
client.Message = message;
client.SetCompleted(true);
}
}
}
答案 0 :(得分:2)
如果您使用代码隐藏在ashx 文件后面编写代码,则可以在处理程序中调用静态/非静态方法,因为代码在构建项目时会被编译,其中代码在当处理程序收到请求时,ashx文件会动态编译,因此在正常的项目构建过程中无法调用它,因为它尚不可用于编译器