我的项目一直部署在新浪云里,最近要写一个指纹打卡签到的程序。
买了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的问题,但是却不知道是如何造成的这个问题。
如果万能的网友能解答一下,感激不尽。