2010-09-24 6 views
5

Ich sende eine WinHttp-Anfrage mit POST-Daten an ein PHP-Skript auf einem IIS7-Server, und der POST-Nachrichtentext wird nicht vom Server empfangen. Wenn ich über WinHttp mit GET oder POST mit einem NULL-Body oder über ein HTML-Formular mit POST mit einem Body sende, funktioniert alles wie erwartet.WinHttp POST-Nachricht nicht empfangen

Hier ist ein einfacher Code, um die Differenz zwischen den von WinHttp POST ruft mit und ohne Körper zeigt:

ohne Körper:

HINTERNET hSession = WinHttpOpen(L"WinHTTP/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);//WINHTTP_FLAG_ASYNC); 
HINTERNET mConnection = WinHttpConnect(hSession, L"127.0.0.1", 80, 0); 
HINTERNET hRequest = WinHttpOpenRequest(mConnection, L"POST", L"/test.php", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); 
void* bodyData = NULL; 
DWORD bodyLength = 0; 
bResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, bodyData, bodyLength, bodyLength, 0); 

Mit einem Körper:

HINTERNET hSession = WinHttpOpen(L"WinHTTP/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);//WINHTTP_FLAG_ASYNC); 
HINTERNET mConnection = WinHttpConnect(hSession, L"127.0.0.1", 80, 0); 
HINTERNET hRequest = WinHttpOpenRequest(mConnection, L"POST", L"/test.php", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); 
char* pBodyStr = "a=1&b=2"; 
void* bodyData = (void*) pBodyStr; 
DWORD bodyLength = strlen(pBodyStr); 
bResult = WinHttpSendRequest(hRequest, L"content-type:application/x-www-form-urlencoded", -1, bodyData, bodyLength, bodyLength, 0); 

So ist die Einziger Unterschied sind die body-Parameter und der Content-Type-Header. Das wirklich seltsame Ding ist, dass dies 1 von 20 mal funktionieren könnte, aber normalerweise wird der Körper nicht vom Server empfangen und es läuft ab. Irgendetwas ist hier offensichtlich falsch?

Antwort

2

Für alle anderen, die noch dieses Problem hat, versuchen PUT statt POST verwenden.

In meinem Fall war der WinHttp-Client in VFP, aber die Ergebnisse waren die gleichen. Ein POST, der über einen Browser gesendet wurde, funktionierte einwandfrei, aber als ich vom WinHttp-Objekt sendete, erschien der Anfragetext leer.

PUT, arbeitete jedoch in der Regel ... außer dass

// Simply using 
// 
// file_get_contents('php://input') 
//  
// does not work with the request sent by WinHttp.WinHttpRequest. 
$fp = fopen('php://input', 'rb'); 
stream_filter_append($fp, 'dechunk', STREAM_FILTER_READ); 
$report_contents = stream_get_contents($fp); 

Auch dies in browserbasierten Anfragen kein Problem war.

Auch der POST funktionierte gut für einen ASP.NET-Client. Dies kam nur beim Versuch, es auf einer PHP/Linux-Seite zu lesen.