如何从 ASP.NET 5 WebAPI 调用 javascript 页面上的函数
How to call function on javascript page from ASP.NET 5 WebAPI
好吧,也许我做错了,但是这里是:
我在 dnxcore50 上有一个 ASP.NET 5 WebAPI 项目 运行。它有一个非常简单的控制器,它只实现了 Get()
方法:
public class Data : Controller {
public JsonResult Get(){
return Json(/*some data from EF*/);
}
}
此外,我有 index.html
和 myscripts.js
文件,它们托管一个非常简单的网页。
当 运行 项目在 http://localhost:5000
上打开时,我可以浏览到 index.html
并可以调用
$.getJSON('/api/Data', function(data){
/*do stuff*/
});
所有这些都适用于所有 OSX 和 Windows。到目前为止一切顺利!
现在,我想要的是:当调用 API 时(例如另一个客户端调用 POST
),它应该向 javascript 发送消息以显示事件.
我尝试了什么:
- 在 API 中设置标志并从 javascript 进行轮询。这似乎不是最佳选择,但有效。
- 尝试
socket.io
,但我找不到与控制器通信的 dnxcore50 兼容方式。
- 正在尝试 HTML5
WebSockets
,但似乎无法与控制器建立通信。
如何从 ASP.NET 5 (dnxcore50) 与 javascript 页面通信?
好的,经过一些研究,我按照@Liam 的建议使用 SignalR
让它工作。
这就是我 SignalR
使用 ASP.NET Core 1.0.
的方式
在项目根目录的 Nuget.config
中,为 SignalR 添加存储库:
<add key="AspNetVNext" value="https://www.myget.org/F/aspnetmaster/api/v3/index.json" />
在 project.json
中添加对 SignalR 的引用:
"dependencies":{
...
"Microsoft.AspNet.SignalR.Server": "3.0.0-*"
}
在Startup.cs
中,注册SignalR:
public void ConfigureServices(IServiceCollection services)
{
/* ...other services...*/
services.AddSignalR(options =>
{
options.Hubs.EnableDetailedErrors = true;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
/*...other configs...*/
app.UseSignalR();
}
新建 Hub
class:
public class EventHub : Hub { }
例如从控制器调用集线器:
private readonly IHubContext hub;
public ProjectQualityController(IConnectionManager connectionManager)
{
hub = connectionManager.GetHubContext<EventHub>();
}
public void SendMessage(string value)
{
hub.Clients.All.sendMessage(value);
}
在javascript文件中,注册到sendMessage
事件:
<script src="scripts/jquery.signalR.js"></script>
<script src="signalr/hubs"></script>
<script type="text/javascript">
$(function () {
var chat = $.connection.eventHub;
chat.client.sendMessage = function (message) {
var encodedMsg = $('<div />').text(message).html();
alert(encodedMsg)
};
// Start the connection.
$.connection.hub.logging = true;
$.connection.hub.start()
.done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); })
.fail(function(){ console.log('Could not Connect!'); });
});
</script>
希望这对某人有所帮助!
好吧,也许我做错了,但是这里是:
我在 dnxcore50 上有一个 ASP.NET 5 WebAPI 项目 运行。它有一个非常简单的控制器,它只实现了 Get()
方法:
public class Data : Controller {
public JsonResult Get(){
return Json(/*some data from EF*/);
}
}
此外,我有 index.html
和 myscripts.js
文件,它们托管一个非常简单的网页。
当 运行 项目在 http://localhost:5000
上打开时,我可以浏览到 index.html
并可以调用
$.getJSON('/api/Data', function(data){
/*do stuff*/
});
所有这些都适用于所有 OSX 和 Windows。到目前为止一切顺利!
现在,我想要的是:当调用 API 时(例如另一个客户端调用 POST
),它应该向 javascript 发送消息以显示事件.
我尝试了什么:
- 在 API 中设置标志并从 javascript 进行轮询。这似乎不是最佳选择,但有效。
- 尝试
socket.io
,但我找不到与控制器通信的 dnxcore50 兼容方式。 - 正在尝试 HTML5
WebSockets
,但似乎无法与控制器建立通信。
如何从 ASP.NET 5 (dnxcore50) 与 javascript 页面通信?
好的,经过一些研究,我按照@Liam 的建议使用 SignalR
让它工作。
这就是我 SignalR
使用 ASP.NET Core 1.0.
在项目根目录的 Nuget.config
中,为 SignalR 添加存储库:
<add key="AspNetVNext" value="https://www.myget.org/F/aspnetmaster/api/v3/index.json" />
在 project.json
中添加对 SignalR 的引用:
"dependencies":{
...
"Microsoft.AspNet.SignalR.Server": "3.0.0-*"
}
在Startup.cs
中,注册SignalR:
public void ConfigureServices(IServiceCollection services)
{
/* ...other services...*/
services.AddSignalR(options =>
{
options.Hubs.EnableDetailedErrors = true;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
/*...other configs...*/
app.UseSignalR();
}
新建 Hub
class:
public class EventHub : Hub { }
例如从控制器调用集线器:
private readonly IHubContext hub;
public ProjectQualityController(IConnectionManager connectionManager)
{
hub = connectionManager.GetHubContext<EventHub>();
}
public void SendMessage(string value)
{
hub.Clients.All.sendMessage(value);
}
在javascript文件中,注册到sendMessage
事件:
<script src="scripts/jquery.signalR.js"></script>
<script src="signalr/hubs"></script>
<script type="text/javascript">
$(function () {
var chat = $.connection.eventHub;
chat.client.sendMessage = function (message) {
var encodedMsg = $('<div />').text(message).html();
alert(encodedMsg)
};
// Start the connection.
$.connection.hub.logging = true;
$.connection.hub.start()
.done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); })
.fail(function(){ console.log('Could not Connect!'); });
});
</script>
希望这对某人有所帮助!