每次MNS访问令牌的WebRequest.GetRequestStreamAsync()方法超时

时间:2013-06-10 20:34:41

标签: c# httpwebrequest push-notification windows-store-apps

我试图从MNS获取推送通知的访问令牌,每次WebRequest.GetRequestStreamAsync()方法超时。有什么建议吗?

参考:http://msdn.microsoft.com/en-us/library/windows/apps/hh913756.aspx

以下是我使用的代码

        HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create("https://login.live.com/accesstoken.srf");
        webRequest.Method = "POST";
        webRequest.ContentType = "application/x-www-form-urlencoded";

        string postString = String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com",
                              SID,
                              SECRET_KEY);
        byte[] data = Encoding.UTF8.GetBytes(postString);
        Stream newStream = await webRequest.GetRequestStreamAsync();
        newStream.Write(data, 0, data.Length);

3 个答案:

答案 0 :(得分:1)

尝试重写它,看看它是否有所作为。我有时遇到HttpWebRequest的问题,其中WebRequest工作正常。还要确保关闭你的溪流。

    WebRequest webRequest = WebRequest.Create("https://login.live.com/accesstoken.srf");
    webRequest.Method = "POST";
    webRequest.ContentType = "application/x-www-form-urlencoded";

    string postString = String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com",
                          SID,
                          SECRET_KEY);
    byte[] data = Encoding.UTF8.GetBytes(postString);
    Stream newStream = await webRequest.GetRequestStreamAsync();
    newStream.Write(data, 0, data.Length);
    newStream.Close();

    WebResponse response = webRequest.GetResponse();
    StreamReader requestReader = new StreamReader( response.GetResponseStream() );
    string webResponse = requestReader.ReadToEnd();
    response.Close();

答案 1 :(得分:1)

在Async方法上调用.ConfigureAwait(false)

blog post应解释原因和方法。

答案 2 :(得分:1)

我们遇到了同样的问题,结果证明这是一个问题,而不是原本猜测的问题。

您需要.Dispose()或至少.Close()您从.GetResponseAsync获得的响应,否则下一次调用.GetRequestStreamAsync会挂起。< / p>

这背后的代码似乎拥有一些有限(相当低)的套接字或锁定数量,在前一个请求完成之前不允许进一步的请求甚至开始。