我正在创建一个将图片上传到我们服务器的WP8应用程序。
为此,我创建了一个Windows Phone组件,用于使用IXMLHTTPRequest2完成所有连接任务。 我遇到的问题是,当我上传图片并花费比预期更长的时间时,我在OnError函数中遇到以下错误:INET_E_DOWNLOAD_FAILURE(0x800C0008L) 研究问题,似乎手机停止发送数据,但有时很长一段时间(可能是1分钟)它继续并发送更多的字节(不是所有剩余的)所以问题是几乎每次,通信中断,即使服务器仍在等待信息。 如果我使用WiFi连接没有问题,因为它不会花太多时间发送图片。
是否有任何人遇到类似问题,我该怎么做才能解决这个问题?
代码(摘要)是:
ComPtr<IXMLHTTPRequest2> _httpRequest = NULL;
ComPtr<IXMLHTTPRequest2Callback> _xhrCallback = NULL;
ComPtr<html_internal> _mhtmlInternal = NULL;
cancellation_token_source _cancellationTokenSource;
hResultXHR = CoCreateInstance(CLSID_XmlHttpRequest, nullptr, CLSCTX_INPROC, IID_PPV_ARGS(&_httpRequest));
dwError = getURI(&pwcURI, this->_host->Data(), this->_cgiPath->Data(), this->_port, this->_secure);
_cancellationTokenSource = cancellation_token_source();
_mhtmlInternal = Make<html_internal>(_httpRequest.Get(), _cancellationTokenSource.get_token(), nullptr);
if (hResultXHR == S_OK)
hResultXHR = _mhtmlInternal.As(&_xhrCallback);
if (hResultXHR == S_OK)
hResultXHR = _httpRequest->Open(L"Post", //Método a utilizar
pwcURI,
_xhrCallback.Get(),
nullptr,
nullptr,
nullptr,
nullptr);
if (hResultXHR == S_OK)
hResultXHR = _httpRequest->SetProperty(XHR_PROP_TIMEOUT, _timeReadOut);
if (hResultXHR == S_OK)
hResultXHR = _httpRequest->SetRequestHeader(L"Content-Type", L"text/plain;charset=utf-8");
if (hResultXHR == S_OK)
hResultXHR = CreateStreamOnHGlobal(NULL, TRUE, &_pISendStream);
if (hResultXHR == S_OK)
hResultXHR = CreateStreamOnHGlobal(NULL, TRUE, &_pIRecvStream);
if (hResultXHR == S_OK)
{
if (_pISendStream != NULL)
hResultXHR = _httpRequest->Send(_pISendStream, p->ulSize);
else
hResultXHR = _httpRequest->Send(nullptr, 0);
}
return create_async([this, _mhtmlInternal, hResultXHR]() -> int
{
_mhtmlInternal->CreateDataTask();
_mhtmlInternal->CreateDataTask().wait();
_statusCode = 0;
HRESULT hResultXHR = _mhtmlInternal->GetError();
if (hResultXHR == S_OK)
{
_statusCode = _mhtmlInternal->GetStatusCode();
auto reasonPhrase = _mhtmlInternal->GetReasonPhrase();
if (_statusCode == 200)
{
//Do stuff
}
}
if (this->_pIRecvStream != NULL)
{
this->_pIRecvStream->Release();
this->_pIRecvStream = NULL;
}
if (this->_pISendStream != NULL)
{
this->_pISendStream->Release();
this->_pISendStream = NULL;
}
return (this->dwError);
});