Отправка сообщения на фабрику создания в RTC, но получение ответа «GET»

Я столкнулся со странным поведением, и я уверен, что это связано с моим кодом, а не с экземпляром RTC, с которым я работаю.

У меня есть настройка и настройка веб-запроса:

var cookies = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(getCreationFactoryUri);
var xmlString = getRDF.ToString();

request.CookieContainer = cookies;
request.Accept = "application/rdf+xml";
request.Method = "POST";    
request.ContentType = "application/rdf+xml";
request.Headers.Add("OSLC-Core-Version", "2.0");
request.Timeout = 40000;
request.KeepAlive = true;
byte[] bytes = Encoding.ASCII.GetBytes(xmlString);
request.ContentLength = bytes.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();

Это передается другому методу, написанному на основе примера RTC с использованием проверки подлинности форм для RTC.

В соответствии со спецификацией OSLC v2 я использую URL-адрес фабрики создания для публикации. Я знаю, что URL-адрес в порядке, потому что я настроил вызов с помощью RESTClient в Firefox. Добавил необходимые заголовки (Content-Type: application/rdf+xml, Accept: application/rdf+xml, OSLC-Core-Version: 2.0) и использовал сгенерированный XML, который пытается передать мой код. Мой ручной вызов работает отлично, и билет создается.

В своих журналах я зафиксировал ответ от RTC, который представляет собой список заявок, а не ответ, показывающий, что моя заявка создается. Я могу воссоздать это поведение, выполнив GET для URL-адреса фабрики создания, который я использую для создания билета на событие.

Поэтому, хотя я знаю, что отправляю POST на фабрику создания (я отладил, чтобы убедиться, что мой метод веб-запроса был на 100% установлен на «POST»), RTC вместо этого возвращает список билетов, и я могу только сделать вывод, что мой запрос обрабатывается как «ПОЛУЧИТЬ».

В качестве теста я изменил свой запрос на использование PUT вместо POST. Это не разрешено для использования в URL-адресе фабрики создания, и при тестировании это действительно вызывает ошибку. Поэтому я совершенно возмущен тем, почему RTC не создает мой билет, а вместо этого обрабатывает мой запрос как GET и возвращает список билетов.

У кого-нибудь есть идеи?

Спасибо.


person Sulphy    schedule 28.08.2015    source источник
comment
Можете ли вы указать, какой именно запрос вы отправляете и что возвращается? Также проверьте поведение, когда вы делаете тот же запрос с помощью плагина POSTER для Firefox.   -  person Krzysztof Kazmierczyk    schedule 31.08.2015


Ответы (1)


Если сервер использует аутентификацию формы, как вы утверждаете, то я ожидаю, что происходит то, что POST приводит к перенаправлению HTTP на форму аутентификации. Даже если ваш другой код обрабатывает эту аутентификацию (что звучит так), результатом этой аутентификации будет HTTP-перенаправление на URL-адрес исходного запроса. Однако это перенаправление, скорее всего, приведет к GET на этот URL, а не на исходный POST. (Кроме того, я не верю, что перенаправление после аутентификации на 100% надежно, если ваши запросы многопоточные).

В информации Jazz.net об аутентификации с помощью формы говорится: "После успешной аутентификации вы всегда необходимо повторить исходный запрос хотя бы один раз, чтобы получить доступ к защищенному ресурсу. Может потребоваться больше повторов, если первое воспроизведение привело к другому набору перенаправлений, а исходный запрос имел метод, отличный от GET».

Поэтому, если ваш код получил запрос аутентификации, вам нужно будет повторно отправить исходный POST.

Я считаю, что причина, по которой подключаемый модуль RESTClient в вашем браузере работает впервые, заключается в том, что он отправляет файлы cookie из вашего предыдущего входа в веб-интерфейс RTC в браузере. (У меня был такой опыт недавно, и он также показался мне очень запутанным).

Кроме того, если вы не сохраняете файлы cookie между запросами к RTC в своем клиентском приложении, вы будете сталкиваться с проблемой аутентификации для каждого запроса. Если вы сохраняете файлы cookie между вызовами из вашего клиентского приложения (как вы это сделаете, это будет зависеть от вашей клиентской библиотеки — я не знаком с кодом в ваших примерах), то, по моему опыту, вы не будете получать вызов аутентификации для каждого запроса . (Тем не менее, вам по-прежнему необходимо иметь возможность обрабатывать вызов аутентификации для каждого запроса, включая POST, в противном случае он может периодически давать сбой, если время ожидания сеанса истекает непосредственно перед отправкой POST).

person Martin Pain    schedule 10.09.2015