【问题标题】:SignalR HttpContext.Current null in IIS 8.0IIS 8.0 中的 SignalR HttpContext.Current null
【发布时间】:2014-05-14 03:21:12
【问题描述】:

我修改了 SignalR 网站文档中的广播示例,而不是随机值,而是读取随机 xml 文件。我正在使用HttpContext.Current.Server.MapPath 方法来访问文件并避免对物理路径进行硬编码。这在 Windows 7 IIS 7.5 和 Visual Studio 2013 中运行良好,但在 Windows 8.1 和 Windows Server 2012 中我发现HttpContext.Currentnull。在提问之前,我搜索了其他问题,但没有找到类似这里发生的任何事情。

这是整个类的代码:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;

using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace SignalRDisplayXML
{
    public struct ReturnDataScheme
    {
        public List<VsDisplaySlotBean> slotsdata;
        public string filename;
    }

    public class XmlTicker
    {
        private readonly static Lazy<XmlTicker> _instance =
            new Lazy<XmlTicker>(() => new XmlTicker(GlobalHost.ConnectionManager.GetHubContext<DisplayXMLHub>().Clients, HttpContext.Current.Server.MapPath("~/Data/")));

        private DAO _dao = new DAO();
        private ReturnDataScheme _server_data = new ReturnDataScheme();

        private string _directoryPath = string.Empty;

        private readonly object _processRandomXMLLock = new object();
        private volatile bool _updatingRandomXML = false;
        private readonly Timer _timer;

        private XmlTicker(IHubConnectionContext clients, string path)
        {
            Clients = clients;
            _directoryPath = path;

            _server_data.filename = GetRandomFileName();
            _server_data.slotsdata = _dao.GetVesselAll(_server_data.filename);

            _timer = new Timer(ProcessRandomXML, null, 10000, 10000);
        }

        public static XmlTicker Instance
        {
            get
            {
                return _instance.Value;
            }
        }

        private IHubConnectionContext Clients
        {
            get;
            set;
        }

        public ReturnDataScheme GetCurrentData()
        {
            return _server_data;
        }

        private void ProcessRandomXML(object state)
        {
            lock (_processRandomXMLLock)
            {
                if (!_updatingRandomXML)
                {
                    _updatingRandomXML = true;

                    _server_data.filename = GetRandomFileName();
                    _server_data.slotsdata = _dao.GetVesselAll(_server_data.filename);

                    Clients.All.DataPush(_server_data);

                    _updatingRandomXML = false;
                }
            }
        }

        private string GetRandomFileName()
        {
            Random randomizer = new Random(DateTime.Now.Millisecond);
            return _directoryPath + "DisplaySlotFDMF00" + randomizer.Next(1, 9).ToString() + ".xml";
        }
    }
}

谢谢。

【问题讨论】:

  • 我遇到了类似的问题,看起来它在 SignalR 2.0 中已更改。
  • 我实际上使用的是 2.0 版本。
  • 是的,不要使用 HttpContext.Current。如果您需要 MapPath,您可以使用 HostingEnvironment.MapPath(假设您在 ASP.NET 应用程序中)
  • HostingEnvironment.MapPath 在所有环境中都能正常工作。我想我在这里有一个答案不知道如何继续。
  • DevingNoob - 通常您可以要求提供最有用提示的人将评论转换为答案(如@dfowler,请发布为答案),但您也可以自己发布答案。您也可以接受自己的答案(我会等待一段时间,看看是否有帮助的人决定发布答案)。

标签: c# signalr iis-8


【解决方案1】:

您可以使用 HostingEnvironment.MapPath 而不是 HttpContext.MapPath。

【讨论】:

  • 在所有环境中都能正常工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2013-02-20
相关资源
最近更新 更多