我正在尝试通过http访问xml文件。地址类似于:
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),我会启动一个新问题但是如果这里有人可以指出我正确的方向,它会节省一些噪音。
感谢您的帮助。
答案 0 :(得分:1)
根据此Microsoft知识库文章,您可能遇到某种类型的数据包损坏:
出于兴趣,您在使用IServerXMLHTTPRequestPtr
时会遇到相同的情况吗?
答案 1 :(得分:1)
我想我找到了你的答案,你必须在日期前加上0。
XmlHttpRequest with If-Modified since, webserver returns "400 Bad Request"