GVKun编程网logo

将boost :: signal包装到C#代理(boost 代码)

5

在本文中,我们将详细介绍将boost::signal包装到C#代理的各个方面,并为您提供关于boost代码的相关解答,同时,我们也将为您带来关于.netcore3.0Signalr-05使用jwt将用

在本文中,我们将详细介绍将boost :: signal包装到C#代理的各个方面,并为您提供关于boost 代码的相关解答,同时,我们也将为您带来关于.net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联、.NET控制台实现signalr客户端连接signalr服务端(web api)、Android工作室冻结调试时发出消息“SIGNAL = SIGABRT(signal SIGABRT)”、asp.net – SignalR/signalr/hubs 404未找到的有用知识。

本文目录一览:

将boost :: signal包装到C#代理(boost 代码)

将boost :: signal包装到C#代理(boost 代码)

假设我有一个异步库,用本机C编写,其界面类似于:

class connection {
public:
    boost::signal< void() > sig_connection_made;
    boost::signal< void(const std::string&) > sig_error;

    void connect(const std::string& host,const std::string& port);
};

我想用C#包装.有没有人知道一种方法,使用SWIG或类似的东西,这将允许我将信号绑定到C#代表?

解决方法

您可以使用SWIG将委托传递给c#,使用SWIG将其分配给函数指针,然后调用函数指针,它将触发委托.

.net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联

.net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联

Signalr是以Group、Connect为核心来进行推送,比如,给某个组、某个连接来推送,但实际场景中,核心应该是某个组、某个人;然而一个人可以对应多个连接(浏览器多个tab页);本节就来介绍下自行管理人、组、连接这些关系
由于signalr连接的时候不那么方便附带header和cookie(因为推送独立成一个子系统了),实际实现中采用以url query的形式附带上token,然后服务器端自定义解析token得到用户信息;

服务器端实现

  • ConfigureServices中添加服务相关方法,代码如下,完整代码

    public void ConfigureServices(IServiceCollection services)
    {
        var appSection = Configuration.GetSection("App");
        services.Configure<AppSetting>(option => appSection.Bind(option));
        var appSetting = appSection.Get<AppSetting>();
    
        services.AddSingleton<SignalrRedisHelper>();
    
        // services.AddHostedService<ClearBackGroundService>();
    
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(option =>
        {
            option.SecurityTokenValidators.Clear();
            option.SecurityTokenValidators.Add(new UserTokenValidation()); ;
    
            option.Events = new JwtBearerEvents()
            {
                OnMessageReceived = context =>
                {
                    var userId = context.Request.Query["userId"].FirstOrDefault();
                    if (!string.IsNullOrWhiteSpace(userId))
                    {
                        context.Token = userId;
                    }
                    return Task.CompletedTask;
                }
            };
        });
    
        services.AddCors(options => options.AddPolicy(corsPolicy, builder =>
        {
            builder
                  .SetIsOriginAllowedToAllowWildcardSubdomains()
                  .WithOrigins(appSetting.CORS.Split(","))
                  .AllowAnyMethod()
                  .AllowCredentials()
                  .AllowAnyHeader()
                  .Build();
        }));
    
        services.AddControllers()
            .AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver())
            .ConfigureApiBehaviorOptions(options =>
            {
                options.InvalidModelStateResponseFactory = context =>
                {
                    var result = new BadRequestObjectResult(context.ModelState);
                    result.ContentTypes.Add(MediaTypeNames.Application.Json);
                    // result.ContentTypes.Add(MediaTypeNames.Application.Xml);
    
                    return result;
                };
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
    
        // 添加Signalr
        services.AddSignalR(config =>
        {
            if (_webEnv.IsDevelopment())
            {
                config.EnableDetailedErrors = true;
            }
        })
        // 支持MessagePack
        .AddMessagePackProtocol()
        // 使用redis做底板 支持横向扩展 Scale-out
        .AddStackExchangeRedis(o =>
          {
              o.ConnectionFactory = async writer =>
              {
                  var config = new ConfigurationOptions
                  {
                      AbortOnConnectFail = false,
                      // Password = "changeme",
                      ChannelPrefix = "__signalr_",
                  };
                  //config.EndPoints.Add(IPAddress.Loopback, 0);
                  //config.SetDefaultPorts();
                  config.DefaultDatabase = appSetting.SignalrRedisCache.DatabaseId;
                  var connection = await ConnectionMultiplexer.ConnectAsync(appSetting.SignalrRedisCache.ConnectionString, writer);
                  connection.ConnectionFailed += (_, e) =>
                  {
                      Console.WriteLine("Connection to Redis failed.");
                  };
    
                  if (connection.IsConnected)
                  {
                      Console.WriteLine("connected to Redis.");
                  }
                  else
                  {
                      Console.WriteLine("Did not connect to Redis");
                  }
    
                  return connection;
              };
          });
    }

其中,SignalrRedisHelper 为redis辅助方法,详情请参见
UserTokenValidation 为自定义token解析方法,详情请参见,由于历史遗留问题,此处直接使用了userId,建议的做法是传递jwttoken,然后服务器端解析jwt token得到用户信息

Hub中跟用户关联

在Hub中通过Context.User.Identity.Name可以获取到解析的值,通过这种关系来跟用户关联上,当然,也可以自定义修改使用其他信息,比如Email或其他自定义的名称,具体请google

更多内容请通过快速导航查看下一篇

快速导航

标题 内容
索引 .net core 3.0 Signalr - 实现一个业务推送系统
上一篇 .net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展
下一篇 .net core 3.0 Signalr - 06 业务实现-业务分析
源码地址 源码
官方文档 官方文档

二维码

.NET控制台实现signalr客户端连接signalr服务端(web api)

.NET控制台实现signalr客户端连接signalr服务端(web api)

最近有一个需求是通过定时任务去完成,完成后发送消息到web端,web端通过MVC,使用signalr实现即时通信。

具体服务端实现就不描述了,网上也有很多资料。

new Action(async () =>
            {
                try
                {
                    HubConnection hub = new HubConnection("http://domain/signalr");
                    IHubProxy _proxy = hub.CreateHubProxy("ChatsHub");
                    hub.StateChanged += new Action<StateChange>(async tgt =>
                    {
                        if (((StateChange)tgt).NewState == Microsoft.AspNet.SignalR.Client.ConnectionState.Connected)
                        {
                            //客户端调用服务端的 Send() 方法,传入参数"Hello"         
                            await _proxy.Invoke("SendMsg2", "sendUserId", "toUserId", "您有新的通知", 1);
                        }
                    });
                    await hub.Start().ContinueWith((t) => {
                        if (t.IsFaulted)
                        {
                            Console.WriteLine("连接失败!");
                        }

                    });
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            })();

参考:https://blog.csdn.net/m0_37044279/article/details/76789868

Android工作室冻结调试时发出消息“SIGNAL = SIGABRT(signal SIGABRT)”

Android工作室冻结调试时发出消息“SIGNAL = SIGABRT(signal SIGABRT)”

我的应用运行完美,没有任何问题.但是当我尝试调试它时,android studio冻结了.所以我收到消息“等待调试器”,然后该消息消失,然后我在模拟器中只得到一个黑屏.
我也收到了消息
SIGNAL = SIGABRT (signal SIGABRT)

在变量选项卡下的调试窗口中.

我该如何解决?

解决方法

有一段时间我一直面临同样的问题.我知道修复非常简单.禁用即时运行. 转到“文件 – >设置 – >构建,执行,部署 – >即时运行”并禁用即时运行. 请试试这个.

asp.net – SignalR/signalr/hubs 404未找到

asp.net – SignalR/signalr/hubs 404未找到

我试图在IIS上部署SignalR站点。代码所有在VS中工作正常。但得到404未找到错误尝试解决signalr / hubs到目前为止我试过。

1)将脚本更改为:

script src="<%= ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>

2)修改Web.Config包括:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
    </modules>
</system.webServer>

3)更改IIS上的UrlMappingsModule的调用请求。

4)添加SignalR.Hosting.AspNet.dll,看看是否会帮助任何东西。

不知道还有什么要尝试或检查,任何帮助或指向正确的方向吗?

解决方法

尝试将通配符应用程序映射添加到服务器以帮助映射脚本URL“〜/ signalr / hubs”中的未知扩展名

今天关于将boost :: signal包装到C#代理boost 代码的讲解已经结束,谢谢您的阅读,如果想了解更多关于.net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联、.NET控制台实现signalr客户端连接signalr服务端(web api)、Android工作室冻结调试时发出消息“SIGNAL = SIGABRT(signal SIGABRT)”、asp.net – SignalR/signalr/hubs 404未找到的相关知识,请在本站搜索。

本文标签: