首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Azure SignalR连接.net6 web服务和.net6 wpf应用程序

通过Azure SignalR连接.net6 web服务和.net6 wpf应用程序
EN

Stack Overflow用户
提问于 2022-04-09 13:08:53
回答 1查看 163关注 0票数 1

我在Azure上运行一个web服务,它连接到SignalR,如下所示:

我的集线器-班级:

代码语言:javascript
复制
public class ChangeRequest : Hub
{
    protected IHubContext<ChangeRequest> _context;

    public ChangeRequest(IHubContext<ChangeRequest> context) => _context = context;
    public Task? Send(Guid id) =>
        _context.Clients?.All?.SendAsync("SendMessage", id);
}

我的Programm.cs

代码语言:javascript
复制
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<CPLopsEntities>(options => options.UseSqlServer(@"Server=tcp:noris.database.windows.net,1433;Initial Catalog=CPLopsTest;Persist Security Info=False;User ID=user;Password=!Pw12345;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"));
builder.Services.AddTransient<ChangeRequest>();

builder.Services.AddSignalR().AddAzureSignalR("Endpoint=https://xxxxxxx.service.signalr.net;AccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;Version=1.0;");

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.UseAzureSignalR(r => r.MapHub<ChangeRequest>("/com"));

using (var scope = app.Services.CreateScope())
    scope.ServiceProvider.GetRequiredService<CPLopsEntities>().Database.Migrate();

app.Run();

当通过调用web添加新条目时,我调用_hub.Send():

代码语言:javascript
复制
private readonly CPLopsEntities _context;
private readonly ChangeRequest _hub;
public CompanyController(CPLopsEntities context, ChangeRequest hub)
{
    _context = context;
    _hub = hub;
}

public IActionResult Insert(Entry entry)
{
    Guid newId = CompanyDB.Instance.InsertEntry(entry);
    _hub.Send(newId);
    return Ok();
}

因为我的客户端是一个WPF应用程序,所以我没有找到很多关于实现的信息。到目前为止我发现的是:

代码语言:javascript
复制
private const string host = "https://xxxxxxxx.service.signalr.net";
private HubConnection connection;
private Thread thread;
public MainViewModel()
{
    thread = new Thread(() =>
    {
        connection = new HubConnectionBuilder()
        .WithUrl(host + "/com")
        .WithAutomaticReconnect()
        .Build();
        
        connection.On<Guid>("ReceiveMessage", g => ExternalLoadCompany(g));
        connection.StartAsync();
    });
    thread.Start();
}

private void ExternalLoadCompany(Guid id)
{
    if (ApiCall.GetCompany(id).Result is Company c)
    {
        Companies.Clear();
        Companies.Add(c);
    }
}

到目前为止,我的WPF应用程序没有识别出网络发送的任何消息--服务是有意义的,因为我没有对它进行身份验证,然而,当我试图注册我的WPF-App时,我没有发现任何关于如何传递完整连接字符串(包括AccessKey )的信息,而且我找到的所有信息都是blazor-应用程序或其他类型的web应用程序。

EN

回答 1

Stack Overflow用户

发布于 2022-04-11 05:34:18

您的服务器端代码正在调用"SendMessage“,客户端看起来是"ReceiveMessage”。服务器端正在调用客户端上的方法,而且它不存在。

PS:你不需要启动这个线程。Task.Run会更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71808361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档