Ale*_*der 5 signalr .net-core asp.net-core
我使用https://blogs.msdn.microsoft.com/webdev/2017/09/14/announcing-signalr-for-asp-net-core-2-0/中的示例 来创建一个可以发送从简单的控制台应用程序到网页的消息。
下面是控制台应用程序的简单示例,它读取用户输入并将该输入打印在屏幕上,我想将相同的用户输入也发送到网页。
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Enter input:");
string line = Console.ReadLine();
if (line == "exit")
{
break;
}
sendSignalToClient(line);
Console.Write("Message Sent To Client: " + line);
}
}
private static void sendSignalToClient(string line)
{
//Send a message from this app to web client using signalR
}
Run Code Online (Sandbox Code Playgroud)
我刚刚开始学习这方面的知识。任何与此相关的材料或建议都值得赞赏。-谢谢
编辑:我正在使用示例 signalR 聊天应用程序。
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
public class ChatHub : Hub
{
public void Send(string name, string message)
{
// Call the broadcastMessage method to update clients.
Clients.All.InvokeAsync("broadcastMessage", name, message);
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseFileServer();
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("chat");
});
}
Run Code Online (Sandbox Code Playgroud)
下面是向网页发送消息的控制台应用程序的代码
class Program : Hub
{
static void Main(string[] args)
{
Task.Run(Run).Wait();
}
static async Task Run()
{
var connection = new HubConnectionBuilder()
.WithUrl("http://localhost:59768/chat")
.WithConsoleLogger()
.WithMessagePackProtocol()
.WithTransport(TransportType.WebSockets)
.Build();
await connection.StartAsync();
Console.WriteLine("Starting connection. Press Ctrl-C to close.");
var cts = new CancellationTokenSource();
Console.CancelKeyPress += (sender, a) =>
{
a.Cancel = true;
cts.Cancel();
};
connection.Closed += e =>
{
Console.WriteLine("Connection closed with error: {0}", e);
cts.Cancel();
return Task.CompletedTask;
};
connection.On("broadcastMessage", async () =>
{
});
while (true)
{
Thread.Sleep(2000);
await connection.SendAsync("send", "alex", "hello");
}
}
Run Code Online (Sandbox Code Playgroud)
所有代码都正常工作,但在控制台应用程序上我收到此异常:
Microsoft.AspNetCore.Sockets.Client.HttpConnection[19]
09/17/2017 13:47:17: Connection Id 40da6d4b-9c47-4831-802f-628bbb172e10: An exception was thrown from the 'Received' event handler.
System.FormatException: Target method expects 0 arguments(s) but invocation has 2 argument(s).
at Microsoft.AspNetCore.SignalR.Internal.Protocol.MessagePackHubProtocol.CreateInvocationMessage(Unpacker unpacker, IInvocationBinder binder)
at Microsoft.AspNetCore.SignalR.Internal.Protocol.MessagePackHubProtocol.TryParseMessages(ReadOnlyBuffer`1 input, IInvocationBinder binder, IList`1& messages)
at Microsoft.AspNetCore.SignalR.Internal.HubProtocolReaderWriter.ReadMessages(Byte[] input, IInvocationBinder binder, IList`1& messages)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.<OnDataReceivedAsync>d__31.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Sockets.Client.HttpConnection.<>c__DisplayClass49_0.<<ReceiveAsync>b__0>d.MoveNext()
Run Code Online (Sandbox Code Playgroud)
您的事件处理程序应该采用字符串参数,它应该如下所示:
connection.On<string>("broadcastMessage", data =>
{
});
Run Code Online (Sandbox Code Playgroud)
看看这个教程,因为虽然它有点旧,但它会给你很好的建议:
一方面,您的网页需要连接到 SignalR Hub,另一方面,您的控制台应该连接到服务(可能在您的 Web 项目中),以将消息发送到集线器,并从那里发送到所有注册的客户端。关键是集线器在客户端执行 JavaScript 函数,但由于注册,它必须了解客户端,并且必须调用集线器实例来执行方法。让我觉得有意义的是将集线器注入 API 控制器中,并使用 httpclient 将输入发布到控制器中。
另一个很好的教程,但这个是最近的:
https://spontifixus.github.io/ASPNET-Core-SignalR-with-Aurelia-and-Webpack/
我希望它有帮助。
胡安
编辑:
我刚刚在这里找到了同一问题的答案(2017 年 5 月):
在服务器端:
[HubName("MyHub")]
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
}
Run Code Online (Sandbox Code Playgroud)
在客户端:
var myHub = connection.CreateHubProxy("MyHub");
...
// To write received messages:
myHub.On<string, string>("addMessage", (s1, s2) => {
Console.WriteLine(s1 + ": " + s2);
});
...
// To send messages:
myHub.Invoke<string>("Send", name, message).ContinueWith(task1 => {
if (task1.IsFaulted)
{
Console.WriteLine("There was an error calling send: {0}", task1.Exception.GetBaseException());
}
else
{
Console.WriteLine(task1.Result);
}
});
Run Code Online (Sandbox Code Playgroud)
这可能对你也有用,亚历山大。
我希望它有帮助。
胡安
| 归档时间: |
|
| 查看次数: |
7361 次 |
| 最近记录: |