.net - 使用 webrequest 的 API 返回失败
问题描述
我试图在我的应用程序中连接一个 api,这个连接以前有效,但现在停止了。
如果我使用任何浏览器或邮递员应用程序,结果是正确的,但是当我使用 webrequest、webclient 或 Visual Studio 中的任何方法时,我收到超时错误。
我放了用户代理,设置超时,使用ssl,每次结果都是一样的。
测试的端点是:
https://bittrex.com/api/v1.1/public/getmarkets
https://api.coinmarketcap.com/v1/ticker/?limit=1
当我像谷歌一样使用网站进行测试时,此响应有效。
任何想法?
使用 WebRequestHelper 更新
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates
Imports System.Text
Public Class WebRequestHelper
Private m_ResponseUri As Uri
Private m_StatusCode As HttpStatusCode
Private m_StatusDescription As String
Private m_ContentSize As Long
Private m_WebException As WebExceptionStatus
Public Property SiteCookies As CookieContainer
Public Property UserAgent As String = "Mozilla / 5.0(Windows NT 6.1; WOW32; Trident / 7.0; rv: 11.0) like Gecko"
Public Property Timeout As Integer = 30000
Public ReadOnly Property ContentSize As Long
Get
Return m_ContentSize
End Get
End Property
Public ReadOnly Property ResponseUri As Uri
Get
Return m_ResponseUri
End Get
End Property
Public ReadOnly Property StatusCode As Integer
Get
Return m_StatusCode
End Get
End Property
Public ReadOnly Property StatusDescription As String
Get
Return m_StatusDescription
End Get
End Property
Public ReadOnly Property WebException As Integer
Get
Return m_WebException
End Get
End Property
Sub New()
SiteCookies = New CookieContainer()
End Sub
Public Function GetSiteResponse(ByVal siteUri As Uri) As String
Dim response As String = String.Empty
ServicePointManager.DefaultConnectionLimit = 50
Dim maxFWValue As SecurityProtocolType = System.Enum.GetValues(GetType(SecurityProtocolType)).OfType(Of SecurityProtocolType)().Max()
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12 Or maxFWValue
ServicePointManager.ServerCertificateValidationCallback = AddressOf TlsValidationCallback
Dim Http As HttpWebRequest = WebRequest.CreateHttp(siteUri.ToString)
With Http
.Accept = "ext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
.AllowAutoRedirect = True
.AutomaticDecompression = DecompressionMethods.GZip Or DecompressionMethods.Deflate
.CookieContainer = Me.SiteCookies
.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate")
.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.7")
.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")
.KeepAlive = True
.MaximumAutomaticRedirections = 50
.ServicePoint.Expect100Continue = False
.ServicePoint.MaxIdleTime = Me.Timeout
.Timeout = Me.Timeout
.UserAgent = Me.UserAgent
End With
Try
Using webResponse As HttpWebResponse = DirectCast(Http.GetResponse, HttpWebResponse)
Me.m_ResponseUri = webResponse.ResponseUri
Me.m_StatusCode = webResponse.StatusCode
Me.m_StatusDescription = webResponse.StatusDescription
Dim contentLength As String = webResponse.Headers.Get("Content-Length")
Me.m_ContentSize = If(String.IsNullOrEmpty(contentLength), 0, Convert.ToInt64(contentLength))
Using responseStream As Stream = webResponse.GetResponseStream()
If webResponse.StatusCode = HttpStatusCode.OK Then
Dim reader As StreamReader = New StreamReader(responseStream, Encoding.Default)
Me.m_ContentSize = webResponse.ContentLength
response = reader.ReadToEnd()
Me.m_ContentSize = If(Me.m_ContentSize = -1, response.Length, Me.m_ContentSize)
End If
End Using
End Using
Catch exW As WebException
If exW.Response IsNot Nothing Then
Me.m_StatusCode = CType(exW.Response, HttpWebResponse).StatusCode
End If
Me.m_StatusDescription = "WebException: " & exW.Message
Me.m_WebException = exW.Status
End Try
Return response
End Function
Private Function TlsValidationCallback(sender As Object, CACert As X509Certificate, CAChain As X509Chain, SslPolicyErrors As SslPolicyErrors) As Boolean
If SslPolicyErrors = SslPolicyErrors.None Then Return True
Dim Certificate As New X509Certificate2(CACert)
CAChain.Build(Certificate)
For Each CACStatus As X509ChainStatus In CAChain.ChainStatus
If (CACStatus.Status <> X509ChainStatusFlags.NoError) And
(CACStatus.Status <> X509ChainStatusFlags.UntrustedRoot) Then
Return False
End If
Next
Return True
End Function
End Class
并用它来调用类
Dim url As String = "https://bittrex.com/api/v1.1/public/getmarkets"
Dim uri As New Uri(url)
Dim wr As New WebRequestHelper
Dim resp = wr.GetSiteResponse(uri)
解决方案
这是我如何连接到 API 的示例。
首先,根据您的 JSON 结果创建 APIJSONViewModel 来存储 id、name、symbol、rank、price_usd、price_btc 等的值。
Dim limitnumber as integer = 1
Dim apiurl As String = "https://api.coinmarketcap.com" 'base url
Dim apirequesturi As String = "/v1/ticker/?limit=" & limitnumber 'request uri
Dim resultresponse As List(Of APIJSONViewModel) = New List(Of APIJSONViewModel)
Try
Using client As HttpClient = New HttpClient
' set url
client.BaseAddress = New Uri(apiurl)
' set json
client.DefaultRequestHeaders.Accept.Clear()
client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
' post model as json
Dim response As HttpResponseMessage = Await client.GetAsync(apirequesturi)
If response.IsSuccessStatusCode Then
' result get!
resultresponse = Await response.Content.ReadAsAsync(Of List(Of APIJSONViewModel))()
Else
r.Errors.Add(response.ReasonPhrase)
End If
End Using
Catch ex As Exception
r.Errors.Add(ex.Message)
End Try
推荐阅读
- postgresql - 使用 KafkaConnect JDBC 源发布记录时出错:STRUCT 的类型无效:类 org.apache.avro.generic.GenericData$Record
- plot - Stata中带有xline的直方图
- python - 如何让我的不和谐机器人删除一个 nsfw 词,而不是另一个包含 nsfw 词的 sfw 词?(discord.py)
- arrays - 如何将重复的二维数组减少为一个
- python - Numpy通过降序对二维数组进行排序并从每行中取前N
- spring - 自 Spring Cloud Stream 3.1 版本以来已弃用 EnableBinding、Output、Input
- c# - 单击xamarin中的按钮时如何为整个帧设置动画?
- css - 使用@font-face 时字体边缘变细
- asp.net - Docker 错误:注册层失败:处理 tar 文件时出错(退出状态 1):“...msader15.dll.mui:没有这样的文件或目录”
- excel - 检查列值是否在增加