【问题标题】:ASP.NET Communicate between two ASHX handlersASP.NET 在两个 ASHX 处理程序之间进行通信
【发布时间】:2011-07-27 10:43:05
【问题描述】:

在一个小型 ASP.NET 2.0 Web 应用程序中,我有两个 ASHX 处理程序(一个同步,一个异步)来处理 COMET 样式的消息传递。同步处理程序接收收件人和消息,而异步处理程序持有与所有客户端的“休眠”连接。

问题:我需要在共享状态下填充某种消息队列。但是,即使两个处理程序都在同一个命名空间中,我也不能在另一个中调用任何(静态或非静态)方法。我什至无法从任何处理程序访问 Global-class 中的静态方法。这一行只是给了我一个编译器错误:

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 行:

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);
            }
        }
    }

【问题讨论】:

  • 您能否向我们展示这两个类以及您感兴趣的方法的方法签名。
  • @Kev 编辑了原帖。

标签: c# asp.net


【解决方案1】:

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

【讨论】:

  • 感谢您的提示。我将它放在 CodeBehind 文件中,但它再次引发错误。请参阅原始帖子的编辑。显然它现在甚至无法实例化该类。
  • 我什至用 Visual Web Developer 自动生成的新处理程序进行了测试......同样的问题。
  • 愚蠢的朱尔斯是愚蠢的。整个应用程序位于另一个应用程序的子文件夹中,因此我将 dll 放在错误的 bin 文件夹中。它现在正在工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多