我有一个带有 SignalR 集线器的 ASP .Net Core 2.2 Web API。是否可以使用 Postman 调用其方法之一(例如,SendMessageToAll)?问题是我只有 API - 没有前端 - 我需要测试。
我尝试将 URl 放到 Postman (api.mydomain.com/chatHub) 中的集线器,但后来我不确定如何构建主体。我知道 SignalR 最好使用 WebSockets,我不知道 PostMan 是否具有 WebSocket 功能。如果 WebSockets 不可用,我相信 SignalR 也可以执行 HTTP 请求,这是 Postman 可以做的。但我用的是什么身体?我是使用 HTTP GET 还是 POST?
我在 Postman 中看到有人在使用这个 body 的帖子:
{
"Target": "SendMessageToGroup",
"Arguments": [
"groupA",
"hello from server"
]
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试了相同的方法,但是当我在邮递员上单击“发送”时,我的集线器的 SendMessageToGroup 方法不会被触发。
谢谢
signalr signalr-hub signalr.client postman asp.net-core-webapi
我有一个 NET6 项目,它是更大的 .NET 6 ASP.NET 解决方案的一部分。该项目仍然引用:
现在已被标记为已弃用。
我需要安装哪些软件包来替换它们?
问题在于,当前 SignalR 位于与主 ASP.NET 项目分开的程序集中。这是因为解决方案中的主项目和其他几个项目使用集线器(使用构造函数 DI)。
如果我将 SignalR 项目更改为
<Project Sdk="Microsoft.NET.Sdk.Web">
...
</Project>
Run Code Online (Sandbox Code Playgroud)
我收到以下编译错误:
错误 CS5001 程序不包含适合入口点的静态“Main”方法
所以问题是我无法与多个其他项目引用的 SignalR 建立一个通用程序集。
我希望能够让各个用户使用SignalR相互发送消息,因此我需要发送到特定的客户端ID.如何在会话开始时为特定用户定义客户端ID - 比如用户的GUID主键?
我想在SignalR中测试我的Hub,最好的方法是什么?
到目前为止我想到的可能的解决方案:
目前使用SignalR 0.4和NUnit作为测试框架.
这是两个问题,但是:
为我的Hub设置顶级异常处理程序的最佳方法是什么?目前版本的SignalR似乎不可能
当我在Hub中抛出错误时,为什么这在客户端上实际上没有做任何事情?
$ .connection.hub.error(function(){return alert("test");});
当我调试时,我可以看到我的错误方法被连线,但是当我在Hub上抛出异常时,我可以看到从来没有尝试调用我在上面设置的方法.唯一发生的事情是SignalR将错误发送到控制台.
为了记录,我可以很好地连接其他事件
//Called during exceptions just fine
$.connection.hub.received(function() {
return alert("Received Data");
});
//Seems to do nothing?
$.connection.hub.error(function() {
return alert("Received Exception");
});
Run Code Online (Sandbox Code Playgroud) 我从MVC Controller动作中调用SignalR
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var ret = context.Clients.Client("Whatever").getValue(userId);
Run Code Online (Sandbox Code Playgroud)
无论如何我可以从动作中的客户端调用getValue()方法获得响应吗?
我尝试了几种方法,但根本无法获得任何ret值.我很确定这不适用于SignalR Hub但无法找到有关此内容的文档.
我考虑过的一个解决方案是在收到getValue之后客户端会在Hub中调用一个方法但是我不得不破解我从Hub获取响应到控制器的方法.
我有一个与SignalR合作的小项目,但是我得到了一些非常不一致的行为.
<script type="text/javascript">
$(function () {
var chat = $.connection.brewBattleHub;
$.connection.hub.start().done(function () {
$("#broadcast").click(function () {
// Call the chat method on the server
chat.server.roll($("#username").val(), $("#drinkname").val());
});
chat.server.sendMessage("SignalR loaded...");
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
当我加载页面时,有时我看到消息"SignalR loaded",有时我不是.
页面上还有一些其他功能,有时这也不起作用.如果我点击按钮并让事情发生,它最终会一次性完成......从这一点来说,这一切都是金色的,并且完美无缺.
呢start().done()?不确保一切准备就绪?
===附录,我没有引用jquery mobile(谷歌提到这样做时有一个错误)
我正在尝试调试SignalR集线器,并注意到即使使用单个客户端,构造函数也会被多次调用.这是预期的行为吗?我期待构造函数只被调用一次用于类初始化,但我多次击中断点.
经过三个小时的调试和搜索,我希望有人在这里有答案.如果我连续快速调用以下函数(例如,相隔<0.1秒),实体框架(使用MySQL)会抛出以下异常.
System.InvalidOperationException:意外的连接状态.使用包装提供程序时,请确保在包装的DbConnection上实现StateChange事件.
但是,有时功能没有任何问题.第一次ToList()调用时抛出异常:
void InsertOrUpdateMaterials(List<Material> materials)
{
var id = GetUserId();
var materialIds = materials.Select(x => x.MaterialId).ToList();
// Remove old materials from DB
var oldMaterials = Db.Materials.Where(p => p.CreatedBy == id &&
materialIds.Contains(p.MaterialId)).ToList(); // exception
Db.Materials.RemoveRange(oldMaterials);
Db.SaveChanges();
// Replace previous materials with the new ones in list
Db.Materials.AddRange(materials);
Db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这个错误从未发生在开发服务器上,所以我调查了可能的配置问题无济于事.
有时,Entity Framework会抛出:
System.Data.Entity.Core.EntityCommandExecutionException:已经有一个与此Connection关联的打开DataReader,必须先关闭它.
再次指着ToList()电话.有任何想法吗?
我正在将SignalR-Service迁移到新的AspNetCore.SignalR(2.1预览版),现在我遇到了CORS的问题.我永远不会从同一个来源访问该服务,所以我需要一般禁用CORS.
我有以下的CORS政策
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
Run Code Online (Sandbox Code Playgroud)
(来自不同来源的我的WebApi-Controller呼叫在这些策略下工作正常)
使用SignalR for AspNetCore(AspNetCore.SignalR.Server)的旧预览包我没有任何问题,但现在,我的测试客户端得到了一些http-405,这似乎是CORS的一个问题.
SignalR可能有额外的CORS配置,还是我需要允许其他东西?
编辑:我创建了一个新的/干净的示例项目,没有任何特殊的中间件来检查如果错误发生在这里,它确实发生.
示例WebApplication | startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using WebApplication1.HUBs;
namespace WebApplication1
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(
options => options.AddPolicy("AllowCors",
builder => …Run Code Online (Sandbox Code Playgroud) signalr ×10
signalr-hub ×3
asp.net ×2
asp.net-core ×2
c# ×2
.net-6.0 ×1
cors ×1
javascript ×1
nunit ×1
postman ×1
testing ×1
unit-testing ×1