我们通过ASP.NET中的ASHX处理程序提供应用程序设置的下载.
客户告诉我们他使用了一些第三方下载管理器应用程序,我们提供文件的方式目前不支持他的下载管理器应用程序的"恢复"功能.
我的问题是:
恢复下载的基本思路是什么?是否有某个HTTP GET请求告诉我开始的偏移?
我们有这个代码供下载:
public class downloadRelease : IHttpHandler {
public void ProcessRequest (HttpContext context) {
-- snip --
context.Response.Clear();
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + OriginalFileName);
context.Response.WriteFile(Settings.ReleaseFileLocation + ActualFileName);
// Log download
Constructor.VersionReleaseDownload.NewReleaseDownload(ActualFileName);
Run Code Online (Sandbox Code Playgroud)
它工作正常,除了日志下载代码在下载开始后立即运行,而不是在下载完全按照我们的预期完成时.
有人可以解释为什么会这样,以及如何更改它以便它只在完成时记录?我们不想计算部分下载量.
我在我的网站上有一个表单,它将json发布到异步处理程序,它验证数据并返回响应OK或错误,我将根据我的处理程序给出的响应在客户端上进行重定向.
但是当响应正常时,我想异步执行一些任务.但异步调用在.ashx代码中不起作用.它始终是同步的.
你能就此给我一个建议.
码:
public class ValidateHandler : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
NameValueCollection nvcForm = context.Request.Form;
Dictionary<string, string> errorFieldsDict = new Dictionary<string, string>();
foreach (string nameValueKey in nvcForm.AllKeys)
{
regExpToTest = string.Empty;
switch (nameValueKey)
{
case "firstName":
//validate
break;
case "lastName":
//validate
break;
case "email":
//validate
break;
case "phoneNumber":
//validate
break;
case "phoneCountryCode":
//validate
break;
case "country":
//validate
break;
case "addressLine1":
//validate
break;
case "addressLine2":
//validate
break;
case "city":
//validate
break;
case "postalCode":
//validate
break;
default: …Run Code Online (Sandbox Code Playgroud) 我想在ASP.NET MVC 3中使用Silverlight Multi File Uploader.问题是我需要使用ashx处理程序来处理文件上传(处理程序是库的一部分).如何将处理程序与ASP.NET MVC 3集成(我正在使用Razor视图引擎)?
我正在从主页客户端脚本(Jquery)请求.ashx页面,该脚本具有下载PDF文件的代码.当我调试它时,我可以看到执行"文件下载"代码,但文件没有下载.
$.ajax({
type: "POST",
url: "FileDownload.ashx",
dataType: "html",
success: function (data) { }
}
);
public class FileDownload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//context.Response.ContentType = "text/plain";
//context.Response.Write("Hello World");
string fileName = "BUSProjectCard.pdf";
string filePath = context.Server.MapPath("~/Print/");
context.Response.Clear();
context.Response.ContentType = "application/pdf";
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
context.Response.TransmitFile(filePath + fileName);
context.Response.End();
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个Handler,在执行一些数据库工作后返回整数值.我想知道如何获得该值并通过调用该处理程序将该值赋给Label.
我用google搜索它,大多数示例使用Jquery.AJAX调用来检索值.我相信我也可以通过使用它获得价值.但是对于我公司的某些限制,我被限制使用代码.
任何例子都会有帮助.
Handler: http://somesite.com/Stores/GetOrderCount.ashx?sCode=VIC
which returns: 3
Run Code Online (Sandbox Code Playgroud)
需要将其分配给标签控件
到目前为止,我已经尝试了这么多.
HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://somesite.com/Stores/GetOrderCount.ashx?sCode=VIC");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Label1.Text = response.ToString() // this does not work
Run Code Online (Sandbox Code Playgroud) 我使用实现IHttpAsyncHandler的通用处理程序遇到了一些性能问题.最简单的是,处理程序接收GET请求,20秒后在响应中写入"<timeout />"后结束响应.
当使用10000-20000个并发请求锤击.ashx时,在准确的5000个请求之后,503服务器不可用.切换到同步模式并立即结束请求时,问题就消失了.
我已经修改了许多设置,但我唯一能够实现的是降低发生此错误的请求阈值.
这是我玩过的设置的简要说明:
machine.config中:
<configuration>
...
<system.web>
...
<processModel enable="true" requestQueueLimit="10000"/>
...
Run Code Online (Sandbox Code Playgroud)
web.config中:
<configuration>
...
<system.web>
...
<httpRuntime enable="true" appRequestQueueLimit="10000"/>
...
Run Code Online (Sandbox Code Playgroud)
IIS管理器> ApplicationPools>高级设置
Queue Length : 65535
Run Code Online (Sandbox Code Playgroud)
虽然我不能确定,但是如果请求是同步的,那么这些设置似乎工作正常,但是当异步时,在服务器开始告诉我离开之前,我似乎无法超越5000个请求.如果我把事情设置得更低(不能确切地记住上面的设置,但我已经尝试了所有设置),那么503计数会相应地上升,但是当负载严重时我永远不能阻止它超过5000 .
似乎有很多设置分散在无数的地方可能会影响到这一点,但5000似乎相当固定.我在这里看到appRequestQueueLimit不能超过5000,但是找不到关于此的更多信息,并想知道这是否是错误的信息.
IIS中是否存在任何类型的"泛滥控制"设置,可能会将单个主机限制为不超过5000个请求?如何让IIS处理更多5000个并发异步请求?
编辑2:是否有任何计数器或其他指标可能超出限制,我将如何进一步调查?
编辑:这是loadgenerator代码:
using System;
using System.Net;
using System.Threading;
namespace HammerTime
{
class Program
{
private static int counter = 0;
static void Main(string[] args)
{
var limit = 5000;
ServicePointManager.DefaultConnectionLimit=limit;
for (int i = 0; i < limit;++i )
{
StartWebRequest(i.ToString());
}
Console.ReadLine();
}
private …Run Code Online (Sandbox Code Playgroud) 我的网站有一个处理器(FileDownload.ashx),处理所有文件下载请求.
我最近将我的站点迁移到ASP.NET 4.0,现在它广泛使用路由.处理页面请求(aspx)时一切正常,但它不能与我的处理程序一起工作 - 我遇到以下错误:
类型'.Handlers.FileDownload'不从'System.Web.UI.Page'继承.
这是有道理的,因为路由仅在页面中实现.
我需要采取哪些步骤才能将路由和我的.ashx一起使用?我希望能够RouteData.Values从路线中提取.
public class FileDownload : IHttpHandler
{
}
Run Code Online (Sandbox Code Playgroud) 我的ashx响应.编写一个返回的简单文本文件.我可以更改文件名,所以如果我的ashx位于mysite.com/someURL,它不会返回someURL.txt而是myFileName.txt吗?