ISAPI 用了ReadClient后,导致上传图片失败

双刃剑客 2012-10-12 02:41:36
ISAPI 用了ReadClient后,导致上传图片失败或者上传成功后,图片变形.
代码如下




nsigned long ulSize = pEcb->cbTotalBytes ;
char* lpszContent = new char[ulSize + 1];
if (NULL != lpszContent)
{
//由于效率比较低,用字符串末尾加\0的形式
//memset(lpszContent,0, ulSize + 1);
if (ulSize <= pEcb->cbAvailable)
{
memcpy(lpszContent,pEcb->lpbData,ulSize);
lpszContent[ulSize] = '\0';
}
else
{
memcpy(lpszContent,pEcb->lpbData,pEcb->cbAvailable);

//看是否要读取额外的数据
char* lpszPointer = lpszContent + pEcb->cbAvailable;
DWORD cbQuery = ulSize - pEcb->cbAvailable;
DWORD cbRealQuery = 0;
BOOL bReadRet = FALSE;
char* lpszEnd = lpszContent + ulSize;
while (0 < cbQuery)
{
cbRealQuery =cbQuery;
bReadRet = pEcb->ReadClient(pEcb->ConnID,lpszPointer,&cbRealQuery);

if (FALSE == bReadRet)
{
int nError = GetLastError();
//失败的时候,IIS6中cbRealQuery大于0,值没有被改变
break;
}

if (0 >= cbRealQuery)
{
//防止出现死循环
break;
}

if(lpszPointer + cbRealQuery > lpszEnd)
{
//如果越界,退出
break;
}
cbQuery = cbQuery - cbRealQuery;
lpszPointer += cbRealQuery;
}
lpszPointer[0] = '\0';
}

//..做某些防护操作
//释放资源
delete[] lpszContent;
lpszContent = NULL;
}
...全文
810 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qdmagic 2013-04-10
  • 打赏
  • 举报
回复
楼主你好,我目前也在做isapi方面的工作,有个问题无法解决,不知能否解答一下,我在做异步处理的时候,HSE_REQ_EXEC_URL调用后,GetlastError = 1001,递归错误,代码如下: ExecUrlInfo.pszUrl = NULL; // Use original request URL ExecUrlInfo.pszMethod = NULL; // Use original request method ExecUrlInfo.pszChildHeaders = NULL; // Use original request headers ExecUrlInfo.pUserInfo = NULL; // Use original request user info ExecUrlInfo.pEntity = NULL; // Use original request entity ExecUrlInfo.dwExecUrlFlags = HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR; if (pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_EXEC_URL,&ExecUrlInfo, NULL, NULL))
双刃剑客 2012-10-12
  • 打赏
  • 举报
回复
哪位大牛能帮我看下问题所在吗
双刃剑客 2012-10-12
  • 打赏
  • 举报
回复

#include "windows.h"
#include "stdio.h"
#include "httpext.h"

#define MAX_BUF_SIZE (8192) /* 每次能读取的最大字节数*/
#define MEM_ALLOC_THRESHOLD (1024 * 1024) /* 默认堆栈大小 1M */
VOID WINAPI ExecUrlCompletion(EXTENSION_CONTROL_BLOCK* pEcb, PVOID pContext,
DWORD dwcbIO, DWORD dwError);

/**
* 设置ISAPI扩展的版本,本函数为isapi的入口函数.
* @param[out] pVer 结构体HSE_VERSION_INFO指针
* @return TRUE or FALSE
*/
BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer)
{
pVer->dwExtensionVersion = MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR);

lstrcpynA(pVer->lpszExtensionDesc,
"test2",
HSE_MAX_EXT_DLL_NAME_LEN - 1);

return TRUE;
}

/**
* ISAPI扩展主函数,实现异步读取数据并判断关键词.
* @param[in] pECB 结构体EXTENSION_CONTROL_BLOCK指针
* @return HSE_STATUS_SUCCESS or HSE_STATUS_PENDING or HSE_STATUS_ERROR
*/
DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB)
{
try
{
if (strcmp(pECB->lpszMethod, "POST") == 0)
{
if (0 < pECB->cbTotalBytes)
{
unsigned long ulSize = pECB->cbTotalBytes ;
char* lpszContent = new char[ulSize + 1];
if (NULL != lpszContent)
{
//由于效率比较低,用字符串末尾加\0的形式
//memset(lpszContent,0, ulSize + 1);
if (ulSize <= pECB->cbAvailable)
{
memcpy(lpszContent,pECB->lpbData,ulSize);
lpszContent[ulSize] = '\0';
}
else
{
memcpy(lpszContent,pECB->lpbData,pECB->cbAvailable);

//看是否要读取额外的数据
char* lpszPointer = lpszContent + pECB->cbAvailable;
DWORD cbQuery = ulSize - pECB->cbAvailable;
DWORD cbRealQuery = 0;
BOOL bReadRet = FALSE;
char* lpszEnd = lpszContent + ulSize;
while (0 < cbQuery)
{
cbRealQuery =cbQuery;
bReadRet = pECB->ReadClient(pECB->ConnID,lpszPointer,&cbRealQuery);

if (FALSE == bReadRet)
{
int nError = GetLastError();
//失败的时候,IIS6中cbRealQuery大于0,值没有被改变
break;
}

if (0 >= cbRealQuery)
{
//防止出现死循环
break;
}

if(lpszPointer + cbRealQuery > lpszEnd)
{
//如果越界,退出
break;
}
cbQuery = cbQuery - cbRealQuery;
lpszPointer += cbRealQuery;
}
lpszPointer[0] = '\0';
}

//..做某些防护操作
//释放资源
delete[] lpszContent;
lpszContent = NULL;
}
}
}
}
catch (...)
{
//ODS("异常(HttpExtensionProc");
}

//下面是IIS的正常数据处理流程
LPSTR pszUrl = NULL;
DWORD dwDataLen = 0;
HSE_EXEC_URL_INFO ExecUrlInfo;
BOOL bResult = FALSE;
// 获得当前访问URL
if (!pECB->GetServerVariable(pECB->ConnID, "URL", NULL, &dwDataLen))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
pszUrl = (LPSTR)LocalAlloc(LPTR, dwDataLen);
if (pszUrl)
{
bResult = TRUE;
pECB->GetServerVariable(pECB->ConnID,
"URL",
pszUrl,
&dwDataLen );
}
}
}
else
{
/*CLogger::WriteLog("处理URL出错,错误代码%lu",GetLastError());*/
}

// 将该访问提交到完成端口.
if(bResult && pszUrl)
{
bResult = FALSE;
if (pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_IO_COMPLETION,
ExecUrlCompletion, NULL, (LPDWORD)pszUrl))
{
// 回调子访问函数
ExecUrlInfo.pszUrl = NULL; // Use original request URL
ExecUrlInfo.pszMethod = NULL; // Use original request method
ExecUrlInfo.pszChildHeaders = NULL; // Use original request headers
ExecUrlInfo.pUserInfo = NULL; // Use original request user info
ExecUrlInfo.pEntity = NULL; // Use original request entity
ExecUrlInfo.dwExecUrlFlags = HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR;

if (pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_EXEC_URL,
&ExecUrlInfo, NULL, NULL))
{
bResult = TRUE;
}
else
{
//CLogger::WriteLog("处理HSE_REQ_EXEC_URL出错,错误代码%lu",GetLastError());
}
}
else
{
//CLogger::WriteLog("处理COMPLETIO出错,错误代码%lu",GetLastError());
}
}

//如果有发生错误,进行释放资源
if(!bResult)
{
if ( pszUrl )
{
LocalFree( pszUrl );
pszUrl = NULL;
}
//SendServerError(pECB,CConstPara::m_pszKeyword);
return HSE_STATUS_ERROR;
}
return HSE_STATUS_PENDING;
}

/**
* 完成端口回调函数.
* @param[in] pEcb 结构体EXTENSION_CONTROL_BLOCK指针
*/
VOID WINAPI ExecUrlCompletion(EXTENSION_CONTROL_BLOCK* pEcb, PVOID pContext,
DWORD dwcbIO, DWORD dwError)
{
LPSTR pszChildUrl;
pszChildUrl = (LPSTR)pContext;

// 释放之前分配的空间
if ( pszChildUrl )
{
LocalFree( pszChildUrl );
pszChildUrl = NULL;
}

// 通知iis我们已经处理完请求
pEcb->ServerSupportFunction(
pEcb->ConnID,
HSE_REQ_DONE_WITH_SESSION,
NULL,
NULL,
NULL
);
}



/**
* ISAPI扩展退出函数函数.
* @param[in] dwFlags HSE_TERM_ADVISORY_UNLOAD or HSE_TERM_MUST_UNLOAD
* @return TRUE
*/
BOOL WINAPI TerminateExtension(DWORD dwFlags)
{
return TRUE;
}


LPVOID AR_Allocate(DWORD dwSize)
{
LPVOID pvData = NULL;

if (dwSize > MEM_ALLOC_THRESHOLD)
{
pvData = VirtualAlloc(NULL,
dwSize,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE);
}
else
{
pvData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
}

return pvData;
}

BOOL AR_Free( DWORD dwSize, LPVOID pvData)
{
BOOL bReturn = FALSE;

if (dwSize > MEM_ALLOC_THRESHOLD)
{
bReturn = VirtualFree(pvData, 0, MEM_RELEASE);
}
else
{
bReturn = HeapFree(GetProcessHeap(), 0, pvData);
}

return bReturn;
}


8,327

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 IIS
社区管理员
  • IIS
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧