2017-07-27 90 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錯誤文本並將其刪除 –

相關問題