【问题标题】:WebRequest.GetRequestStreamAsync() method timesout each time for MNS access tokenWebRequest.GetRequestStreamAsync()方法每次MNS访问令牌超时
【发布时间】:2013-06-10 20:34:41
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    尝试像这样重写它,看看它是否有所作为。我有时会遇到 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();
    

    【讨论】:

      【解决方案2】:

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

      这个blog post应该解释为什么以及如何。

      【讨论】:

        【解决方案3】:

        我们遇到了同样的问题,结果发现问题的出处与人们最初猜测的不同。

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

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

        【讨论】:

          猜你喜欢
          • 2018-12-23
          • 2022-10-31
          • 2018-09-20
          • 1970-01-01
          • 2014-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多