我需要在将文件发送给用户下载后运行几种方法.发生的事情是,在我向用户发送文件后,响应被中止,之后我再也无法做任何事情了response.end()
.
例如,这是我的示例代码:
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=test.pdf");
Response.ContentType = "application/pdf";
byte[] a = System.Text.Encoding.UTF8.GetBytes("test");
Response.BinaryWrite(a);
Response.End();
StartNextMethod();
Response.Redirect(URL);
Run Code Online (Sandbox Code Playgroud)
所以,在这个例子中StartNextMethod
并Response.Redirect
没有执行.
我尝试的是使用以下代码创建了一个单独的处理程序(ashx):
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
context.Response.AddHeader("content-disposition", "attachment; filename=test.pdf");
context.Response.ContentType = "application/pdf";
byte[] a = System.Text.Encoding.UTF8.GetBytes("test");
context.Response.BinaryWrite(a);
context.Response.End();
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
Download d = new Download();
d.ProcessRequest(HttpContext.Current);
StartNextMethod();
Response.Redirect(URL);
Run Code Online (Sandbox Code Playgroud)
但同样的错误发生了.我已经尝试用CompleteRequest替换Response.End,但它没有帮助.
我想问题是我正在使用HttpContext.Current但应该使用单独的响应流.那是对的吗?我如何在一个单独的方法中一般地做到这一点(假设我希望我的处理程序接受数据和内容类型的字节数组,并且可以从单独的响应中下载.我真的不想使用单独的页面来响应.
更新
我仍然没有找到一个好的解决方案.我想在用户下载文件后做一些操作,但不使用单独的页面来响应\请求.
我已经看过几个带有serializable属性的例子,如下所示:
[Serializable()]
public class sampleClass
{
public int Property1{ get; set; }
public string Proerty2{ get; set; }
public sampleClass() { }
public sampleClass(int pr1, int pr2)
{
pr1 = pr1;
Name = pr2.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
我从来没有很好地理解它是如何工作的,但是从msdn:
序列化允许开发人员保存对象的状态并根据需要重新创建它,提供对象的存储以及数据交换.通过序列化,开发人员可以执行诸如通过Web服务将对象发送到远程应用程序,将对象从一个域传递到另一个域,将对象作为XML字符串传递到防火墙,或者维护安全性或特定于用户的操作跨应用程序的信息
但问题是,在我的代码示例中,我认为没有用处.只是一个用于从数据库中检索数据的对象,没什么特别的.何时使用以及何时不使用序列化有什么其他用途.例如,我应该总是使用序列化,因为它更安全吗?是这样慢吗?
更新:谢谢你们所有的好答案
我想将此代码转换为linq解决方案.它的作用是调查一组客户,看看其中至少有一个是否有中间名.这段代码工作正常,我只是想学习linq,所以寻找替代解决方案:
//Customers - List<Customer>
private bool checkMiddleName()
{
foreach (Customer i in Customers)
{
if (i.HasMiddleName == true)
{
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我试着写一些类似的东西:(Customers.Foreach(x=>x.HasMiddleName==true)...
但看起来不是我正在寻找的方法.
假设我有一个功能:
function test1() {
}
Run Code Online (Sandbox Code Playgroud)
我想从内部返回"test1".我发现你可以做的arguments.callee
就是返回整个函数,然后做一些丑陋的正则表达式.有更好的方法吗?
命名空间函数怎么样?
是否有可能得到他们的名字:例如:
var test2 =
{
foo: function() {
}
};
Run Code Online (Sandbox Code Playgroud)
我想从内部返回foo这个例子.
更新:对于arguments.callee.name Chrome返回空白,IE9返回undefined.它不适用于范围函数.
什么是最常见且易于实现的解决方案,以提高SQL Server 2008R2数据库和.Net 3.5应用程序的速度.
我们有一个具有以下属性的应用程序:
- 少量的并发客户端(MOST约为200).
- SQL服务器端的复杂数学运算
- 我们正在模仿oracle的行级安全性(因此使用tvf和storedproc而不是直接查询表) - 主要问题是用户执行大量的更新/插入/删除/计算,他们吓坏了,因为他们需要等待页面重新加载,而这些操作已经完成.
我需要澄清的问题如下:
一般的建议和意见也欢迎.
我的设置:用户有一个页面,他执行一些操作和数据转换.
我将这些操作存储在数据集中(在会话中).
然后,在按钮单击时,我需要执行一些更多转换并调用自定义数据库函数,该函数将每个数据表中的每一行插入到数据库中.我已经解决了所有这些问题并且效果非常好.
但是,现在,我需要做的是修改按钮单击事件不要立即运行,而是将该操作放入队列(这是所有用户的公共队列).因此,如果user1单击该按钮,则user2单击该按钮,然后我们需要获取user1数据集并在其上运行方法,并且仅在此之后获取user2数据集并在其上运行方法.所有的一个队列.
private void btnclick()
{
DataSet ds = Session["test"] as DataSet;
PerformFinalTransformation(ds);
foreach (DataTable dt in ds.Tables)
{
foreach (DataRow dr in dt.Rows)
{
CallCustomSqlFunction(dr);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想避免将数据集存储在数据库中,因为它们对于每个用户(表/列的数量)并不相同.我正在寻找关于如何在asp.net/c#中完成此任务的任何指示.(石英网是我应该考虑的吗?).我应该寻找什么概念?并行编程?还是asp.net队列?或者是其他东西?甚至无法启动,因为不知道该从什么开始.顺便说一句,我在我的应用程序中使用最新的DotNetNuke,如果这有所帮助.
我无法弄清楚如何缩放fullcalendar以适应它的父容器.我想在一个页面上为用户显示周视图,而无需滚动(因此他们可以快速查看一周内的项目).
我很好,如果我需要使文字小,插槽高度更小等,但我不知道如何根据浏览器窗口的大小动态地执行此操作.
(在我的日历中我正在使用slotMinutes:10 and times from 8am to 10pm
)
jsfiddle with fullcalendar:http://jsfiddle.net/bQXYp/27/
源数据库:Azure VM D16s_v3 上托管的 PostgreSQL 目标数据库:Azure VM D4s_v3 上托管的 SQL Server 开发版 源数据库大小约为 1TB 目标数据库为空,现有架构与源数据库相同
吞吐量仅为 1mb/s。没有任何帮助。(我选择了最大 DIU)此时 SQL Server 没有任何键或索引。
批量大小为 10000