C# 从WebResponse类读取数据时过早结束

C# 从WebResponse类读取数据时过早结束,c#,windows-store-apps,webrequest,C#,Windows Store Apps,Webrequest,我正在使用C#开发一个Windows应用商店应用程序,我对这个平台非常陌生(我主要在IOS和Android上工作) 我有一个简单的异步方法从远程服务器下载原始数据。它工作正常,只是我一直看到WebResponse类中随机的不完整读取。这是一个非常简单的方法,我不明白为什么它会过早结束。远程服务器运行良好(ios/web/android运行良好,正在检索数据),因此我显然在这里做错了什么 任何有助于解决这个问题的方法都会很有用 public async Task<byte[]> doG

我正在使用C#开发一个Windows应用商店应用程序,我对这个平台非常陌生(我主要在IOS和Android上工作)

我有一个简单的异步方法从远程服务器下载原始数据。它工作正常,只是我一直看到WebResponse类中随机的不完整读取。这是一个非常简单的方法,我不明白为什么它会过早结束。远程服务器运行良好(ios/web/android运行良好,正在检索数据),因此我显然在这里做错了什么

任何有助于解决这个问题的方法都会很有用

public async Task<byte[]> doGETRequestAsync(String url)
{
    callSuccess = false;

    byte[] responseFromServer = null;
    try
    {
        WebRequest request = WebRequest.Create(url);    
        request.Method = "GET";
        WebResponse response = await request.GetResponseAsync();

        using (Stream dataStream = response.GetResponseStream())
        {
            responseFromServer = new byte[response.ContentLength];
            int readCount = await dataStream.ReadAsync(responseFromServer, 0, (int)response.ContentLength);
            if (readCount != response.ContentLength)
                throw new IOException("Premature end of data. Expected: " + response.ContentLength + " received: " + readCount);
        }


        response.Dispose();

    }
    catch (HttpRequestException hre)
    {
        Debug.WriteLine("Exception performing network call : " + hre.ToString());
    }
    catch (Exception e)
    {
        Debug.WriteLine("Exception performing network call : " + e.ToString());
    }

    return responseFromServer;
}
公共异步任务doGETRequestAsync(字符串url)
{
callSuccess=false;
字节[]responseFromServer=null;
尝试
{
WebRequest=WebRequest.Create(url);
request.Method=“GET”;
WebResponse=wait request.GetResponseAsync();
使用(Stream dataStream=response.GetResponseStream())
{
responseFromServer=新字节[response.ContentLength];
int readCount=wait dataStream.ReadAsync(responseFromServer,0,(int)response.ContentLength);
if(readCount!=response.ContentLength)
抛出新IOException(“数据提前结束。预期:“+response.ContentLength+”接收:“+readCount”);
}
response.Dispose();
}
捕获(HttpRequestException hre)
{
Debug.WriteLine(“执行网络调用时出现异常:+hre.ToString());
}
捕获(例外e)
{
WriteLine(“执行网络调用的异常:+e.ToString());
}
返回responseFromServer;
}

我切换到使用HttpClient和HttpClientHandler,它工作得非常好。这还支持存储cookie并在每次调用时重用cookie

下面的代码可以处理GET和POST,并将数据作为字节数组[]返回。如果响应是utf8编码的字符串,那么可以使用System.Text.Encoding.utf8.GetString(respBytes,0,respBytes.Length)将字节转换为字符串

希望对你有帮助

class Network
{
   static CookieContainer cookieJar = new CookieContainer();
   List<KeyValuePair<string, string>> postParameters = new List<KeyValuePair<string, string>>();

   // Add post parameter before calling NetworkRequestAsync for POST calls.
   public void addPostParameter(String key, String value)
   {
       postParameters.Add(new KeyValuePair<string, string>(key, value));

    }

    public async Task<byte[]> NetworkRequestAsync(String url, bool GET_REQUEST)
    {
        callSuccess = false;
        byte[] respBytes = null;
        try
        {
            HttpClientHandler handler = new HttpClientHandler()
            {
                // Use and reuse cookies in the cookiejar 
                CookieContainer = cookieJar
            };

            handler.AllowAutoRedirect = false;
            handler.UseCookies = true;

            HttpClient client = new HttpClient(handler as HttpMessageHandler)
            {
                BaseAddress = new Uri(@url)
            };

            HttpResponseMessage response = null;

            if (GET_REQUEST)
            {
                response = await client.GetAsync(client.BaseAddress);
            }
            else
            {

                HttpContent content = new FormUrlEncodedContent(postParameters);
                //String postparam=await content.ReadAsStringAsync();
                //Debug.WriteLine("Post Param1=" + postparam);

                response = await client.PostAsync(client.BaseAddress, content);

                callSuccess = true;
            }

            respBytes = await response.Content.ReadAsByteArrayAsync();

        }
        catch (Exception e)
        {
            Debug.WriteLine("Exception performing network call : " + e.ToString());
        } 

        return respBytes;
    }
类网络
{
静态CookieContainer cookieJar=新CookieContainer();
List postParameters=新列表();
//在为post调用调用调用NetworkRequestAsync之前添加post参数。
public void addPostParameter(字符串键、字符串值)
{
添加(新的KeyValuePair(key,value));
}
公共异步任务NetworkRequestAsync(字符串url,bool GET\u请求)
{
callSuccess=false;
字节[]respBytes=null;
尝试
{
HttpClientHandler handler=新的HttpClientHandler()
{
//在cookiejar中使用和重用cookie
CookieContainer=cookieJar
};
handler.AllowAutoRedirect=false;
handler.UseCookies=true;
HttpClient客户端=新HttpClient(处理程序为HttpMessageHandler)
{
BaseAddress=新Uri(@url)
};
HttpResponseMessage响应=null;
如果(获取请求)
{
response=wait client.GetAsync(client.BaseAddress);
}
其他的
{
HttpContent=新的FormUrlEncodedContent(后参数);
//字符串postparam=await content.ReadAsStringAsync();
//Debug.WriteLine(“Post Param1=“+postparam”);
响应=等待client.PostAsync(client.BaseAddress,content);
callSuccess=true;
}
respBytes=wait response.Content.ReadAsByteArrayAsync();
}
捕获(例外e)
{
WriteLine(“执行网络调用的异常:+e.ToString());
} 
返回字节数;
}

}

我已编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。我在标题中添加window store应用程序的原因是,在谷歌搜索时没有拉标签,而这个特定的类名太常见,使得搜索非常困难。事实证明并非如此。在搜索过程中,标签的使用非常明确。