HttpWebRequest с https в C#

С точки зрения конкретных полей:

  • command: Кубернетеса соответствует концепции «точки входа» Докера, и все, что здесь указано, запускается как основной процесс контейнера. Вам не нужно указывать command: в спецификации модуля, если ваш Dockerfile уже имеет правильный ENTRYPOINT.
  • args: Кубернетеса соответствует концепции «команды» Докера, и все, что здесь указано, передается в качестве аргументов командной строки точке входа.
  • Переменные среды в Docker и Kubernetes имеют свою обычную семантику Unix.
  • Dockerfile ARG указывает настройку конфигурации времени сборки для изображения. Правила расширения и взаимодействие с переменными среды немного странны. По моему опыту, у этого есть несколько полезных вариантов использования («какую версию JVM я на самом деле хочу построить?»), Но каждый контейнер , построенный из образа, будет иметь то же унаследованное значение ARG; это не очень хороший механизм для конфигурации во время выполнения .
  • Для различных вещей, которые могут быть установлены в Dockerfile или во время выполнения (переменные ENV, EXPOSE d-порты, значение по умолчанию CMD, особенно VOLUME), нет особой необходимости «объявлять» их в Dockerfile, чтобы иметь возможность устанавливать их во время выполнения.

Есть пара более или менее эквивалентных способов сделать то, что вы описываете. (Я буду использовать синтаксис docker run для компактности.) Вероятно, наиболее гибкий способ - установить ROLE в качестве переменной окружения; когда вы запускаете сценарий точки входа, вы можете предположить, что $ROLE имеет значение, но его стоит проверить.

#!/bin/sh
# --> I expect $ROLE to be set
# --> Pass some command to run as additional arguments
if [ -z "$ROLE" ]; then
  echo "Please set a ROLE environment variable" >&2
  exit 1
fi
echo "You are running $ROLE version of your app"
exec "$@"
docker run --rm -e ROLE=some_role docker.local:5000/test /bin/true

В этом случае вы можете указать значение по умолчанию ROLE в Dockerfile, если хотите.

FROM centos:7.4.1708
COPY ./role.sh /usr/local/bin
RUN chmod a+x /usr/local/bin/role.sh
ENV ROLE="default_role"
ENTRYPOINT ["role.sh"]

Второй путь заключается в том, чтобы принять роль в качестве параметра командной строки:

#!/bin/sh
# --> pass a role name, then a command, as parameters
ROLE="$1"
if [ -z "$ROLE" ]; then
  echo "Please pass a role as a command-line option" >&2
  exit 1
fi
echo "You are running $ROLE version of your app"
shift        # drops first parameter
export ROLE  # makes it an environment variable
exec "$@"
docker run --rm docker.local:5000/test some_role /bin/true

Я бы, вероятно, предпочел бы путь с переменной окружением, поскольку он немного легче предоставить несколько несвязанных опций и не смешивать «настройки» и «команду» в части «команда» вызова Docker.

Относительно того, почему ваш модуль «падает»: Kubernetes обычно ожидает, что он будет работать долго, поэтому, если вы напишите контейнер, который просто печатает что-то и выходит, Kubernetes перезапустит его, а когда он не будет работать, он будет всегда находиться в состоянии CrashLoopBackOff. Что вы пытаетесь сделать прямо сейчас, не беспокойтесь об этом и посмотрите на kubectl logs капсулы. Подумайте об установке политики перезапуска спецификации модуля pod, если это вас беспокоит.

9
задан DIF 28 February 2012 в 11:39
поделиться

3 ответа

Установите метод запроса отправить, прежде, чем назвать GetRequestStream

как

request.Method = "POST";

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
    writer.Write("nick=" + username + "&password=" + password);
}
5
ответ дан 4 December 2019 в 21:52
поделиться

Вы могли бы также хотеть выяснить общую длину того, что Вы отправляете, заранее, и устанавливаете это как ContentLength запроса. См. MSDN:

ProtocolViolationException брошен в несколько случаев, когда набор свойств на классе HttpWebRequest конфликтует. Это исключение происходит, если приложение устанавливает свойство ContentLength и свойство SendChunked к истинному, и затем отправляет HTTP-запрос GET. Это исключение происходит, если приложение пытается отправить разделенный на блоки к серверу, который только поддерживает протокол HTTP 1.0, где это не поддерживается. Это исключение происходит, если приложение пытается отправить данные, не устанавливая свойство ContentLength, или SendChunked является ложью, когда буферизация отключена, и на соединении проверки активности (свойство KeepAlive верно).

1
ответ дан 4 December 2019 в 21:52
поделиться

Мое предположение - то, что проблема, которую Вы испытываете, происходит из-за того (как другие, советовали), что Вы делаете ПОЛУЧИТЬ запрос вместо запроса POST. Кроме того, я заметил, что подлинное имя для поля пароля на той странице является "heslo" и не "паролем". Эта опечатка не заставит веб-сервер не возвращать ответ, но это вызовет другие проблемы, так как сервер ищет то определенное имя переменной, которое будет отправлено со значением пароля.

3
ответ дан 4 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: