1

POSTリクエスト(c ++およびwinapi)を介してファイルをHTTPサーバーに送信しようとしています。手順は次のとおりです。

// Read file into "buff" and file size into "buffSize" 
        ....
    ....
    ....

    HINTERNET internetRoot;
    HINTERNET httpSession;
    HINTERNET httpRequest;

    internetRoot = InternetOpen(agent_info, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL);

    //Connecting to the http server
    httpSession = InternetConnect(internetRoot, IP,PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL);

    //Creating a new HTTP POST request to the default resource on the server
    httpRequest = HttpOpenRequest(httpSession, TEXT("POST"), TEXT("/Post.aspx"), NULL, NULL, NULL, INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE, NULL);

    //Send POST request
    HttpSendRequest(httpRequest, NULL, NULL, buff, buffSize);

    //Closing handles...

サーバーで、このコード(asp.net)を使用してファイルを受信して​​います

Stream httpStream;
        try
        {
            httpStream = request.RequestContext.HttpContext.Request.InputStream;
        }
        catch (HttpException)
        {
            return;
        }

            byte[] tmp = new byte[httpStream.Length];
            int bytesRead = httpStream.Read(tmp, 0, 1024 * 1024);
            int totalBytesRead = bytesRead;
            while (bytesRead > 0)
            {
                bytesRead = httpStream.Read(tmp, totalBytesRead, 1024 * 1024);
                totalBytesRead += bytesRead;
            }
            httpStream.Close();
            httpStream.Dispose();

           //Save "tmp" to file...

ローカルサーバー(Visual Studio aspサーバー)で大きなファイルを送信できますが、1MBを超えるファイルをインターネットサーバーに送信できません。(HttpOpenRequestが失敗しています)ファイルをアップロードするためのより良い方法はありますか?

4

2 に答える 2

1

どのようなエラーが表示されますか? GetLastError() は何を返すのでしょうか? ファイル 800KB を送信すると、正常に動作しますか? HttpOpenRequest はデータのサイズを認識していないため、実際にはどうすればよいかわかりません。

多分それはタイムアウトしますか?しかし、これは HttpSendRequest が実際に失敗することを意味します。すべてのデータをバッファリングする可能性がありますが、サイズが大きいため、タイムアウトが許容するよりも時間がかかります。

次のコードを使用して、現在のタイムアウト (ミリ秒単位) を照会します。

InternetQueryOption(h, INTERNET_OPTION_RECEIVE_TIMEOUT, &dwReceiveTimeOut, sizeof(dwReceiveTimeOut));
InternetQueryOption(h, INTERNET_OPTION_SEND_TIMEOUT, &dwSendTimeOut, sizeof(dwSendTimeOut));

新しいものを設定するには、次のようにします。

InternetSetOption(h, INTERNET_OPTION_RECEIVE_TIMEOUT, &dwNewReceiveTimeOut, sizeof(dwNewReceiveTimeOut));
InternetSetOption(h, INTERNET_OPTION_SEND_TIMEOUT, &dwNewSendTimeOut, sizeof(dwNewSendTimeOut));
于 2012-04-12T22:26:31.420 に答える
1

警告: 最近、私の Wininet は非常に錆びています。

「Content-Length」ヘッダーを自分で設定する必要があるのだろうか。あなたのコードは、a) HTTP/1.0 リクエストを作成しているか、b)HttpSendRequestあなたのヘッダーを追加するかのいずれかを想定しているようです (これはそうではないと思います)。

どちらの場合でも、着信要求の大きさがサーバーに通知されない場合、IIS の既定の構成では、要求のサイズ自体をすばやく判断できない場合に拒否されます。

私の推測では、関数のパラメーターlpszHeadersdwHeadersLengthパラメーターを使用しHttpSendRequestて適切な「Content-Length」ヘッダーを含めると、問題は解決します。

于 2012-04-12T22:03:13.773 に答える