【发布时间】: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.Current 是null。在提问之前,我搜索了其他问题,但没有找到类似这里发生的任何事情。
这是整个类的代码:
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,请发布为答案),但您也可以自己发布答案。您也可以接受自己的答案(我会等待一段时间,看看是否有帮助的人决定发布答案)。