我有一个WCF服务和一个带有服务引用的应用程序,并且在应用程序中我有一个循环,并且在每次迭代中它都在调用这个wcf web服务中的方法.
问题是,在大约9次呼叫之后,它就会停止......如果你Pause
按下VS的按钮,你会看到它停留在拨打电话的线路上.
等待一段时间后,抛出此TimeoutException:
在00:00:59.9970000之后等待回复时,请求通道超时.增加传递给Request的调用的超时值或增加Binding上的SendTimeout值.分配给此操作的时间可能是较长超时的一部分.
我对此进行了一些研究,发现了一些涉及在应用程序中编辑app.config的解决方案,以下是它的摘录:
<serviceBehaviors>
<behavior name="ThrottlingIssue">
<serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
</behavior>
</serviceBehaviors>
Run Code Online (Sandbox Code Playgroud)
.
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
Run Code Online (Sandbox Code Playgroud)
然后,在我停止调试后,几分钟后,会弹出一条错误消息,告诉我发生了灾难性故障.
我该如何解决这个问题?当我使用普通的Web服务时,我没有遇到此问题.
供参考,以下是整体app.config
:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ThrottlingIssue">
<serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IDBInteractionGateway" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" /> …
Run Code Online (Sandbox Code Playgroud) 每当我使用'ab'对Web服务器进行基准测试时,它会在发送大量请求后冻结一段时间,但仅在20秒左右后继续.
考虑以下用Ruby编写的HTTP服务器模拟器:
require 'socket'
RESPONSE = "HTTP/1.1 200 OK\r\n" +
"Connection: close\r\n" +
"\r\n" +
"\r\n"
buffer = ""
server = TCPServer.new("127.0.0.1", 3000) # Create TCP server at port 3000.
server.listen(1024) # Set backlog to 1024.
while true
client = server.accept # Accept new client.
client.write(RESPONSE) # Write a stock "HTTP" response.
client.close_write # Shutdown write part of the socket.
client.read(nil, buffer) # Read all data from the socket.
client.close # Close it.
end
Run Code Online (Sandbox Code Playgroud)
然后我按如下方式运行ab:
ab -n 45000 -c 10 …
Run Code Online (Sandbox Code Playgroud) 我在.Net WCF服务中间歇性地获得以下异常."位于http://MyServer/TestWCF/MyService.svc的HTTP服务太忙了."
我在这里错过了什么吗?
我使用基本的http绑定并启用了WCF限制.
<basicHttpBinding>
<binding name="BasicHttpBinding_MyService" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-16" sendTimeout="00:01:00" >
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="163840000"
maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
</binding>
Run Code Online (Sandbox Code Playgroud)
....
<behavior name="MyWCFServices.MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentInstances="2147483647"
maxConcurrentSessions="10"/>
</behavior>
Run Code Online (Sandbox Code Playgroud)
限制有助于解决问题吗?另外,我可以知道高流量网站限制的推荐参数值吗?
可能/部分重复:
我正在寻找为Web应用程序实现移动时间窗口速率限制算法的最佳方法,以减少垃圾邮件或暴力攻击.
使用的示例是"在过去5分钟内来自给定IP的最大失败登录尝试次数","最近N分钟内的最大((帖子/投票/等等)...").
我宁愿使用移动时间窗口算法,而不是每X分钟重新统计一次(比如twitter api).
这将是一个C#/ ASP.Net应用程序.
我有一个WCF客户端/服务器应用程序,它使用WSHttpBinding通过HTTP进行通信.
服务器设置:使用标准WCF进行自托管ServiceHost
.我的实际服务类别归结为:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerSession,
UseSynchronizationContext = false)]
Run Code Online (Sandbox Code Playgroud)
客户端安装:使用visual-studio生成的客户端代理使用同步服务调用(proxy.call_server_method
块直到服务器完全响应为止.)
场景:我有一个特定的方法调用,需要20秒才能在服务器上执行.客户端在一个单独的线程中调用此方法,因此它不会被阻止,并且ConcurrencyMode.Multiple
WCF也应该在服务器上的单独线程中执行它.
这个理论得到以下事实的支持:当我配置我的应用程序使用时NetTcpBinding
,一切正常.
问题:
如果我配置要使用的应用程序WSHttpBinding
,则此长方法调用会导致http请求"备份".我已经通过检查我的日志和使用fiddler调试HTTP请求来验证这种行为.
例:
但有时候:
<add address="*" maxconnection="100"/>
在客户端的app.config中进行设置会使此(似乎)停止发生.这是来自提琴手演示问题的时间表:(点击查看大图)
如您所见,请求都在服务器上备份.一旦20秒的请求完成,响应都会泛滥,但请注意,有些请求没有被阻止......
所以,问题:
NetTcpBinding
而不能使用WSHttpBinding
?笔记:
!syncblk
它,它一直报告没有锁定.<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
设置了服务器的app.config我正在尝试throttle
在功能组件中使用lodash中的方法,例如:
const App = () => {
const [value, setValue] = useState(0)
useEffect(throttle(() => console.log(value), 1000), [value])
return (
<button onClick={() => setValue(value + 1)}>{value}</button>
)
}
Run Code Online (Sandbox Code Playgroud)
由于内部方法useEffect
在每次渲染时都会重新声明,因此限制效果不起作用。
有没有人有一个简单的解决方案?
我正在使用GRequests和lxml 在Python 2.7.3中编写一个小脚本,这将允许我从各个网站收集一些可收集的卡片价格并进行比较.问题是其中一个网站限制了请求数量,如果我超过它,则发回HTTP错误429.
有没有办法在GRequestes中添加限制请求的数量,这样我就不会超过我指定的每秒请求数?另外 - 如果发生HTTP 429,我怎样才能使GRequestes在一段时间后重试?
在旁注 - 他们的限制是非常低的.每15秒就有8个请求.我在浏览器中多次破坏它只是刷新页面等待价格变化.
对于那些使用亚马逊产品广告API的人来说,你遇到了什么样的经验?据说,限制设定为每秒1个请求,这是你的经验吗?
我希望我的网站能够在全国范围内发展壮大,但我担心它能够在不受限制的情况下完成所有Amazon API请求.我们将所有响应缓存24小时,并限制在短时间内进行过多搜索的用户.
我应该担心吗?有什么建议?
我正在尝试用a UISearchView
来查询谷歌的地方.在这样做的时候,对于我的文本更改调用UISearchBar
,我正在向google地方发出请求.问题是我宁愿将此调用去抖动,每250毫秒只请求一次,以避免不必要的网络流量.我不想自己写这个功能,但如果需要,我会.
我发现:https://gist.github.com/ShamylZakariya/54ee03228d955f458389,但我不太确定如何使用它:
func debounce( delay:NSTimeInterval, #queue:dispatch_queue_t, action: (()->()) ) -> ()->() {
var lastFireTime:dispatch_time_t = 0
let dispatchDelay = Int64(delay * Double(NSEC_PER_SEC))
return {
lastFireTime = dispatch_time(DISPATCH_TIME_NOW,0)
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
dispatchDelay
),
queue) {
let now = dispatch_time(DISPATCH_TIME_NOW,0)
let when = dispatch_time(lastFireTime, dispatchDelay)
if now >= when {
action()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我尝试使用上述代码的一件事:
let searchDebounceInterval: NSTimeInterval = NSTimeInterval(0.25)
func findPlaces() {
// ...
}
func searchBar(searchBar: UISearchBar!, textDidChange searchText: String!) { …
Run Code Online (Sandbox Code Playgroud) 我在控制台应用程序中部署了WCF服务,并启用了BasicHTTPBinding和SSL.还设置了以下属性:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
Run Code Online (Sandbox Code Playgroud)
我还设置了限制行为
<serviceThrottling maxConcurrentCalls="2147483647" maxConcurrentSessions="2147483647"
maxConcurrentInstances="2147483647" />
Run Code Online (Sandbox Code Playgroud)
另一方面,我创建了一个测试客户端(用于负载测试),它同时启动多个客户端(多个线程)并在服务器上执行事务.一切似乎都很好,但在服务器上CPU利用率没有增加所以我添加了一些日志记录来查看服务器的并发调用数,发现它从未超过6.
我已经查看了两次以上的性能计数器记录代码,对我来说似乎很好.
所以我想问一下这种情况下的问题在哪里?我还没有指定任何种类的ContextMode或ConcurrencyMode.
这个帖子之后,我注意到,每当我开始测试客户端的另一个Intance我的并发服务器调用计数器增加至2一样,如果我运行仅1个实例的最大并发RCVD呼叫将被2,如果有两个实例相同的值变为4等等.一次处理的WCF呼叫数量是否有限制?
********3月17日添加********
今天我在运行服务器的同一台机器上运行了一个测试客户端(有50个并发用户)的另一个测试.这次我得到了我想要显示的确切结果(即服务器的最大并发呼叫数Rcvd = 50).
但我需要在其他机器上也这样做.有人可以帮我这个吗?
throttling ×10
wcf ×4
c# ×2
web-services ×2
.net ×1
algorithm ×1
amazon ×1
apachebench ×1
api ×1
asp.net ×1
concurrency ×1
debugging ×1
http ×1
ios ×1
lodash ×1
networking ×1
python ×1
react-hooks ×1
reactjs ×1
sockets ×1
swift ×1