405 - Метод не разрешен HttpWebRequest - PullRequest
1 голос
/ 02 апреля 2012

У меня проблема при попытке отправить запрос POST.Метод отправки выглядит следующим образом:

Public Sub SendXML(ByVal file As String)
    Dim reader As New StreamReader(file)
    Dim data As String = reader.ReadToEnd()
    reader.Close()
    Dim request As HttpWebRequest = WebRequest.Create("http://blah/Request")
    request.Method = "POST"

    System.Net.ServicePointManager.Expect100Continue = False

    Dim bytes As Byte() = System.Text.Encoding.ASCII.GetBytes(data)
    request.ContentLength = bytes.Length

    Dim oStreamOut As Stream = request.GetRequestStream()
    oStreamOut.Write(bytes, 0, bytes.Length)
    oStreamOut.Close()

    Dim response As HttpWebResponse = request.GetResponse()

End Sub

При запуске я получаю вышеуказанную ошибку.Через Fiddler я вижу, что запрос выглядит так:

POST http://blah/Request HTTP/1.1
Host: blah
Content-Length: 322
Proxy-Connection: Keep-Alive

<?xml version="1.0"?>
<Envelope>
<Header>
<UserID>uid</UserID>
<Password>pass</Password>
<SessionID />
<RequestType>GetDetails</RequestType>
<POSCompany>01</POSCompany>
<PackageType>DATA</PackageType>
<ActionType>READ</ActionType>
<SnoopUserID />
</Header>
<Body>
<MagicNumber>124</MagicNumber>
</Body>
</Envelope>

Теперь, глядя на это, я подозревал, что это произошло из-за того, что сервер не принимает POST сообщений.Но некоторые другие данные предполагают, что URI http://blah/Request был сгенерирован с прокси и должен иметь значение /Request, поэтому строка должна выглядеть следующим образом: POST /Request HTTP/1.1

Так что же является общей причиной этого?И если это проблема с прокси-сервером, как она сортируется?

Как указано ниже, я создал новый вопрос для более конкретного запроса. Изменение абсолютного URI на относительный в заголовке HTTP POST

Ответы [ 3 ]

1 голос
/ 04 апреля 2012

В запросе POST нет ничего плохого, поэтому проблема должна быть в другом месте.

На этом пути есть ряд других мест, которые могут вызывать проблемы:

  1. Между вами и сервером может быть неправильный прокси-сервер, который меняет метод HTTP
  2. Возможно, сервер работает со сбоями или просто не поддерживает POST

Однако я предполагаю, чтосервер делает больше, чем просто смотрит на метод HTTP, и вместо этого выдает ошибку 405 в ответ на вызов RPC о том, что ваша полезная нагрузка XML переносится.

Некоторые серверы RPC будут (ошибочно) использовать коды состояния HTTP, напримерэто указывает на то, что запрошенный метод не может быть выполнен или что-то еще не так с запросом, который имеет разрешения и характер безопасности.

Если сервер немного ведет себя лучше (ивам повезло), это должно возвращать дополнительную информацию в теле ответа, которая может указывать, где 405 eгрохот приходит.

0 голосов
/ 11 апреля 2012

Ваш POST, похоже, полностью недействителен. Предполагается, что данные POST должны быть закодированы (т.е. как multipart / form-data) и использовать правильный тип содержимого (то есть application / x-www-form-urlencoded) с правильной кодировкой и границами и т. Д. Вы просто отправляете серверу кусок текста, и я не удивлен, что он вылетает.

Я не уверен на 100%, что VB делает за кулисами, но эта страница MSDN предлагает вам установить тип контента для поддерживаемого метода, и вам, вероятно, понадобится Content-Disposition: form-data в заголовках также. Я нашел пример , который делает это и добавляет границы MIME:

string FileData = "this is test file data\r\n"; // test data to send.
StringBuilder DataString = new StringBuilder();
DataString.Append(dataBoundary + "\r\n");
//This sends the viewstate info
DataString.Append("Content-Disposition: form-data; name=" + HiddenValue
+ "\r\n"
+ dataBoundary + "\r\n");
DataString.Append("Content-Disposition: form-data; name=" + "\"" +
"File1" +
"\"" +
"; filename=" + "\"" + "TestFile3.txt" + "\"" + "\r\n");
DataString.Append("Content-Type: text/plain\r\n\r\n");
DataString.Append(FileData);
DataString.Append(dataBoundary + "\r\n");
DataString.Append("Content-Disposition: form-data; name=" + "\"" +
"Submit1" +
"\"" + "\r\n\r\n" + "Upload\r\n" + dataBoundary + "--\r\n");

Этот пример эмулирует загрузку файлового поля.

Для более простой версии вы можете использовать request.ContentType = "application/x-www-form-urlencoded" с данными в кодировке URL, такими как: Dim postData As String = "myURL=http%3A%2F%2Fexample.com%2Findex.php". Обратите внимание, что формат key=value, и данные должны быть сначала закодированы в URL.

Я не уверен, что именно вам нужно, хотя многое зависит от того, что на самом деле ожидает удаленный сервер для имен форм и полей. Это также зависит от того, действительно ли сервер следует соответствующим стандартам HTML и RFC. Есть ли у вас рабочая HTML-форма для использования в качестве руководства для того, что ожидает сервер?

0 голосов
/ 11 апреля 2012

Вам не хватает заголовка Content-Type, необходимого для POST?Читайте здесь для деталей.Я предполагаю, что это обязательно.

...