我正在使用Silverlight前端的现有代码库和IHttpHandler后端类的集合。我遇到一种情况,我需要束缚客户并等待第三方网站上的操作完成,然后回叫我们的网站说“您正在等待的操作已完成”,以便客户可以继续。< / p>
基本流程是:
我对此过程没有太多控制;在不对现有代码进行大量更改的情况下,这或多或少是必须执行此过程的方式。
在测试这一点时,我发现即使#2的调用在客户端中异步发生,但在等待状态更新时服务器仍然被捆绑(我对IHttpHandlers不太熟悉;我是我们本周得知它们是同步的),并且没有其他服务器呼叫通过
为了解决这个问题,我试图通过实现IHttpAsyncHandler使#2中的调用异步进行:
public abstract class BaseControl_Asynchronous : BaseControl, IHttpAsyncHandler
{
public bool IsReusable
{
get
{
return false;
}
}
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
this.Context = context;
this.Login = Utils.IsNullOrEmpty(Context.Session["Login"] as string, string.Empty);
this.Domain = Utils.IsNullOrEmpty(Context.Session["Domain"] as string, "Demo");
this.Init();
var processRequestAsync = this.ProcessRequestAsync(context);
var completionSource = new TaskCompletionSource<object>(context);
processRequestAsync.ContinueWith((t, o) =>
{
if (t.IsFaulted)
{
if (t.Exception != null)
{
completionSource.SetException(t.Exception.InnerExceptions);
}
}
else
{
completionSource.SetResult(null);
}
cb(completionSource.Task);
}, extraData);
return completionSource.Task;
}
private async Task ProcessRequestAsync(HttpContext context)
{
await Task.Run(() => this.ProcessRequest_Internal(context));
}
public void EndProcessRequest(IAsyncResult result)
{
((Task)result).Wait();
}
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException();
}
}
BaseControl是IHttpHandler类的现有集合的现有基类。我已将其分为BaseControl_Synchronous和BaseControl_Asynchronous(如上所示),以及拥有两者通用代码的BaseControl。
这是ProcessRequest_Internal的基本实现(在BaseControl中):
public virtual void ProcessRequest_Internal(HttpContext context)
{
string output = string.Empty;
// output contains a response envelope, code to construct envelope skeleton removed
// abstract method implemented by sub classes
string result = Execute();
// code that appends result to response envelope removed
context.Response.ContentType = ContentType;
context.Response.Output.Write(output);
}
就我而言,“ Execute”后面的代码正在等待数据库中的状态更新。我本来会因为BaseControl_Asynchronous中的代码而认为这种方法有效,但是等待状态更新的代码正在占用服务器,并且在等待过程中没有其他调用通过。
这是错误的方法吗?我正在尝试尽可能多地保留代码(我不想对ProcessRequest_Internal进行太多更改,因此依赖于它的遗留代码太多了),但是如果存在这样的情况,我愿意将这两个过程完全拆分无法重用该方法。
有什么想法吗?预先感谢!