Foxtable(狐表)用户栏目专家坐堂 → HttpRequest事件不够稳定


  共有3720人关注过本帖树形打印复制链接

主题:HttpRequest事件不够稳定

帅哥哟,离线,有人找我吗?
lgzhao
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:304 积分:2091 威望:0 精华:0 注册:2017/11/19 9:46:00
HttpRequest事件不够稳定  发帖心情 Post By:2023/4/28 6:18:00 [只看该作者]

HttpRequest事件接收到一些不标准的请求的时候,有时候会自己先抛出异常,而不是回复对方的请求有问题。
这个导致自身不稳定


例如:
客户端用这个发送请求
Dim JJ As new jobject

JJ("EventCode") = "CustomerAddedOrChanged"
JJ("CustomerInfo") = “dfs Jo”

' 发送信息
Dim postData As String = CompressJson(JJ.Tostring)

Dim request As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(_WebhookSettings.URLToPostCustomerInfo), System.Net.HttpWebRequest)

request.Method = "POST"

Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)

request.accept = "application/json"
request.ContentLength = byteArray.Length
request.Timeout = 3000   ' 3秒

Dim ReoToken As String ="asdfsadfgghfgd"


request.Headers.Add("Authorization", ReoToken)  'base64 加密

Dim dataStream As System.IO.Stream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()


Dim response As System.Net.HttpWebResponse = CType(request.GetResponse(), System.Net.HttpWebResponse)
Dim responseStream As System.IO.Stream = response.GetResponseStream()
Dim reader As New System.IO.StreamReader(responseStream, Encoding.UTF8)

Dim responseContent As String  = reader.ReadToEnd()
Dim statusCode  = response.StatusCode

responseStream.Close()
response.Close()

' **********
这段请求中,可能是缺少了contenttype头部信息吧。服务端总是抛出一个错误,然后才执行httprequest事件。
作为一个服务端应该要准备好接收各种错误请求,而不能因为对方的请求导致自己抛出自己的错误,应该要告诉对方你错了,而不是自乱阵脚。

服务端面对的是各种程序和浏览器的请求,要做得更坚强。

' **********
在上面这个请求中,服务端会在httpreques事件之前抛出如下异常信息:
Event/function: 
Object reference not set to an instance of an object.
   at Foxtable.RequestEventArgs.O.o.0oO.()













 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/4/28 8:46:00 [只看该作者]

我测试没有问题。做个例子发过来看看

测试循环提交了100次,都没有问题:

httprequest事件
Output.Show(e.path)
e.WriteString("OK!")

客户端测试
For i As Integer = 0 To 99
    
    
    Dim JJ As New jobject
    
    JJ("EventCode") = "CustomerAddedOrChanged"
    JJ("CustomerInfo") = "dfs Jo"
    
    ' 发送信息
    Dim postData As String = CompressJson(JJ.Tostring)
    
    Dim request As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create("http://192.168.2.6/test"), System.Net.HttpWebRequest)
    
    request.Method = "POST"
    
    Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
    
    request.accept = "application/json"
    request.ContentLength = byteArray.Length
    request.Timeout = 3000 ' 3秒
    
    Dim ReoToken As String = "asdfsadfgghfgd"
    
    
    request.Headers.Add("Authorization", ReoToken) 'base64 加密
    
    Dim dataStream As System.IO.Stream = request.GetRequestStream()
    dataStream.Write(byteArray, 0, byteArray.Length)
    dataStream.Close()
    
    
    Dim response As System.Net.HttpWebResponse = CType(request.GetResponse(), System.Net.HttpWebResponse)
    Dim responseStream As System.IO.Stream = response.GetResponseStream()
    Dim reader As New System.IO.StreamReader(responseStream, Encoding.UTF8)
    
    Dim responseContent As String = reader.ReadToEnd()
    Dim statusCode = response.StatusCode
    responseStream.Close()
    response.Close()
    
    Output.Show(i & ": " & statusCode)
    Output.Show(responseContent)
    
Next 

 回到顶部
帅哥哟,离线,有人找我吗?
lgzhao
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:304 积分:2091 威望:0 精华:0 注册:2017/11/19 9:46:00
  发帖心情 Post By:2023/4/28 10:53:00 [只看该作者]

 我的测试代码是这个样子。服务端是空项目,只是监听8081端口即可。任何事件代码都不需要写。
只要请求发了,服务端就会抛出异常。 服务端程序版本2022-1-30开发版。

如果把

request.accept = "application/json"  改为 request.c  则不再抛出异常。

我知道怎么绕过这个问题,但核心问题是Foxtable的服务端得能处理异常请求不能自己抛异常。因为部署之后什么乱七八糟的请求都会有。


‘*************************

Dim JJ As new jobject

JJ("EventCode") = "CustomerAddedOrChanged"
JJ("CustomerInfo") = "dfs Jo"

' 发送信息
Dim postData As String = CompressJson(JJ.Tostring)

Dim request As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create("http://127.0.0.1:8081/test"), System.Net.HttpWebRequest)

request.Method = "POST"

Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)

request.accept = "application/json"
request.ContentLength = byteArray.Length
request.Timeout = 3000   ' 3秒

Dim ReoToken As String ="asdfsadfgghfgd"


request.Headers.Add("Authorization", ReoToken)  'base64 加密

Dim dataStream As System.IO.Stream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()


Dim response As System.Net.HttpWebResponse = CType(request.GetResponse(), System.Net.HttpWebResponse)
Dim responseStream As System.IO.Stream = response.GetResponseStream()
Dim reader As New System.IO.StreamReader(responseStream, Encoding.UTF8)

Dim responseContent As String  = reader.ReadToEnd()
Dim statusCode  = response.StatusCode

responseStream.Close()
response.Close()

 回到顶部
帅哥哟,离线,有人找我吗?
lgzhao
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:304 积分:2091 威望:0 精华:0 注册:2017/11/19 9:46:00
  发帖心情 Post By:2023/4/28 10:54:00 [只看该作者]

帖子代码局部被吃了


request.accept = "application/json"  改为 request.c/////contenttype = "application/json"  则不再抛出异常。

我知道怎么绕过这个问题,但核心问题是Foxtable的服务端得能处理异常请求不能自己抛异常。因为部署之后什么乱七八糟的请求都会有。

 回到顶部
帅哥哟,离线,有人找我吗?
lgzhao
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:304 积分:2091 威望:0 精华:0 注册:2017/11/19 9:46:00
  发帖心情 Post By:2023/4/28 10:58:00 [只看该作者]

另外,foxtable自带的httpclient对象似乎缺少了contentlength或者contenttype属性,发送的请求会被一些系统的API拒绝。
逼得我用底层请求的,很麻烦。这个最好也改进一下。

最好升级一下netframework, 太太太旧了, httpwebrequest类很难用。 

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/4/28 11:04:00 [只看该作者]

我把httprequest事件代码全部去掉,测试一样没有问题。
客户端会返回:远程服务器返回错误: (404) 未找到。

如果Foxtable不是最新版的,请更新到最新版


 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/4/28 11:05:00 [只看该作者]

以下是引用lgzhao在2023/4/28 10:58:00的发言:
另外,foxtable自带的httpclient对象似乎缺少了contentlength或者contenttype属性,发送的请求会被一些系统的API拒绝。
逼得我用底层请求的,很麻烦。这个最好也改进一下。

最好升级一下netframework, 太太太旧了, httpwebrequest类很难用。 

contenttype是有的,contentlength不清楚,我反馈一下 

 netframework暂时无法升级,因为还有不少用户使用的是XP系统,没有办法抛弃

 回到顶部
帅哥哟,离线,有人找我吗?
lgzhao
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:304 积分:2091 威望:0 精华:0 注册:2017/11/19 9:46:00
  发帖心情 Post By:2023/4/28 14:39:00 [只看该作者]

netframework暂时无法升级?

你们支持XP这么多年也算仁至义尽了啊。
再时间长了XP用户不是更没动力升级了吗?
那你们还怎么卖钱? 

这两年Foxtable明显发展变缓慢,可能跟资金不足也有关吧。
再不跟上形式,再过些年就被彻底淘汰了。

不支持最新的用户需求,难道指望现在还趴在XP上的用户给你们带来发展吗?

 回到顶部
帅哥哟,离线,有人找我吗?
chen37280600
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1279 积分:7953 威望:0 精华:4 注册:2017/12/31 14:53:00
回复:(lgzhao)netframework暂时无法升级?你们支持X...  发帖心情 Post By:2023/4/28 14:42:00 [只看该作者]

我突然觉得你说得好有道理,指望xp的给钱,还真是有点奇怪,应该是不断面向未来。xp旧版本的项目,基本也不会升级上去,可以放弃兼容

 回到顶部