Использование IHttpAsyncHandler для асинхронного вызова WebService

Вот базовая настройка. У нас есть приложение ASP.Net WebForms со страницей, содержащей приложение Flash, которому требуется доступ к внешней веб-службе. Из-за ( безопасность, я полагаю) ограничения во Flash (не спрашивайте меня, я вообще не эксперт по Flash), мы не можем подключиться к веб-службе напрямую из Flash. Решение проблемы - создать прокси в ASP.Net что приложение Flash вызовет, которое, в свою очередь, вызовет WebService и перенаправит результаты обратно в приложение Flash.

Веб-сайт имеет очень высокий трафик, и проблема в том, что если веб-служба вообще зависает, то Потоки запросов ASP.Net начнут резервное копирование, что может привести к серьезному нехватке потоков. Чтобы обойти это, я решил использовать IHttpAsyncHandler , который был разработан именно для этой цели. буду использовать WebClient для асинхронного вызова веб-службы и пересылки ответа назад. Есть очень мало В сети много о том, как правильно использовать IHttpAsyncHandler, поэтому я просто хочу убедиться, что не ошибаюсь. Я основываю свое использование на примере, показанном здесь: http://msdn.microsoft.com/en-us/library/ms227433.aspx

Вот мой код:

internal class AsynchOperation : IAsyncResult
{
    private bool _completed;
    private Object _state;
    private AsyncCallback _callback;
    private readonly HttpContext _context;

    bool IAsyncResult.IsCompleted { get { return _completed; } }
    WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
    Object IAsyncResult.AsyncState { get { return _state; } }
    bool IAsyncResult.CompletedSynchronously { get { return false; } }

    public AsynchOperation(AsyncCallback callback, HttpContext context, Object state)
    {
        _callback = callback;
        _context = context;
        _state = state;
        _completed = false;
    }

    public void StartAsyncWork()
    {
        using (var client = new WebClient())
        {
            var url = "url_web_service_url";
            client.DownloadDataCompleted += (o, e) =>
            {
                if (!e.Cancelled && e.Error == null)
                {
                    _context.Response.ContentType = "text/xml";
                    _context.Response.OutputStream.Write(e.Result, 0, e.Result.Length);
                }
                _completed = true;
                _callback(this);
            };
            client.DownloadDataAsync(new Uri(url));
        }
    }
}

public class MyAsyncHandler : IHttpAsyncHandler
{
    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
    {
        var asynch = new AsynchOperation(cb, context, extraData);
        asynch.StartAsyncWork();
        return asynch;
    }

    public void EndProcessRequest(IAsyncResult result)
    {
    }

    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
    }
}

Теперь все работает, и Я ДУМАЮ, что это должно помочь, но я не уверен на 100%. Кроме того, создание моего собственного IAsyncResult кажется немного излишним, мне просто интересно, есть ли способ использовать IAsyncResult, возвращенный из Delegate.BeginInvoke, или, может быть, что-то еще. Любая обратная связь приветствуется. Спасибо !!

6
задан BFree 17 June 2011 в 16:40
поделиться