0

私たちの環境には、ロード バランサーの背後で実行されている複数の Web サーバーがあります。ロード バランサーをバイパスする Web サーバーに直接アクセスするようにホスト ファイルを変更すると、HttpWebRequest は正常に機能します。ホスト ファイルのエントリを削除し、リクエストがロード バランサーを通過するようにすると、404 が返されます。ただし、同じコンピューターで単純な .html ファイルを使用して同じリクエストを実行すると、そこから HttpWebRequest を実行すると、すべて正常に動作します。ホストファイルにエントリがあるかどうか。

HTMLファイルを使用してブラウザー(Chrome)を介して動作するが、HttpWebRequestでは動作しない理由はありますか?

リクエストは、ファイルと他の 3 つのパラメータをアップロードする POST リクエストです。

アイデアをお寄せいただきありがとうございます。

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1編集: html ファイルを使用するときに Chrome が送信するUserAgent を設定しようとしました。

これが私が使用していて、ロードバランサーが混在していないときに現在機能している機能です。

private void PostFileToWebServer(byte[] file)
    {
        string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

        var request = (HttpWebRequest)WebRequest.Create(_url);
        request.ContentType = "multipart/form-data; boundary=" + boundary;
        request.Method = "POST";
        request.KeepAlive = true;
        //Time in milliseconds
        request.Timeout = 1200000;

        request.Host = "ourdomain.com";
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1";
        request.CookieContainer = new CookieContainer(100000);

        var memStream = new MemoryStream();

        byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

        string formDataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";

        foreach(var key in _parameters.AllKeys)
        {
            string formData = string.Format(formDataTemplate, key, _parameters[key]);

            byte[] formDataBytes = Encoding.UTF8.GetBytes(formData);
            memStream.Write(formDataBytes, 0, formDataBytes.Length);
            memStream.Write(boundarybytes, 0, boundarybytes.Length);
        }

        string header = string.Format("Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"\r\n Content-Type: application/octet-stream\r\n\r\n", _fileName);
        byte[] headerBytes = Encoding.UTF8.GetBytes(header);
        memStream.Write(headerBytes, 0, headerBytes.Length);

        memStream.Write(file, 0, file.Length);

        memStream.Write(boundarybytes, 0, boundarybytes.Length);

        request.ContentLength = memStream.Length;
        Stream requestStream = request.GetRequestStream();
        memStream.Position = 0;
        var tempBuffer = new byte[memStream.Length];
        memStream.Read(tempBuffer, 0, tempBuffer.Length);
        memStream.Close();

        requestStream.Write(tempBuffer, 0, tempBuffer.Length);
        requestStream.Close();

        var response = request.GetResponse();
        Stream stream2 = response.GetResponseStream();
        var reader2 = new StreamReader(stream2);

        System.Diagnostics.Debug.WriteLine(reader2.ReadToEnd());

        response.Close();
    }

編集:コメントアウトしましたrequest.ContentType = "multipart/form-data; boundary=" + boundary;が、ロードバランサーで動作します。誰でもこれについて説明がありますか?

4

1 に答える 1

0

わかりました、私と Fiddler は、成功した呼び出しと失敗した呼び出しの違いについて長い会話をしました。Fiddler は、ブラウザから送信された成功した呼び出しの最後の境界には、末尾に余分な「--」があると言います。私がそれを置くと、すべてがうまくいっているので、Content-Type をそのままにしておくことができます。

于 2012-09-19T19:07:17.040 に答える