尝试从PCL项目发布数据时出现异常

时间:2015-11-12 10:08:41

标签: c# .net httpwebrequest portable-class-library

我正在尝试将 PCL 项目中的数据发布到远程服务器。以下是我的代码:

public async Task<bool> SendToken(string deviceToken, string userId)
        {
            HttpWebRequest request;
            string url = "http://192.168.1.171:91/api/updatePushDeviceToken";
            request = (HttpWebRequest)WebRequest.Create(url);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Accept = "application/json";
            request.Method = "POST";
            string postData = string.Format("userId={0};token={1}&deviceType={2}", userId, deviceToken, deviceType);
            var data = Encoding.UTF8.GetBytes(postData);

            try
            {
                request.BeginGetResponse(new AsyncCallback(FinishRequest), request);    
            }
            catch (Exception e)
            {
                string m = e.Message;
            }

            return false;
        }

        private void FinishRequest(IAsyncResult result)
        {
            HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;

            Stream receiveStream = response.GetResponseStream();
            StreamReader readStream = new StreamReader(receiveStream);

            var responseString = readStream.ReadToEnd();

        }

在上面运行代码时,抛出以下异常:

  

System.Net.WebException:远程服务器返回错误:(411)   需要长度。

PCL不包含ContentLength属性,因此我添加了如下所示的长度,但现在我得到例外:

try
{
    request.Headers[HttpRequestHeader.ContentLength] = "0";
}
catch (Exception e)
{

}
  

System.ArgumentException:必须使用。修改此标头   适当的财产。在   System.Net.WebHeaderCollection.CheckRestrictedHeader(System.String   headerName)

1 个答案:

答案 0 :(得分:0)

您的请求缺少发布参数的ContentLength属性。

            var parameters = Encoding.ASCII.GetBytes(qstring);
            var request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.AllowAutoRedirect = false;
            request.ContentType="application/x-www-form-urlencoded";
            request.Method = "POST";
            request.ContentLength = parameters.Length;

          //Send it
            var reqStream = request.GetRequestStream();
            reqStream.Write(parameters, 0, parameters.Length);   
            reqStream.Close();

        //read it
            var response = (HttpWebResponse)request.GetResponse();
            var sr = new StreamReader(response.GetResponseStream());
            string responseHtml = sr.ReadToEnd().Trim();

请使用查询字符串格式发布数据,例如:&#34; userId = {0}&amp; token = {1}&amp; ...&#34;