2017-07-27 21 views
1

我正在使用HTTP Web请求,响应从jenkins服务器获取url响应。读取响应并使用Filestream将其存储在本地驱动器中。当响应是连续的,我可以成功下载并安装exe文件。文件大小下载大于400MB如何避免/跳过HTTP响应中的异常,在c#中的文件下载期间添加为字节

问题场景:虽然读取有时会发生超时,但会引发异常。响应阅读器也读取该异常并存储在文件中。

例外:

A problem occurred while processing the request. Please check our bug tracker to see if a similar problem has already been reported. If it is already reported, please vote and put a comment on it to let us gauge the impact of the problem. If you think this is a new issue, please file a new issue. When you file an issue, make sure to add the entire stack trace, along with the version of Jenkins and relevant plugins. The users list might be also useful in understanding what has happened. 
Stack trace 
java.io.IOException: java.util.concurrent.TimeoutException: Idle timeout expired: 5000/5000 ms 
    at org.eclipse.jetty.util.SharedBlockingCallback$Blocker.block(SharedBlockingCallback.java:234) 
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:141) 
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:355) 
    at org.kohsuke.stapler.Stapler.serveStaticResource(Stapler.java:585) 
    at org.kohsuke.stapler.ResponseImpl.serveFile(ResponseImpl.java:216) 
    at hudson.model.DirectoryBrowserSupport.serveFile(DirectoryBrowserSupport.java:319) 
    at hudson.model.DirectoryBrowserSupport.generateResponse(DirectoryBrowserSupport.java:127) 
    at org.kohsuke.stapler.HttpResponseRenderer$Default.handleHttpResponse(HttpResponseRenderer.java:124) 
    at org.kohsuke.stapler.HttpResponseRenderer$Default.generateResponse(HttpResponseRenderer.java:69) 
    at org.kohsuke.stapler.Function.renderResponse(Function.java:127) 
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:110) 
    at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:124) 
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) 
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) 
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876) 
    at org.kohsuke.stapler.MetaClass$10.dispatch(MetaClass.java:362) 
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) 
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876) 
    at org.kohsuke.stapler.MetaClass$5.doDispatch(MetaClass.java:236) 
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) 
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) 
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876) 
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649) 
    at org.kohsuke.stapler.Stapler.service(Stapler.java:238) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) 
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:135) 
    at org.jenkinsci.plugins.ssegateway.Endpoint$SSEListenChannelFilter.doFilter(Endpoint.java:225) 
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:132) 
    at io.jenkins.blueocean.ResourceCacheControl.doFilter(ResourceCacheControl.java:134) 
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:132) 
    at jenkins.metrics.impl.MetricsFilter.doFilter(MetricsFilter.java:125) 
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:132) 
    at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:126) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:86) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84) 
    at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76) 
    at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:553) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
    at org.eclipse.jetty.server.Server.handle(Server.java:499) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) 
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) 
    at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.util.concurrent.TimeoutException: Idle timeout expired: 5000/5000 ms 
    at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:161) 
    at org.eclipse.jetty.io.IdleTimeout$1.run(IdleTimeout.java:50) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
    ... 3 more 

如何避免读取例外字节,这样我可以对剩余的字节再继续下载。

这里是我的逻辑:

try 
    { 
     long iFileSize = 0; 
     int iBufferSize = 1024; 
     iBufferSize *= 1000; 
     long iExistLen = 0; 
     if (System.IO.File.Exists(path)) 
     { 
      System.IO.FileInfo fINfo = 
       new System.IO.FileInfo(path); 
      iExistLen = fINfo.Length; 
     } 
     if (iExistLen > 0) 
      saveFileStream = new System.IO.FileStream(path, 
       System.IO.FileMode.Append, System.IO.FileAccess.Write, 
       System.IO.FileShare.None); 
     else 
      saveFileStream = new System.IO.FileStream(path, 
       System.IO.FileMode.Create, System.IO.FileAccess.Write, 
       System.IO.FileShare.None); 
      HttpWebRequest hwRq1 =(HttpWebRequest)System.Net.HttpWebRequest.Create(urlAddress); 
      hwRq1.AddRange((int)iExistLen); 

      using (HttpWebResponse hwRes=(System.Net.HttpWebResponse)hwRq1.GetResponse()) 
     { 
      using (System.IO.Stream smRespStream = hwRes.GetResponseStream()) 
      { 
       smRespStream.ReadTimeout = 60000; 

       iFileSize = hwRes.ContentLength; 

       int iByteSize; 
       byte[] downBuffer = new byte[iBufferSize]; 

       while ((iByteSize = smRespStream.Read(downBuffer, 0,  downBuffer.Length)) > 0) 
       { 
        saveFileStream.Write(downBuffer, 0, iByteSize); 
        Console.WriteLine(iExistLen.ToString()); 
       } 

       saveFileStream.Close(); 
       smRespStream.Close(); 

       if (iByteSize == 0 && !FileSizeCheck(path, softwareWithSize.Value)) 
        return new Tuple<string, bool>("Zero byte received", false); 
      } 
     } 

回答

0

你怎么会认识到,有一个错误?如果你不能 - 即jenkins的流只是exe字节,然后是错误,然后是套接字关闭。然后,你必须检查你的文件是否存在一些不会改变的合适ascii。也许搜索“java.io.IOException”,然后重新缠绕5000字节,在那个时候关闭文件并从那里恢复

这对jenkins人来说有点不好,但如果它真的这样工作的话,这将是我第一次听说开发人员认为在内容下载流中发送错误消息字节是一个好主意。你确定它没有被一些中间件垃圾插入,例如一个编程糟糕的代理服务器?

+0

感谢您的回复,我使用原始文件和错误文件之间的二进制比较器来获取异常 – guru

+0

我没有编程方式来检测发生错误,您需要检查每个文件的末尾下载以查找ascii错误文本并将其删除 –

相关问题