Возможная утечка памяти в асинхронном вызове ASP.NET к веб-сервису? - PullRequest
0 голосов
/ 16 сентября 2010

Я создал небольшую библиотеку классов для асинхронного вызова WebService (Fire and Forget. Мне не нужен результат).

В приложении Windows Form метод XXXAsync() работает нормально.Но в веб-приложении процесс блокируется до тех пор, пока событие XXXCompleted не сработает.

Моя проблема: я попытался создать делегат и использовал Begin / EndInvoke для вызова метода XXXAsync().Он работал нормально, но процесс w3wp, похоже, потребляет огромное количество памяти. Я правильно вызываю метод EndInvoke .Вызов GC.Collect не освободил память.

Я также попытался вызвать методы BeginXXX и EndXXXX из WebService и получил тот же результат.

Мой WebService - тупой HelloWorld, сa Thread.Sleep(10000).

Как решить эту проблему?Есть ли другой способ вызвать веб-сервис асинхронно, избегая таких утечек?

Редактировать [Добавлен код ниже]:

Код WebService :

<code>    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Service1 : WebService
    {
        [WebMethod]
        [OneWay]
        public string HelloWorld()
        {
            Thread.Sleep(10000);

            return "Hello World ";
        }
    }

ClassLibrary :

<code>    public class HelloLibrary : IDisposable
    {
        private delegate void PerformWhatever();

        public HelloLibrary(){}

        public string Notify()
        {
            PerformWhatever p = new PerformWhatever(OnBeforeBegin);
            p.BeginInvoke(EndInvokeHandler, p);
            return "1";
        }

        private void OnBeforeBegin()
        {
            using (localhost.Service1 s = new localhost.Service1())
            {
                s.HelloWorldAsync();
            }
        }

        private void EndInvokeHandler(IAsyncResult r)
        {
            var delegateInstance = r.AsyncState as PerformWhatever;
            delegateInstance.EndInvoke(r);
        }


        public void Dispose(){}
    }

И, в моем веб-приложении ,Я звоню:

<code>
            using (HelloLibrary library = new HelloLibrary())
            {
                library.Notify();
            }

1 Ответ

0 голосов
/ 16 сентября 2010

Если вам не нужен результат и вы владеете веб-службой, вам следует рассмотреть возможность реализации функции запуска и забытия на стороне веб-службы через SoapDocumentMethodAttribute , установив его OneWay свойство true.

Когда для метода веб-службы XML установлено свойство true для OneWay, клиент веб-службы XML не должен ждать, пока веб-сервер завершит обработку метода веб-службы XML.Как только веб-сервер десериализует SoapServerMessage, но перед вызовом метода веб-службы XML сервер возвращает код состояния HTTP 202.Код состояния HTTP 202 указывает клиенту, что веб-сервер начал обработку сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...