WebRequest.GetRequestStreamAsync()方法每次MNS访问令牌超时
Posted
技术标签:
【中文标题】WebRequest.GetRequestStreamAsync()方法每次MNS访问令牌超时【英文标题】:WebRequest.GetRequestStreamAsync() method timesout each time for MNS access token 【发布时间】: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);
【问题讨论】:
【参考方案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 的调用会挂起。
似乎这背后的代码持有一些有限(相当少)数量的套接字或锁,这甚至不允许进一步的请求开始,直到前一个请求完成。
【讨论】:
以上是关于WebRequest.GetRequestStreamAsync()方法每次MNS访问令牌超时的主要内容,如果未能解决你的问题,请参考以下文章