【问题标题】:How to make SignalR HttpGet request如何发出 SignalR HttpGet 请求
【发布时间】:2021-03-15 18:34:04
【问题描述】:

我需要为应用程序用户提供一种方法来监听服务器,并在每次更新数据库时获取更新的 HTTPGET 请求。不需要客户端实现,只需要服务器端。我在 SignalR 方面的经验很少,希望在 Hub 方面提供任何帮助。 到目前为止我的代码

启动

        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<DataContext>(options =>
            {
                options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"));
            });
            services.AddAutoMapper(typeof(AutoMapperProfiles).Assembly);
            services.AddScoped<IContactRepository, ContactRepository>();
            services.AddControllers();
            services.AddSignalR();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Projekt", Version = "v1" });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Projekt v1"));
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapHub<UpdatesHub>("hubs/");
            });
        } ```

here are my ApiCalls user can use




[ApiController]
[Route("api/[controller]")]
public class ContactsController : ControllerBase
{

    private readonly IContactRepository _contactRepository;
    private readonly IMapper _mapper;

    public ContactsController(IContactRepository contactRepository, IMapper mapper)
    {
        _contactRepository = contactRepository;
        _mapper = mapper;
    }






    #region API CALLS
    [HttpGet]
    public async Task<ActionResult<IEnumerable<AppUserDto>>> GetUsers([FromQuery]UserParams userParams)
    {
        //Ego loading phone numbers, gives circular reference problem,
        //use DTOs and Mapping instead

        var users = await _contactRepository.GetUsersAsync(userParams);
        Response.AddpaginationHeader(users.CurrentPage, users.PageSize,
            users.TotalCount, users.TotalPages);
        var usersToReturn = _mapper.Map<IEnumerable<AppUserDto>>(users);
        
        return Ok(usersToReturn);
        
    }




    //~/api/Contacts/1
    [HttpGet("{id}")]
    public async Task<ActionResult<AppUser>> GetUser(int id)
    {
        var user = await _contactRepository.GetUserByIdAsync(id);
        var userToReturn = _mapper.Map<AppUserDto>(user);
        return Ok(userToReturn);
       
    }





    [HttpPost("addContact")]
    public async Task<ActionResult> AddContact(AppUser appUser)
    {


        var IsConstrained = await _contactRepository.CheckIfConstrained(appUser);
        if (IsConstrained)
        {
            return BadRequest("user already exists");
        }
        else
        {
            _contactRepository.AddContact(appUser);
            var result = await _contactRepository.SaveAllAsync();

            if (result)
                return Ok();
            else
                return BadRequest("user not saved to database");
        }
    }




    [HttpPut("update")]
    public async Task<ActionResult> Update(AppUser user)
    {

        //Check if user changed his name, if changed ->check if it's unique then update,
        //if name not changed just update
        var UserBeforeUpdate = _contactRepository.GetUserByIdAsync(user.Id);
        
        var IsNameChangedBool = _contactRepository.CheckIfNameChanged(user , UserBeforeUpdate.Result);
       
        if (IsNameChangedBool)
        {
            var IsConstrained = await _contactRepository.CheckIfConstrained(user);
            if (IsConstrained)
            {
                return BadRequest("user already exists");
            }
            else
            {
                _contactRepository.Update(user);
                if (await _contactRepository.SaveAllAsync()) return Ok("Contact updated");
                return BadRequest("user not saved to database");
            }
        }
        else
        {
            _contactRepository.Update(user);
            if (await _contactRepository.SaveAllAsync()) return Ok("Contact updated");
            return BadRequest("user not saved to database");
        } 
    }  ```

这是 Hub 部分,我不知道如何向用户发送更新的 httpget 请求

{
    public class UpdatesHub : Hub
    {

        
        public async Task SendMessageToCaller()
        {
            await Clients.Caller.SendAsync("RecieveMessage");
        }
    }
}

【问题讨论】:

    标签: c# .net asp.net-web-api signalr


    【解决方案1】:

    请确保前往您的中心的路线正确无误。例如,如果您的集线器位于 hubs 文件夹中,您需要添加 endpoints.MapHub&lt;UpdatesHub&gt;("/hubs/hubName");

    客户端可以通过以下方式连接到您的 JavaScript 中的 SignalR:

    var connection = new signalR.HubConnectionBuilder().withUrl("/hubs/hubName").build();
    

    客户端可以订阅从服务器发送的消息。类似的东西:

    connection.on("ReceiveMessage", function (message) {
        alert(message);
    });
    

    创建或修改实现数据库更新功能的类的重载构造函数,以便访问集线器:

    ...
    
    public class DatabaseClass
    {
         private IHubContext<UpdatesHub> _hub;
         public DatabaseClass(IHubContext<UpdatesHub> hub)
         {
               _hub = hub;
         }
    
    ...
    

    现在您可以在更新数据库后使用集线器向客户端发送消息:

    ...
    
    public class DatabaseClass
    {
         private IHubContext<UpdatesHub> _hub;
         public DatabaseClass(IHubContext<UpdatesHub> hub)
         {
              _hub = hub;
         }
    
         public MyUpdateFunction()
         {
             //Update database
             //
             //
             _hub.Clients.All.SendAsync("ReceiveMessage", "Database updated!!");
         }
    
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多