【问题标题】:How to call function on javascript page from ASP.NET 5 WebAPI如何从 ASP.NET 5 WebAPI 调用 javascript 页面上的函数
【发布时间】:2016-05-29 01:11:56
【问题描述】:

好吧,也许我做错了,但是这里是:

我有一个在 dnxcore50 上运行的 ASP.NET 5 WebAPI 项目。它有一个非常简单的控制器,它只实现了Get() 方法:

public class Data : Controller {
    public JsonResult Get(){
        return Json(/*some data from EF*/);
    }
}

此外,我还有 index.htmlmyscripts.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 页面进行通信?

【问题讨论】:

  • 您已经回答了自己的问题。您需要使用网络套接字或投票。
  • 是的,但是如何在c#端使用websockets?
  • 微软对 web sockets 的实现是signalR。这可能会使沟通更容易

标签: javascript asp.net-web-api websocket asp.net-core .net-core


【解决方案1】:

好的,经过一些研究,我使用SignalR 让它工作,正如@Liam 建议的那样。 这就是我使用 ASP.NET Core 1.0 获得 SignalR 的方式。

在项目根目录的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 类:

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>

希望这对某人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多