GVKun编程网logo

Web应用程序:可以监控HTTP文件下载的任何方式(web应用监控工具)

16

在本文中,您将会了解到关于Web应用程序:可以监控HTTP文件下载的任何方式的新资讯,同时我们还将为您解释web应用监控工具的相关在本文中,我们将带你探索Web应用程序:可以监控HTTP文件下载的任何

在本文中,您将会了解到关于Web应用程序:可以监控HTTP文件下载的任何方式的新资讯,同时我们还将为您解释web应用监控工具的相关在本文中,我们将带你探索Web应用程序:可以监控HTTP文件下载的任何方式的奥秘,分析web应用监控工具的特点,并给出一些关于asp.net – HTTP保持活跃在一个大的Web应用程序、asp.net – 异步HttpWebRequest,从Web应用程序中无需等待、bin文件中的任何文件是否有任何更改会导致ASP.NET Web应用程序中的应用程序回收?、c# – 如何从ASP.NET 4.0 Web应用程序禁用/删除WebPageHttpModule?的实用技巧。

本文目录一览:

Web应用程序:可以监控HTTP文件下载的任何方式(web应用监控工具)

Web应用程序:可以监控HTTP文件下载的任何方式(web应用监控工具)

我正在研究一个Web应用程序。 它会让用户通过HTTP协议从服务器上下载文件。 这些文件最多可达4 GB。

这些是我的要求和限制:

HTTP文件下载进度%

注册,当HTTP文件下载完成

注册,如果HTTP文件下载崩溃

注册,如果用户取消下载

恢复未完成的文件下载

要能够下载高达4GB的文件

应该仅在客户端实现JavaScript / HTML5,在服务器上实现PHP。

可能不会在客户端使用Java或Flash实现。

我的发展环境:

阿帕奇

PHP

MysqL的

Windows 7的

我的问题是,尽pipe我已经写了PHP脚本,可以下载大文件,我不能有效地监视中止下载(浏览器closures,取消下载,中止互联网连接)。 PHP函数connection_aborted()捕获所有中止下载的cca的50%。

一般path下载文件夹

Windows如何知道是否从互联网上下载了一个文件?

如何通过SSH连接到另一台服务器后在shell脚本中下载文件?

使用PowerShell将击键发送到特定的窗口

我在哪里可以下载GCC二进制文件的窗口?

因此,我的问题是,如果有什么办法可以真正高效,精确地监控下载进度和下载中断吗? 那么使用Nginx或LIGHTTPDnetworking服务器怎么样? 如何编写我自己的LUA或Perl模块的Apache,我将监视PHP输出缓冲区?

我目前的下载脚本:

while(!feof($fileObject)) { usleep(100000); //print(@fread($fileObject,$chunkSize)); echo(@fread($fileObject,$chunkSize)); // gradually output buffer to avoid memory problems by downloading large files ob_flush(); flush(); // check if the client was disconnected // important for cancelled or interrupted downloads if (Connection_Aborted()) { // sent to the database that the connection has been aborted $result = MysqLi_query($dbc,"UPDATE current_downloads SET connection_aborted=TRUE WHERE user_id=1;"); // close the database connection MysqLi_close($dbc); // close the open file @fclose($fileObject); exit(json_encode(array("result" => false,"error" => "Connection with the client was aborted."))); } $nLoopCounter++; $transferred += $chunkSize; $downloadPercentage = (($nLoopCounter * $chunkSize) / $fileSize) * 100; $result = MysqLi_query($dbc,"UPDATE current_downloads SET progress_percent=$downloadPercentage,transferred=$transferred,connection_aborted=$strConnectionAborted,iteration=$nLoopCounter WHERE user_id=1;"); if($result == false) { // close the database connection MysqLi_close($dbc); // close the file fclose($handle); // prepare output message $outputArray = array("result" => 0,"message" => "Error Processing Database Query"); // output the message echo json_encode($outputArray); exit; } }

谢谢。

软件/批处理/连接到networking和下载的东西

用于BlueZ的蓝牙库(Windows)

如何打包单个文件的Windows EXE下载?

PHP / Apache拒绝文件夹访问用户,但不是脚本

如何正确安装wxPython?

我最后解决PHP连接相关的问题是使用Boost.Asio和Facebook发布的一个鲜为人知的线程安全SAPI创建一个Web服务器。 下载链接被破坏,但可以在这里找到github。

使用Apache和其他Web服务器进行绑定时遇到的主要问题是现有的SAPI(Fast-CGI,PHP-FPM,mod_apache等)与PHP中相关的相关函数之间的不一致。 在我尝试过的任何情况下,他们根本不可靠,尽管许多人声称已经得到了它的具体配置(操作系统版本,Web服务器版本,SAPI版本,PHP版本等)的工作。

主要的问题(正如你所观察到的)是PHP与Apache和其他Web服务器显着隔离。 通过使用嵌入式PHP sapi,您可以在PHP和实际套接字连接以及其他网络相关功能之间建立更高水平的协作。 这是我能够让PHP与Web服务器一起工作的唯一方法,这非常符合您的需求。

然而,第二个注意事项是,现在有许多严重的纯PHP服务出现,PHP已经解决了垃圾收集问题。 一个简单的文件服务器可以很容易地使用非阻塞套接字或PHP流,并可能会很快考虑到它将服务静态内容使用异步模式。

我不介意发布一些Boost.Asio花絮或一个简单的PHP文件服务,如果你觉得这是你的解决方案需要移动的方向。 但是,这绝对是可能的。 成千上万的服务已经遇到了这个问题。

考虑到你的需求限制,我会说因为各种原因(至少覆盖100%的浏览器)是不可能的(见下面的“hacky”解决方案):

您可以通过经常拉第二个页面来显示下载过程,该页面返回您的下载脚本可能存储在数据库中的%-Value。 但是 – 正如你已经注意到的 – PHP不提供可靠的方法来确定用户是否中止。

要绕过这个问题,你可以这样做:

创建一个download.PHP文件,它能够以块的形式返回文件。 编写一个JavaScript迭代地拉动所有可用的块,直到下载完成(即download.PHP?fileId=5&chunk=59 )。 然后,Javascript可以组合所有检索的块,并最终呈现完成的文件。

但是,您不能直接写入硬盘,意味着:您需要下载所有的块,以向用户呈现“完成的文件”。 如果他在两者之间停下来,所有的数据都会丢失,这就违反了你能够恢复下载的限制。

由于恢复文件下载是一个必须在客户端实现的任务(你需要拿起已经下载的数据),在服务器端你不能做任何事情。 由于JavaScript缺乏直接编写(或读取)硬盘的功能,因此仅使用PHP / Javascript是不可能的。 (实际上在JavaScript中有文件系统功能,但是一般来说浏览器不允许它们用于远程站点。)

作为一个hacky的解决方案,你可以滥用浏览器缓存恢复文件下载 :

请注意,有各种情况下,这不起作用:

用户可能已禁用浏览器缓存。

浏览器可能会自己渲染文件“过时”。

浏览器可能会忽略您的缓存建议。

但是,对于这种解决方案,最糟糕的情况是缓存/恢复不起作用。

如上所述实现一个download.PHP 。 下面的例子是使用一个固定的ChunkSize“10”,你可能想要添加到你的需要(甚至固定的块大小 – >修复所需的计算)

<? header('Cache-Control: max-age=31556926'); $etag = 'a_unique_version_string'; header('ETag: "'.$etag.'"'); $chunkCount = 10; $file = $_GET["file"]; //ignored in this example $file = "someImage.jpg"; $chunk = $_GET["chunk"]; $fileSize = filesize($file); $chunkSize = ceil($fileSize / $chunkCount); //round to whole numbers. //get required chunk. $handle = fopen($file,"r"); $start = ($chunk-1) * $chunkSize + ($chunk-1); $toRead = min($chunkSize+1,$fileSize - $start); //read next chunk or until EOF. $end = $start + $toRead; //echo "reading $toRead from $start to $end"; //die(); if (fseek($handle,$start) == 0){ $c = fread($handle,$toRead); echo $c; @fclose($handle); }else{ //error seeking: handle it. } ?>

现在,任何客户端都可以通过调用URL(我在服务器上设置演示)来下载块:

downloading http://dog-net.org/dltest/download.PHP?file=1&chunk=1 downloading http://dog-net.org/dltest/download.PHP?file=1&chunk=2 downloading http://dog-net.org/dltest/download.PHP?file=1&chunk=3 downloading http://dog-net.org/dltest/download.PHP?file=1&chunk=4 downloading http://dog-net.org/dltest/download.PHP?file=1&chunk=5

独立块是毫无价值的,所以提到的JavaScript进入游戏。 下载被调用时,可以生成以下片段。 然后它将遍历所有需要的块,并将它们“一个接一个”下载。 如果用户中止,浏览器仍然会缓存单个块。 含义:无论何时用户将再次开始下载,已下载的块将在瞬间完成,尚未请求的块将被下载regulary

<html> <head> <script language="javascript"> var urls = new Array(); urls[0] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=1"; urls[1] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=2"; urls[2] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=3"; urls[3] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=4"; urls[4] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=5"; urls[5] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=6"; urls[6] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=7"; urls[7] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=8"; urls[8] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=9"; urls[9] = "http://dog-net.org/dltest/download.PHP?file=1&chunk=10"; var fileContent = new Array(); function downloadChunk(chunk){ var url = urls[chunk-1]; console.log("downloading " + url); var xhr = new XMLHttpRequest(); xhr.open("GET",url,true); xhr.responseType = 'blob'; xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { document.getElementById("log").innerHTML += "downloading " + url + "<br />"; fileContent.push(xhr.response); document.getElementById("percentage").innerHTML = chunk / urls.length * 100; if (chunk < urls.length){ downloadChunk(chunk+1); }else{ finishFile(); } } else { console.error(xhr.statusText); } } }; xhr.onerror = function (e) { console.error(xhr.statusText); }; xhr.send(null); } function finishFile(){ contentType = 'image/jpg'; //Todo: has to be set accordingly! console.log("Generating file"); var a = document.createElement('a'); var blob = new Blob(fileContent,{'type':contentType,'endings':'native'}); console.log("File generated. size: " + blob.size); //Firefox if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1){ var url = window.URL.createObjectURL(blob); window.location = url; } //IE 11 or chrome? if (!(window.ActiveXObject) && "ActiveXObject"){ //Chrome: if (window.chrome){ a.href = window.URL.createObjectURL(blob); a.download = "download"; a.click(); }else{ //ie 11 window.navigator.msSaveOrOpenBlob(blob,'download'); } } } function setProgress(chunk){ document.getElementById("percentage").innerHTML = chunk / urls.length * 100; } </script> </head> <body onload="downloadChunk(1);"> <div id="percentage"></div> <div id="log"></div> </body> </html>

请注意,处理的Blobs是痛苦的…我管理得到它在IE 11,Chrome 32和Firefox 27的工作。到目前为止没有办法。 另外我没有检查旧版本。

演示: http ://dog-net.org/dltest/(它是一个PNG图像,所以用paint / irfranview / whatevs打开 – 文件扩展名未设置。)

首次调用时,所有的文件块将被独立下载。 在Second Call上你会注意到,他们完成得非常快,因为所有已经完成的调用都被浏览器缓存了。 ( 我把缓存时间设置为“永远” – 实际上你不想这样做,但选择7天左右!

你需要自己做的事情:

生成所需的JavaScript-Download-Code(第二个代码段)

为较旧的浏览器版本添加完成文件实施。

检查大文件。 (只能测试高达30 MB)

根据需要将正确的Mime-Type传递给代码片段。

适应你的UI – 造型。

确保文件具有适当的扩展集。

这只是一个想法 ,可能会给你一些想法,如何实现这一点。

不过,我强烈建议使用基于Flash / Java / Silverlight的客户端实现,因此您有一个不依赖于browser Versiosn或任何其他限制的故障实现。

您可以使用HTML5 WebSockets实施解决方案。

客户端库(使用JavaScript构建)以易于使用的方式抽象出API。

有一些服务器端库(使用PHP构建)来实现WebSocket服务器。

这样,您可以进行双向通信,并且可以在服务器端捕获您提到的所有可能的事件。

由于时间不够,我不提供代码,但希望这给了一些方向。

实际上,PHP(服务器端,而不是客户端语言)无法真正检测文件下载何时完成。 您可以做的最好的事情是在数据库开始时记录下载。 如果你绝对,完全和完全需要知道什么时候下载完成,你将不得不做一些像嵌入Java小程序或使用Flash。 但是,对于用户而言,通常这不是正确的答案(为什么要求他们只安装Java或Flash来从你那里下载东西?)。

从这里 。

您仍然可以尝试了解关于ignore_user_abort和connection_aborted更多信息。 我可能适合你需要什么。 但是,如果下载真的结束,你将无法真正有效和精确地监视。

asp.net – HTTP保持活跃在一个大的Web应用程序

asp.net – HTTP保持活跃在一个大的Web应用程序

我有一个部署在IIS 7.0上的Web应用程序.该应用程序可由大量用户访问并操纵大数据..my问题涉及默认情况下设置为true的HTTP Keep-Alive选项.

将HTTP Keep-Alive设置为false或true是一种更好的方法.

在真实的情况下使用超时的好办法?

解决方法

通常应使用KeepAlive来处理紧跟 HTML请求的请求.让我们先来看看你的网站,我得到一个包含5个css,5j和25个图像的HTML页面,我将使用我仍然存在的HTTP连接来请求这些东西(这取决于浏览器,我可能会使用3连接加速这些事情).

为了处理这个事实,我们通常使用2秒或3秒的Keepalive.具有更长的keepalive意味着连接正在等待用户可能请求的下一页.这可能是一种有效的思维方式,下次用户想要一个页面时,我们将避免建立HTTP连接的时间松动(这可能是请求/响应时间的最长部分).但是对于您的服务器,意味着由服务器处理的大多数HTTP连接正在做…什么都没有.并且您将达到您的MaxConnection(W3SVC / MaxConnections与可笑的默认为10),连接不做任何事情.特别糟糕.这么长的活着需要大的网络服务器,只有当你的应用程序真的需要它时才应该使用它.

如果您在“古典网站”中使用Keepalive,则必须更改连接超时(默认为2分钟).在Apache中,您将有2个设置,一个keepalive tiemout(默认为5秒)和一个连接超时(2分钟).在IIS中似乎超时设置用于两者.所以不要把它设置为2s(一个客户端发送他的请求会很慢会超时),但像10s这样的事情也许就够了.现在一个回应是禁止Keep-Alive,并使浏览器打开更多的连接.另一个回应是使用一个现代化的网络服务器(比如Nginx或者例子),它以比Apache或者IIS更优雅和无资源的方式处理保持连接.

即使您不使用Keepalive,客户端超时等待2分钟的原因是什么?这肯定太高了,把这个价值降到60年代.

那么你应该检查几个与超时相关的设置(ConnectionTimeout,HeaderWaitTimeout,MinFileBytesPerSec)和这个很好的响应在performances settings在注册表中.

asp.net – 异步HttpWebRequest,从Web应用程序中无需等待

asp.net – 异步HttpWebRequest,从Web应用程序中无需等待

在我的Web应用程序(ASP.NET)中,我有一个代码块,使用HttpWebRequest调用REST服务并继续执行。现在它比我想完成完整的Web请求花费的时间更长。事情是REST服务返回的是没有用的。理想情况下,我想将一个Async Web请求发送到REST服务,然后不等待响应。问题是我已经尝试使用
request.BeginGetResponse(New AsyncCallback(AddressOf myFunc),nothing)

要启动一个异步请求,而不是不等待(我认为这将是异步请求的默认行为),它会在BeginGetResponse之后执行下一行代码,继续执行回调函数。

我怀疑ASP.NET可能会在Web应用程序中将其转换为同步请求。我被带领相信这是因为有一个IAsyncResult结果对象被传递到回调函数,当我检查其CompletedSynchronously属性时,它始终设置为true。

有没有人知道是否可以从ASP.NET Web应用程序中执行异步HttpWebRequest(没有等待),还是总是转换为同步请求?

解决方法

你可能正在看“火和忘记”的模式。这里有一些链接。

http://weblogs.asp.net/albertpascual/archive/2009/05/14/fire-and-forget-class-for-asp-net.aspx

http://haacked.com/archive/2009/01/09/asynchronous-fire-and-forget-with-lambdas.aspx

http://www.eggheadcafe.com/articles/20060727.asp

希望这可以帮助

bin文件中的任何文件是否有任何更改会导致ASP.NET Web应用程序中的应用程序回收?

bin文件中的任何文件是否有任何更改会导致ASP.NET Web应用程序中的应用程序回收?

我知道在ASP.NET Web应用程序中,更改位于bin文件夹中的DLL文件导致应用程序回收。

但是,我想知道,正如主题所暗示的,是否有任何文件更改会导致此类行为?在这种情况下是否包含简单的文本文件?

那个子文件夹到bin文件夹呢?和他们的内容?

我知道我可以自己尝试,但更重要的是,我正在寻找适当的文档。

解决方法

首先,我无法提供官方文件的链接。但是从我读过的bin文件夹(包括子文件夹)中的每一个变化都将导致IIS回收应用程序域。

突发应用池回收

>应用程序的BIN目录中的任何修改
>更改任何配置文件,如Web.config或其他(如果您的应用程序中有任何特定的配置文件在称为App_Config的目录中)。
>对APP_CODE目录中的源代码文件进行修改。这可能会在任何源代码文件中更改,或从该目录添加或删除文件。
>在Global.asax文件中进行更改
>在Machine.config文件中进行更改。
>在Web应用程序的根目录中进行任何修改。这意味着即时创建文件/子目录可以导致应用程序池的回收。
> App_WebReferences目录的Web服务引用的修改。
>修改根目录中任何目录的安全设置。 (像为所有人或任何其他特定用户或用户组指定读取安全权限。)

这里有一些阅读:

> What causes an application pool in IIS to recycle?
> http://christopherdeweese.com/blog2/post/beware-writing-to-the-bin-folder-in-iis-hosted-services
> What does an IISReset do?
> http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/recycling
> Managing,Tuning,and Configuring Application Pools in IIS 7.0
> http://varunvns.wordpress.com/2011/07/04/application-pool-restarts/

c# – 如何从ASP.NET 4.0 Web应用程序禁用/删除WebPageHttpModule?

c# – 如何从ASP.NET 4.0 Web应用程序禁用/删除WebPageHttpModule?

我试图获得我的 wildcard http handler to handle *.cshtml pages,但请求从来没有到达我的处理程序,因为它被WebPageHttpModule拦截,我发现存在通过这个StackTrace:
[HttpException (0x80004005): Exception of type 'System.Web.HttpException' was thrown.]
   System.Web.WebPages.ApplicationStartPage.ExecuteStartPage(HttpApplication application,Action`1 monitorFile,Func`2 fileExists,Func`2 createInstance,IEnumerable`1 supportedExtensions) +88
   System.Web.WebPages.ApplicationStartPage.ExecuteStartPage(HttpApplication application) +287
   System.Web.WebPages.WebPageHttpModule.StartApplication(HttpApplication application,Action`1 executeStartPage,EventHandler applicationStart) +113
   System.Web.WebPages.WebPageHttpModule.StartApplication(HttpApplication application) +71
   System.Web.WebPages.WebPageHttpModule.Init(HttpApplication application) +156
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext,HttpContext context,MethodInfo[] handlers) +431
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state,MethodInfo[] handlers,IntPtr appContext,HttpContext context) +194
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext context) +339
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253

[HttpException (0x80004005): Exception of type 'System.Web.HttpException' was thrown.]
   System.Web.HttpRuntime.FirstRequestinit(HttpContext context) +8972180
   System.Web.HttpRuntime.EnsureFirstRequestinit(HttpContext context) +97
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext context) +256

我已经尝试使用Web.Config禁用所有HttpModules,但这没有任何效果(它也不会出现在IIS HttpModules部分):

<system.web>
    <httpModules>
        <clear/>
    </httpModules>
</system.web>
    ....
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <clear/>
    </modules>
</system.webServer>

用ILSpy狩猎显示System.Web.WebPages.dll中的以下代码是注册WebPageHttpModule的内容:

namespace System.Web.WebPages
{
    [Editorbrowsable(EditorbrowsableState.Never)]
    public static class PreApplicationStartCode
    {
        private static bool _startWasCalled;
        public static void Start()
        {
            if (PreApplicationStartCode._startWasCalled)
            {
                return;
            }
            PreApplicationStartCode._startWasCalled = true;
            WebPageHttpHandler.RegisterExtension("cshtml");
            WebPageHttpHandler.RegisterExtension("vbhtml");
            PageParser.EnableLongStringsAsResources = false;
            DynamicModuleUtility.RegisterModule(typeof(WebPageHttpModule));
            Scopestorage.CurrentProvider = new AspNetRequestScopestorageProvider();
        }
    }
}

但是它是一个香草.NET 4.0应用程序,我没有引用任何System.Web.WebPages,MVC或Razor dll我只是引用System.Web.

那么这些程序集如何加载,为什么WebPageHttpModule被注册了,我该如何删除/禁用它?

解决方法

如果您要关闭ASP.NET网页,可以在应用设置中设置此标志:
<add key="webpages:Enabled" value="false" />

关于Web应用程序:可以监控HTTP文件下载的任何方式web应用监控工具的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于asp.net – HTTP保持活跃在一个大的Web应用程序、asp.net – 异步HttpWebRequest,从Web应用程序中无需等待、bin文件中的任何文件是否有任何更改会导致ASP.NET Web应用程序中的应用程序回收?、c# – 如何从ASP.NET 4.0 Web应用程序禁用/删除WebPageHttpModule?的相关信息,请在本站寻找。

本文标签: