我正在寻找有关如何优化以下过程的一些建议:
App读取csv文件。 对于文件中的每一行,都会创建一条XML消息 每条XML消息都通过HTTPWebRequest
发布到URL此过程旨在处理少量消息(一次最多约200个),毫不奇怪地认为已经改变,现在预计一次最多可处理3000个消息。
用于发布消息的代码在这里:
Public Function PostXml(ByVal XML As String) As HttpStatusCode
Try
Dim Bytes As Byte() = Me.Encoding.GetBytes(XML)
Dim HTTPRequest As HttpWebRequest = DirectCast(WebRequest.Create(Me.PostURL), HttpWebRequest)
With HTTPRequest
.Method = "POST"
.ContentLength = Bytes.Length
.ContentType = "text/xml"
.Credentials = New NetworkCredential(_Settings.NTSPostUsernameCurrent, _Settings.NTSPostPasswordCurrent)
End With
Using RequestStream As Stream = HTTPRequest.GetRequestStream()
RequestStream.Write(Bytes, 0, Bytes.Length)
RequestStream.Close()
End Using
Using Response As HttpWebResponse = DirectCast(HTTPRequest.GetResponse(), HttpWebResponse)
Return Response.StatusCode
End Using
Catch ex As WebException
If ex.Message.Contains("(500) Internal Server Error") Then
Return HttpStatusCode.InternalServerError
Else
Throw
End If
End Try
这可以在缓存所使用的连接方面进行优化吗?目前该线路有明显延迟:
在建立连接时Using Response As HttpWebResponse
。
有没有一种缓存方法,所以相同的连接用于所有3000条消息,而不是为每条消息创建一个新的连接?
感谢任何建议。
**更新。谢谢你的回复。为了澄清,由于系统中其他地方的限制,我目前仅限于发送多条消息。在另一端(接收方)响应请求时有明显的延迟,但这不在我的控制范围内。我正在努力确保发送过程尽可能高效(尽管有外部因素)。
答案 0 :(得分:1)
.NET已经有连接缓存......如果你没有处理响应,你会很快看到:)(只是为了澄清,你在这里做的是正确的。我是一个错误经常看到不有一个Using
语句......由于连接缓存而导致问题正确。)
我怀疑这不是建立连接的情况,而是发出请求 - 换句话说,时间是在你无法控制的区域。
我建议您使用Wireshark或Fiddler来确定实际发生的时间 - 可能它不仅仅是Web服务本身吗? (或者无论你在说什么。)
另一个选择是使用多个线程来加快速度 - 但是在这一点上,不要忘记增加每个主机的连接数(在app.config,IIRC的connectionSettings
部分)。< / p>
答案 1 :(得分:1)
在您的情况下,图片中有两件事,您要发布的实体主体的大小以及您正在使用的身份验证方法。
此外,.NET HttpWebRequest不会一次性发送请求标头和POST正文。它首先发送请求标头(它向传出请求添加Expect:100-continue标头)。现在,如果服务器已准备好接受数据,它应回复“100 continue”响应。否则,它应该发送最终响应,在这种情况下可能是“401身份验证被拒绝”。如果服务器在350ms内没有发送“100 continue”,则cllient将继续发送数据。
因此,为了进一步优化,我们需要知道:
1)什么是身份验证协议? 2)您发布的XML正文的平均大小是多少? 3)服务器是否使用XML进行任何繁重的操作?这很可能解释了为什么你看到GetResponse()而不是GetRequestStream()的延迟。 有些事要尝试:
1)在服务点上设置Expect100Continue = false。 2)如果您的系统正在执行NTLM身份验证,那么您可以尝试以下操作:1)使用目标服务器的凭据创建GET webrerquest。在请求上设置connectionGroupNname。为后续请求重用相同的连接组名称。由于NTLM主要是连接身份验证机制,因此第一个GET请求将为您启动连接,后续请求将重用该连接。
还有一件事,你在做多线程操作,你正在运行上述代码的同步线程吗?在这种情况下,您遇到了客户端上的连接限制问题 - 每个HTTP / 1.1服务器最多同时存在2个连接。您可以尝试突破限制(ServicePointManager.DefaultConnectionLimit = 1000)。
最后,正如其他人所建议的那样,您可能需要使用wireshark / netmon获取网络嗅探,以便了解延迟的位置。
答案 2 :(得分:0)
这里的问题是在对象创建语句中,创建一个对象然后如果你做了数千次就破坏它就非常昂贵....
如果你一次只想要大约3k~5k,我就会拿出使用语句让垃圾收集器做它的工作。
但如果你希望一次超过5k,那么这绝对不是一个选择......
答案 3 :(得分:0)
我已经开始和关闭了几周,并使用两种方法实现了显着的性能提升:
使用这种方法,我已经成功实现了超过100%的性能提升(有时高达200-200%)。