Как я могу отправить объект json на .net сервер, используя сигнализатор - PullRequest
2 голосов
/ 25 сентября 2019

Я занимаюсь разработкой приложения Angular, в котором мне нужно отправлять данные из угловых форм на внешний сервер, используя сервер .netcore и signalR.Я могу установить соединение между клиентом Angular и контроллером, используя концентратор сигналов, но я не понимаю, как отправить объект json с клиента на контроллер.С контроллера я хочу отправить объект Json на внешний сервер.Я хочу реализовать это с помощью сигнализатора, потому что я хочу в режиме реального времени связь между внешним сервером и клиентом.Когда я отправляю данные и получаю ответ от внешнего сервера, я хочу предупредить клиента. Я ищу некоторые рекомендации о том, как я могу это реализовать.

Угловой клиент

_hubConnection: HubConnection;
 transportType = signalR.HttpTransportType.LongPolling;

ngOnInit() {
   this._hubConnection = new signalR.HubConnectionBuilder()
    .configureLogging(signalR.LogLevel.Information)
    .withUrl("http://localhost:5000/message", this.transportType)
    .build();
}

fun1(){
 this._hubConnection.on("Send", (user, message) => {
  const received = `name: ${user}, message: ${message}`;
  console.log(received);
});

this._hubConnection.start()
    .then(() =>
        this._hubConnection.invoke('Send', "rk", "wassup").catch(function (err) {
        console.error(err.toString());
    })
)
.then(() =>
    console.log('connected')
)
.then(() => this._hubConnection.stop())
.then(() => console.log('Disconnected'))
.catch(e => console.error(e.message));

Контроллер

namespace ang.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class DistController : Controller
    {
        private IHubContext<DistHub> _hubContext;
        public DistController(IHubContext<DistHub> hubContext)
        {
            _hubContext = hubContext;
        }
    }
}

SignalRhub

namespace ang.HubConfig
{
    public class DistHub: Hub
    {
        public async Task Send (string user , string message)
        {
            // return Clients.All.SendAsync("Send", message);
            await Clients.All.SendAsync("Send", user, message);
        }
    }
}

startup.cs

app.UseSignalR(routes =>
{
    routes.MapHub<DistHub>("/message");
});

json object

const Root = {
  "Unit" : "mm",
  "test": [{
    "Val": this.Val1.isChecked,
    'Val1' : this.val2.isChecked,
  }],
  "test1" :{
    "sub":[{
      'val2' : this.valFormGroup.get('val2').value,
      'Val3' : this.valFormGroup.get('val3').value,
    }]
  },
}

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Вы можете сделать это, передав корневые данные вызову

connection.invoke('Send', "rk", "wassup", Root);

Затем добавьте в свой концентратор еще один параметр для корневых данных

public async Task Send (string user , string message, string root)
{
  await Clients.All.SendAsync("Send", user, message);
}

Обновите, так как выотправить строку JSON вы можете использовать

JsonConvert.DeserializeObject<List<object>>(root);
1 голос
/ 25 сентября 2019

Если данные json, которые вы хотите отправить от клиента, имеют известный и фиксированный формат, вы можете заставить свой метод-концентратор принимать пользовательский параметр объекта, как показано ниже.

Метод-концентратор

public async Task GetCustomData(string user, Root data)
{

    var sub_val2 = data.test1.sub[0].val2.ToString();

    //code logic here


    await Clients.All.SendAsync("ReceiveMessage", user, "{message_here}");
}

Пользовательские классы

public class Root
{
    public string Unit { get; set; }
    public List<Test> test { get; set; }
    public Test1 test1 { get; set; }
}

public class Test
{
    public bool Val { get; set; }
    public bool Val1 { get; set; }
}

public class Test1
{
    public List<Sub> sub { get; set; }
}

public class Sub
{
    public string val2 { get; set; }
    public string Val3 { get; set; }
}

Результат теста

enter image description here

Кроме того, когда Тони Нго поделился, измените метод Hub, чтобы он принимался.другой параметр типа объекта также в порядке.

...