IHttpAsyncHandler不异步执行

时间:2019-02-10 16:32:45

标签: c# asynchronous silverlight ihttphandler ihttpasynchandler

我正在使用Silverlight前端的现有代码库和IHttpHandler后端类的集合。我遇到一种情况,我需要束缚客户并等待第三方网站上的操作完成,然后回叫我们的网站说“您正在等待的操作已完成”,以便客户可以继续。< / p>

基本流程是:

  1. 客户将用户引导至新标签中的第三方网站
  2. 客户端调用服务器端类以等待数据库中的状态更新
  3. 用户在第三方网站上完成操作,第三方网站重定向到我们网站上的页面
  4. 第3页的页面将操作标记为已在数据库中完成
  5. 第2类的班级状态为“已完成”,返回给客户
  6. 客户端继续正常运行

我对此过程没有太多控制;在不对现有代码进行大量更改的情况下,这或多或少是必须执行此过程的方式。

在测试这一点时,我发现即使#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进行太多更改,因此依赖于它的遗留代码太多了),但是如果存在这样的情况,我愿意将这两个过程完全拆分无法重用该方法。

有什么想法吗?预先感谢!

0 个答案:

没有答案