0

我正在制作一个 Windows Phone 应用程序,我正在尝试从 URL 获取 JSON 数据。用户需要登录到网站(托管 JSON 数据)才能获取 JSON 数据,我无法使用 Web 浏览器控件显示数据然后提取字符串,因为浏览器无法识别它(对于某些奇怪的原因)并要求在商店中搜索可以处理该 JSON 文件类型的应用程序。(如果我在 Windows PC 上的桌面浏览器中打开 URL,我可以看到原始 JSON 数据)。我不能使用普通的 HTTPWebRequest 或 WebClient 来获取 JSON 数据,需要设置登录 cookie(JSON 数据是用户特定的),我不能从 Web 浏览器控件中提取 cookie 并将其与 WebClient 或 HTTPWebRequest 一起使用。因此,我能做的最好的事情是使用 WebBrowser 内部使用的 IWebRequestCreate 的特殊内部实例。通过使用该类打开后台 HTTP 请求,cookie 会自动设置,就好像它们是由 WebBrowser 控件创建/发送的一样。但我的代码没有返回 JSON 数据,我得到空白响应,如字符串分别为空。

下面是代码:

Dim browser = New WebBrowser()
Dim brwhttp = GetType(WebRequestCreator).GetProperty("BrowserHttp")
Dim requestFactory = TryCast(brwhttp.GetValue(Browser, Nothing), IWebRequestCreate)
Dim uri = New Uri("http://api.quora.com/api/logged_in_user?fields=inbox,notifs,following,followers")
Dim req = requestFactory.Create(uri)
req.Method = "GET"
req.BeginGetResponse(New AsyncCallback(AddressOf request_Callback), req)

Private Sub request_Callback(asyncResult As IAsyncResult)
Dim webRequest As HttpWebRequest = DirectCast(asyncResult.AsyncState, HttpWebRequest)
Dim webResponse As HttpWebResponse = DirectCast(webRequest.EndGetResponse(asyncResult), HttpWebResponse)
Dim tempStream As New MemoryStream()
webResponse.GetResponseStream().CopyTo(tempStream)
Dim sr As New StreamReader(tempStream)
Dim resp As String = sr.ReadToEnd
End Sub

怎么了?

4

1 回答 1

1

我发现 CopyTo 可以将 Stream 的指针留在缓冲区的末尾,您可能需要在尝试使用 StreamReader 读取它之前将 tempStream 的指针重置为开头,这是代码...

webResponse.GetResponseStream().CopyTo(tempStream);

tempStream.Seek(0, SeekOrigin.Begin);

Dim sr As New StreamReader(tempStream);
于 2013-06-20T10:02:44.883 回答