我遇到了一个问题,即在执行 POST 时 HttpWebRequest 不会遵守高于 100 秒的超时值。但是,如果请求是 GET,则会考虑高于 100 秒的超时值。在 .GetResponse() 调用中抛出超时异常。我正在设置我能够发现的所有超时值,但似乎我遗漏了一个,或者框架中存在错误。
这是一个针对 .NET Framework 3.5 的 C# 应用程序,使用 Visual Studio 2008 构建。Web 服务器是 IIS 6.0,连接超时设置为默认的 120 秒,启用保持事件...再次 GET 请求尊重我指定的超时值,如果 <= 100="" 秒,则="" post="">=>
这是我的代码:
int timeout = 200000; // 200 seconds
HttpWebRequest proxyRequest = (HttpWebRequest)WebRequest.Create(serverUrl);
proxyRequest.Accept = clientRequest.AcceptTypes.ToDelimitedString(", ");
proxyRequest.Method = "POST"
proxyRequest.UserAgent = clientRequest.UserAgent;
proxyRequest.Timeout = timeout;
proxyRequest.ReadWriteTimeout = timeout;
proxyRequest.KeepAlive = false;
proxyRequest.AllowAutoRedirect = false;
proxyRequest.ServicePoint.Expect100Continue = false;
proxyRequest.ServicePoint.MaxIdleTime = timeout;
proxyRequest.ServicePoint.ConnectionLeaseTimeout = -1;
try
{
// add post data
request.ContentType = "application/x-www-form-urlencoded";
byte[] postData = Encoding.UTF8.GetBytes("somedata=7&moredata=asdf");
// set some post data
request.ContentLength = postData.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(postData, 0, postData.Length);
stream.Close();
}
// UPDATE
// don't set Timeout here! It will be ignored
// proxyRequest.Timeout = timeout;
// Timeout exception thrown here if GetResponse doesn't return within 100 seconds
// even though the Timeout value is set to 200 seconds.
using (HttpWebResponse proxyResponse = (HttpWebResponse)proxyRequest.GetResponse())
{
using (Stream stream = proxyResponse.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.Default))
{
string content = reader.ReadToEnd();
[other pointless code for this example]
reader.Close();
}
stream.Close();
}
proxyResponse.Close();
}
}
finally
{
proxyRequest.Abort();
}
当我将超时值设置为 5 秒时,正如预期的那样,我将在 5 秒后收到超时异常。这证明超时值没有被完全忽略。
还有其他人遇到过这个问题吗?使用异步版本的 GetResponse 会解决这个问题吗?欢迎任何想法,我已经坚持了几天。
更新
如果我不发布任何数据(这不是很有用),我可以让 POST 遵守超时值。但是,一旦我发布任何数据并且 ContentLength > 0,它就会在 100 秒时超时。此外,不涉及任何代理。
更新 2
将 POST 数据添加到示例中,并在不设置 Timeout 属性的地方添加注释
最佳答案
我想通了。这是一个 DRY 编码的例子,回来咬我的屁股。上面的代码是我的真实代码的释义,因此上面的代码可以正常工作。
问题是我在调用 proxyRequest.GetRequestStream() 添加 POST 数据后设置了 Timeout 值。因为我同时设置了 Timeout 和 ReadWriteTimeout 属性,所以超时最短者获胜。在 POST 请求的情况下,即使框架让我在调用 GetRequestStream 后设置超时值,它也忽略了设置的任何值(而是使用默认的 100 秒,即使在设置后检查超时属性显示它是设置为我所期望的)。我希望设置 Timeout 属性与设置 ReadWriteTimeout 属性的工作方式相同:如果您在调用 GetRequestStream 后尝试设置 ReadWriteTimeout 属性,它会抛出异常。如果 Timeout 做同样的事情,那会为我节省大量时间。我应该早点发现这一点,但我会把它归结为一次学习经历。
故事的寓意是:在创建 HttpWebRequest 时就设置它的所有超时属性。
关于c# - 执行 POST 时无法将 HttpWebRequest 超时设置为高于 100 秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7842736/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak