1

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これを見て、サーバーがメッセージを受け入れないことが原因だと思いました。http://blah/Requestしかし、他のいくつかの読みは、URIがプロキシを使用して生成されていることを示唆しており、その/Requestようにする必要があります。POST /Request HTTP/1.1

では、この一般的な理由は何でしょうか。また、プロキシの問題である場合、どのように分類されますか?

以下で尋ねられるように、より具体的なリクエストに対して新しい質問を作成しました。HTTP POST ヘッダーで絶対 URI を相対 URI に変更する

4

3 に答える 3

1

POST リクエストに問題はないので、問題は別の場所にあるはずです。

途中で問題を引き起こす可能性のある場所が他にもいくつかあります。

  1. HTTP メソッドを変更しているサーバーとの間に不良プロキシがある可能性があります
  2. サーバーが誤動作しているか、単に POST をサポートしていない可能性があります

しかし、私の推測では、サーバーは HTTP メソッドを調べるだけではなく、XML ペイロードがラップしている RPC 呼び出しに応答して 405 エラーを返しているのだと思います。

一部の RPC サーバーは、(誤って) このような HTTP ステータス コードを使用して、要求されたメソッドを実行できないこと、またはアクセス許可とセキュリティの性質を持つ要求に何か問題があることを示します。

サーバーの動作がわずかに改善された場合 (運が良かった場合)、405 エラーの原因を示す可能性のある追加情報が応答本文に返されるはずです。

于 2012-04-04T16:37:26.033 に答える
0

あなたの POST は完全に無効のようです。POST データはエンコードされ (つまり、multipart/form-data として)、適切なエンコードと境界などで正しい content-type (つまり、application/x-www-form-urlencoded) を使用することになっています。テキストの塊であり、それが反転しても驚かない.

VB が舞台裏で何をしているのかは 100% わかりませんが、この 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 フォームはありますか?

于 2012-04-11T04:59:38.533 に答える
0

Content-Typeに必要なヘッダーがありませPOSTんか? 詳細はこちらをご覧ください。必須だと思います。

于 2012-04-11T04:34:33.167 に答える