我有一个 signalR 服务器,它使用 DLLImport 和 pinvoke(来自本地机器路径 c:\serverfolder\bin)加载一个非托管 Dll。我有一个 HTML5 客户端来访问 SirnalR 服务器以从非托管 dll 获取数据。
客户端如下。
$(function () {
var IgetTagValue = $.connection.tagservice;
IgetTagValue.client.onvalue = function (message) {
var text = document.getElementById("value");
text.value = message;
};
$("#Test").click(function () {
IgetTagValue.server.test("Hello");
});
$("#GetTagValue").click(function () {
var tag = { "ObjectId": 6348, "PropertyId": 0, "ContextId": 1, "ServiceId": 0 };
var tagValue = document.getElementById("ObjectId").value;
tag.ObjectId = tagValue;
IgetTagValue.server.registerTag(JSON.stringify(tag));
});
$("#unRegisterTag").click(function () {
var tag = { "ObjectId": 6348, "PropertyId": 0, "ContextId": 1, "ServiceId": 0 };
var tagValue = document.getElementById("ObjectId").value;
tag.ObjectId = tagValue;
IgetTagValue.server.registerTag(JSON.stringify(tag));
});
});
我已经正确定义了 Global aspx 文件,并且代理也在 /signalr/hubs 中成功创建。
我的服务器端代码如下。
[HubMethodName("test")]
public void Test(string testString)
{
//throw new Exception("Custom Exception");
this.Clients.Client(this.Context.ConnectionId).onvalue("Test "+ testString);
}
[HubMethodName("registerTag")]
public void Register(string tag)
{
Task t = Task.Factory.StartNew(() => DoWork(tag));
}
private void DoWork(string tag)
{
Rtoid rtoid = JsonConvert.DeserializeObject<Rtoid>(tag);
if (!tags.Contains(rtoid))
{
//Load unmanaged Dll from here and get the callback from the
// unmanaged code in OnValue().
//m_sync.ReleaseMutex();
}
}
public void OnValue(value v)
{
this.Clients.Client(this.Context.ConnectionId).onvalue(v);
}
public List<ClassName> GetTags()
{
return tags;
}
如果我在 xp 和 win7 中在 localhost 中托管来自 VS2010 的应用程序,并且我能够使用 SignalR 服务从本地路径加载非托管 dll 并且我收到通知,那么一切工作正常。但是当我在 Windows server 2012 上的 IIS8 上托管它时,我没有收到通知,似乎未加载非托管 dll。我有一个 Test() 方法,我在客户端中得到回调,所以我认为没有SignalR 的配置问题。(甚至代理是在/signalr/hubs 中生成的)
在 IIS8 中从服务器的本地路径加载库是否有任何特殊设置?