#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. Как это поможет мне решить мою проблему, я вообще не говорю о кодировании, не имеет значения, как я кодирую, важно то, что я не уверен, что мне нужно отправлять данные таким образом