400.0 - неверный запрос с MSXML2 :: IXMLHTTPRequestPtr - PullRequest
1 голос
/ 23 июня 2009

Я пытаюсь получить доступ к XML-файлу через http. Адрес похож на:

http://localhost/app/config/file.xml

При вставке этого в браузер, XML отображается как ожидалось. В моем программном обеспечении я использую:

MSXML2::IXMLHTTPRequestPtr rp;
...
rp->open( "GET" , "http://localhost/app/config/file.xml" );

и получить следующий ответ:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"     
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>IIS 7.0 Detailed Error - 400.0 - Bad Request</title> 
<style type="text/css"> 
<!

У кого-нибудь есть идеи, что может произойти?

РЕДАКТИРОВАТЬ: дополнительная информация, при попытке подключиться к другому серверу в офисе (к которому я могу подключиться с помощью браузера), я получаю ответ «Плохой запрос» и не более.

Функция вызова:

#import "msxml3.dll"

BOOL HTTPGet(LPCTSTR URL, CString &Response, long Timeout, BOOL ForceNoCache )
{
BOOL ret = FALSE;

MSXML2::IXMLHTTPRequestPtr rp;
//MSXML2::IServerXMLHTTPRequestPtr rp;

try
{
    HRESULT hr = rp.CreateInstance( __uuidof( MSXML2::XMLHTTP ) );
    //HRESULT hr = rp.CreateInstance( __uuidof( MSXML2::ServerXMLHTTP30 ) );

    if( SUCCEEDED( hr ) )
    {
        rp->open( "GET" , URL );
        if( ForceNoCache )
            rp->setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 1970 00:00:00 GMT" );
        rp->send();

        for( DWORD tc = GetTickCount() ; rp->readyState != 4 && GetTickCount() < tc + Timeout ; )
        {
            Sleep( 50 );
            //WaitMessage();
            for( MSG msg ; PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ; )
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }

        }

        if( rp->readyState == 4 )
        {
            Response = (LPCSTR)rp->responseText;
            ret = TRUE;
        }
        else
            Response = "Timed out";
    }
}
catch( CException &e )
{
    char err[ 2048 ];
    if( e.GetErrorMessage( err , sizeof( err ) ) )
        Response = err;
    else
        Response = "Unhandled exception";
}
catch( _com_error &e )
{
    Response = e.ErrorMessage();
}
catch( ... )
{
    Response = "Unhandled exception";
}

return ret;
}

EDIT2: Функция работает правильно, когда ForceNocache имеет значение false, из-за чего возникает проблема с заголовком If-Modified-Since ... Я задам новый вопрос, если не могу понять, почему это не нравится (по iis 7), но если кто-то здесь может направить меня в правильном направлении, это сэкономит немного шума.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Я думаю, что нашел ваш ответ, вы должны поставить дату перед 0.

XmlHttpRequest с If-Modified, поскольку веб-сервер возвращает «400 неверных запросов»

1 голос
/ 23 июня 2009

Согласно этой статье базы знаний Майкрософт, у вас может быть какое-то повреждение пакета:

Сообщение об ошибке: HTTP / 1.1 Ошибка 400 - неправильный запрос (KB247249)

Просто из интереса, вы испытываете то же самое при использовании IServerXMLHTTPRequestPtr?

...