python与vb通讯_记vb.net写前端和flask后端通讯在新浪云里的坑

作者在开发一个使用 zk4500 指纹仪的打卡签到程序时,遇到了将 VB.NET 编写的桌面应用与Web项目集成的挑战。在本地测试成功后,部署到新浪云SAE时,发现请求似乎被沙箱隔离,无法正确提交数据。经过排查和替换封装方法,最终解决了问题,但过程中暴露了作者的基础知识短板。博客主要讨论了.NET与Web集成、VB.NET的HTTP请求封装以及SAE的环境适配问题。
摘要由CSDN通过智能技术生成

我的项目一直部署在新浪云里,最近要写一个指纹打卡签到的程序。

买了zk4500的指纹仪,这玩意儿用的是.net的技术栈,而我的项目是web的,调用dll各种不方便,索性干脆用http://vb.net写了一个桌面端。

没想到陷入一个诡异的坑。

http://vb.net不熟悉,就在网上搜索了一个ajax发送请求的代码来用

Public Shared Function HttpPost(ByVal url As String, ByVal data As String) As String

Dim msg As String

Try

ServicePointManager.Expect100Continue = False

Dim request As HttpWebRequest = WebRequest.Create(webRoot + url)

'//Post请求方式 request.Method = "POST"

request.Timeout = 3000

'内容类型 request.ContentType = "application/x-www-form-urlencoded"

'将URL编码后的字符串转化为字节 Dim encoding As New UTF8Encoding()

Dim bys As Byte() = encoding.GetBytes(data)

'设置请求的 ContentLength request.ContentLength = bys.Length

'获得请 求流 Dim newStream As Stream = request.GetRequestStream()

newStream.Write(bys, 0, bys.Length)

newStream.Close()

'获得响应流 Dim sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream)

Return sr.ReadToEnd

Catch ex As Exception

msg = String.Format("{0}ralsed exception :{1}", ex.Source, ex.Message)

MessageBox.Show(msg, "错误!连接服务器失败。", MessageBoxButtons.OK, MessageBoxIcon.Error)

Return "error"

End Try

End Function

本地开发环境测试,没问题。

然而,上线到sae后,发送request后,有正确的回应,但是

sae的日志里并没有收到提交信息。

代码里写好了pring("test")之类的也没有输出到后台的控制台

数据库里也没有更新信息!

就感觉请求被扔到了一个沙箱里执行,但是并没有提交数据。

提交客服工单后也无法得到解答,只好自己琢磨。

因为始终觉得是http://vb.net封装的包有问题,造成被sae的防御措施什么的弄到沙箱里去了。

所以各种找,换了一个写参数的封装方法通过了sae环境测试,记录如下:

Public Function SendRequest(method As String, uri As String, Optional data As String = "") As String

Dim dataStream As Stream = Nothing

Dim statusCode As HttpStatusCode

Dim msg As String = "请求失败,未知错误。"

uri = frmMain.webRoot + uri

Dim req As WebRequest

Try

If method = "GET" Then

If data.Length > 1 Then

Dim prmList As String() = data.Replace("{", "").Replace("}", "").Replace(" ", "").Replace("""", "").Split(",")

Dim parms As String = "?", tem() As String

For i = 0 To prmList.Length - 1

tem = prmList(i).Split(":")

parms += tem(0) & "=" & tem(1)

If i < prmList.Length - 1 Then parms += "&"

Next

uri = uri & parms

End If

req = DirectCast(WebRequest.Create(uri), HttpWebRequest)

req.Method = method

Else

req = DirectCast(WebRequest.Create(uri), HttpWebRequest)

req.ContentType = "application/json"

'req.ContentType = "text/json"

req.Method = method

Using streamWriter = New StreamWriter(req.GetRequestStream())

streamWriter.Write(data)

streamWriter.Flush()

streamWriter.Close()

End Using

End If

Dim response = req.GetResponse().GetResponseStream()

Dim reader As New StreamReader(response)

Dim res = reader.ReadToEnd()

reader.Close()

response.Close()

Return res

Catch ex As WebException

'如果返回错误信息,处理错误并显示错误信息

If ex.Response IsNot Nothing Then

dataStream = ex.Response.GetResponseStream()

Dim reader As New StreamReader(dataStream)

Dim resp As String = reader.ReadToEnd()

Dim retJson As Object = CType(JsonConvert.DeserializeObject(resp), JObject)

statusCode = DirectCast(ex.Response, HttpWebResponse).StatusCode

If retJson("message").GetType.ToString() = "Newtonsoft.Json.Linq.JValue" Then msg = retJson("message")

If retJson("message").GetType.ToString() = "Newtonsoft.Json.Linq.JObject" Then

Dim errObj As Newtonsoft.Json.Linq.JObject = retJson("message")

Dim key As String, value As String

msg = ""

For Each a In errObj

key = a.Key

value = a.Value

msg += key + " : " + value + vbLf

Next

End If

End If

MessageBox.Show(msg, "请求失败", MessageBoxButtons.OK, MessageBoxIcon.Error)

Return "error"

Catch ex As Exception

statusCode = HttpStatusCode.ExpectationFailed

msg = String.Format("{0}ralsed exception :{1}", ex.Source, ex.Message)

MessageBox.Show(msg, "错误!连接服务器失败。", MessageBoxButtons.OK, MessageBoxIcon.Error)

Return "error"

End Try

End Function

这个时候就体现了我的基础薄弱了,只是知道是封装body的问题,但是却不知道是如何造成的这个问题。

如果万能的网友能解答一下,感激不尽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值