1

我正在尝试从 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);
4

3 回答 3

2

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

    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();
于 2013-11-08T12:53:53.280 回答
1

调用.ConfigureAwait(false)您的 Async 方法。

这篇文应该解释为什么以及如何。

于 2014-09-18T15:45:54.153 回答
1

我们遇到了同样的问题,但事实证明这是一个与最初猜测不同的问题。

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

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

于 2017-03-23T18:47:15.163 回答