【问题标题】:How to asynchronously call a web service from an ASP.NET application?如何从 ASP.NET 应用程序异步调用 Web 服务?
【发布时间】:2011-04-04 23:28:34
【问题描述】:

我需要从 ASP.NET 应用程序中异步调用 Web 服务。 aspx 不需要来自 Web 服务的答案。这只是一个简单的通知。

我正在使用来自 Web 服务存根和 <%@Page Async="True" %>...Async() 方法。

ws.HelloWorldAsync();

我的问题:网页请求正在等待网络服务响应。

如何解决这个问题?网络服务宕机或过载时如何避免资源泄露?

【问题讨论】:

    标签: asp.net web-services asynchronous


    【解决方案1】:

    在您的场景中,您可以使用 ThreadPool ThreadPool.QueueUserWorkItem(...) 在池线程中调用 Web 服务。

    【讨论】:

      【解决方案2】:

      我以前使用过简单的线程来执行此操作。例如:

      Thread t = new Thread(delegate()
      {
          ws.HelloWorld();
      });
      t.Start();
      

      方法返回后线程将继续运行。环顾四周,似乎是ThreadPool的做法isn't always recommended

      【讨论】:

      • 我了解到使用 ThreadPool 会干扰 ASP.NET 的执行。但是创建多个线程会降低整个 Web 应用程序的性能。
      【解决方案3】:

      启动一个新线程可能是最简单的解决方案,因为您不关心收到结果通知。

      new Thread(() => ws.HelloWorld()).Start
      

      【讨论】:

        【解决方案4】:

        Web 服务代理通常也有 Begin 和 End 方法。你可以使用这些。下面的示例显示了如何调用 begin 方法并使用回调来完成调用。对 MakeWebServiceAsynCall 的调用将立即返回。 using 语句将确保对象被安全地释放。

        void MakeWebServiceAsynCall()
            {
                WebServiceProxy proxy = new WebServiceProxy();
                proxy.BeginHelloWorld(OnCompleted, proxy);
            }
            void OnCompleted(IAsyncResult result)
            {
                try
                {
                    using (WebServiceProxy proxy = (WebServiceProxy)result.AsyncState)
                        proxy.EndHelloWorld(result);
                }
                catch (Exception ex)
                {
                    // handle as required
                }
            }
        

        如果您需要知道调用是否成功,您需要等待结果。

        【讨论】:

          猜你喜欢
          • 2012-04-15
          • 1970-01-01
          • 2014-02-24
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多