ASP.NET在两个ASHX处理程序之间进行通信

时间:2011-07-27 10:43:05

标签: c# asp.net

在一个小型的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);
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

如果您使用代码隐藏在ashx 文件后面编写代码,则可以在处理程序中调用静态/非静态方法,因为代码在构建项目时会被编译,其中代码在当处理程序收到请求时,ashx文件会动态编译,因此在正常的项目构建过程中无法调用它,因为它尚不可用于编译器