IXMLHTTPRequest2上传失败

时间:2013-12-10 14:47:20

标签: windows-phone-8 windows-runtime c++-cx

我正在创建一个将图片上传到我们服务器的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);
});

0 个答案:

没有答案