SignalR在IIS 8.0中HttpContext.Current为空

3
我修改了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中已经改变了。 - Rob
我实际上正在使用2.0版本。 - user3490413
是的,不要使用HttpContext.Current。如果需要MapPath,可以使用HostingEnvironment.MapPath(假设您在ASP.NET应用程序中)。 - davidfowl
HostingEnvironment.MapPath在所有环境中都可以正常工作。我认为我已经得到了答案,但不知道该如何继续。 - user3490413
DevingNoob - 通常你可以询问提供最有用提示的人将评论转换为答案(例如@dfowler请发布为答案),但也可以自己发布答案。你也可以接受自己的答案(我会等待一段时间,看看是否有帮助的人决定发布答案)。 - Alexei Levenkov
显示剩余2条评论
1个回答

2
您可以使用HostingEnvironment.MapPath代替HttpContext.MapPath。

在所有环境中都运行良好。谢谢。 - user3490413

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接