Каков наилучший (общепринятый) способ отправки данных (сообщений) на сервер

#c# #messaging

#c# #обмен сообщениями

Вопрос:

У меня есть приложение на C # (которое является клиентом), и у меня есть сервер. Теперь сервер получает и отправляет клиенту всевозможные сообщения, которые являются строками, которые я использую StreamWriter для этого, теперь отправляющее сообщение на клиенте и сервере выглядит примерно одинаково, я беру строку, кодирую ее в UTF-8 и затем отправляю ее

 public void SendMessage(String p)
{
    if (p != "")
    {
        string StringMessage = HttpUtility.UrlEncode(p, System.Text.Encoding.UTF8);

        try
        {
            swSender.WriteLine(StringMessage);
            swSender.Flush();
        }
        catch (IOException e)
        {
            //do some stuff
        }
    }
}
  

теперь строки, которые я отправляю, выглядят примерно так:

 "SUBJECT@@@@SOMEDATA1<><>SOMEDATA2<><>SOMEDATA3
  

Это вызывает некоторые проблемы и заставляет меня задуматься. Так ли большие приложения отправляют / получают данные? Потому что это выглядит довольно глупо. Если нет, то может ли кто-нибудь привести пример того, как большие приложения отправляют сообщения?

Также: мой способ отправки сообщений заставляет меня создавать большие вложенные, если

Например:

 if(Subject="something")
    do something
else if(subject="something else")
    do something else
  

Как я могу это исправить?

Комментарии:

1. Отправьте данные с самоописанием. Xml. Краеугольный камень Soap и других протоколов взаимодействия. Рассмотрим WCF.

2. что вы подразумеваете под самоописывающимися данными? можете ли вы опубликовать exmaple?

Ответ №1:

Все это в значительной степени зависит от потребностей вашего приложения.
Вообще говоря: нет, изобретать свой собственный протокол — не очень хорошая идея.

Существует довольно много способов отправки сообщений от клиента к серверу.
Я бы посоветовал вам немного почитать WCF или, если вы используете .NET 2.0, а не .NET Remoting.
Кроме того, вы можете рассмотреть возможность отправки HTTP-сообщений, поскольку для этого существует множество фреймворков.

Комментарии:

1. если совместимость также является одним из ваших требований, служба WCF Rest — ваш друг

2. Я использую шаблон mvc, должна ли модель быть подключена к клиенту WCF, который получает данные с сервера? или клиент WCF должен действовать как сама модель?

3. Модель не является ни клиентом, ни чем-либо подключенным к ней. Модель — это просто определение ваших бизнес-объектов. Вы должны создать как клиент, так и сервер, которые передавали бы объекты модели между ними

Ответ №2:

Одним из способов является использование XML-RPC. Я использовал это для .NET. Я следовал инструкциям без его изменения и заставил клиент / сервер работать в течение 30 минут и еще 10, чтобы изменить его по своему вкусу. По сути, вы обычно вызываете функции, и благодаря магии библиотеки она блокирует выполнение кода сервером и возвращает результаты. RPC = удаленный вызов процедуры.

Если вы используете asp.net используйте инструкции с надписью IIS, даже если вы используете Linux с использованием fastcgi или apache. Я проигнорировал то, что было ошибкой, потому что оно было помечено как IIS. Существует опция удаленного взаимодействия .NET (если сервер не asp.net но доступно другое приложение).

Не самый хороший вариант — изучать webclient и отправлять строки json на сервер. Затем прочитайте ответ как json. XML-RPC довольно стандартный и рекомендуемый.

Комментарии:

1. Может быть, я ошибаюсь, но я не думаю, что это хорошо — вызывать функции на сервере с клиента без каких-либо сбоев… в любом случае, спасибо, я посмотрю на это.

2. @BlueGene: обычно у вас есть функции аутентификации (или параметр для длинного ключа api) для всего, что требует входа / аутентификации пользователя. OAuth — популярный метод. Удаленные вызовы, которые я делал до сих пор, никогда не требовали аутентификации, но с точки зрения шифрования вы можете использовать URL-адрес за https, и вам не придется беспокоиться о перехвате / человек в средней атаке. Однако, если вы используете . NET и самозаверяющий сертификат. СЕТЬ будет жаловаться, и вам нужно что-то отключить. Для этого найдите ServicePointManager. ServerCertificateValidationCallback и назначьте ему функцию, которая всегда возвращает true .

Ответ №3:

попробуйте использовать HttpUtility.Метод HtmlEncode

вместо UrlEncode()

Комментарии:

1. Как это поможет мне решить мою проблему, я вообще не говорю о кодировании, не имеет значения, как я кодирую, важно то, что я не уверен, что мне нужно отправлять данные таким образом