0

关于我之前的帖子:910220 - 服务方法独立运行 ,因为代码和我对它的问题的意思有点复杂,我再次带着完全改变的代码来更好地解释自己。

在客户端,我们有:

#define USE_ONLY_ONE_INSTANCE

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using CountTester.ServiceReference1;

namespace CountTester
{
    public partial class MainPage : UserControl
    {
#if USE_ONLY_ONE_INSTANCE
        private readonly Service1Client _sc = new Service1Client();
#endif

        public MainPage()
        {
            InitializeComponent();
#if USE_ONLY_ONE_INSTANCE
            _sc.CountCompleted += OnCountCompleted;
#endif
        }

        void OnCountCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
                throw new Exception(string.Format("Count Error {0}", e.Error));
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
#if USE_ONLY_ONE_INSTANCE
                _sc.CountAsync(i);
#else
                var sc = new Service1Client();
                sc.CountCompleted += OnCountCompleted;
                sc.CountAsync(i);
                //sc.CloseAsync();
#endif
            }
        }
    }
}

这是 XAML 背后的代码。在代码中,我调用了一个服务方法 100 次。我尝试了这两种情况并在两种情况下都出现异常: 情况 1:我只使用一个代理实例与服务器进行所有通信。案例 2:我为每次与服务器的通信使用一个实例。

在更多描述之前,让我们看看服务器上的代码:

using System.IO;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Text;
using System.Threading;

namespace CountTester.Web
{
    [ServiceContract(Namespace = "")]
    [SilverlightFaultBehavior]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1
    {
        const string logFileName = @"h:\CountTester.log";
        object _logLock = new object();

        void log(string s)
        {
            lock (_logLock)
            {
                var streamWriter = new StreamWriter(logFileName, true, Encoding.ASCII);
                streamWriter.Write(s);
                streamWriter.Close();
            }
        }

        Service1()
        {
            //File.Delete(logFileName);
        }

        [OperationContract]
        public void Count(int counter)
        {
            log(string.Format("{0}\n", counter));
            Thread.Sleep(3000);
        }
    }
}

Count 是被调用的服务方法。我故意在方法中等待 3 秒。我期望的是,客户端的 for 可以毫不拖延地完成。我希望该方法被异步调用,这意味着第一次调用不会影响第二次调用。

换句话说,如果我调用该方法并且它等待完成,再次调用它不会延迟。

虽然是这样。我怎么知道会发生这种情况?通过使用 Tail for Windows,我发现记录的数字在被记录时被延迟。当我看到响应调用服务方法(计数错误...)时出现超时异常时,我也发现了这一点。我希望我能澄清我的问题。

我还想知道当我看到程序出现故障时(异常),当我取消注释我关闭服务的行时?

请回答这两个问题。

4

1 回答 1

0

问题一:

默认情况下,您的 IIS Web 服务将只允许来自同一 IP 地址的 2 个同时请求。此限制是阻止 DOS(拒绝服务)攻击的默认设置。

这意味着随后的 98 个调用每对至少等待 3 秒,而之前的调用完成。最终,您将在处理最后一个请求之前很久就达到默认的 30 秒(?)服务器超时。

如果您坚持同时运行这么多请求(无论如何都不应该),您将需要增加服务器上 web.config 文件中的默认限制。有关详细信息,请在此处查看我的其他答案

问题2:

您不应该在启动异步调用后立即关闭它......调用仍在进行中。该代码没有任何意义。

笔记:

无论如何,为了提高效率,日志记录都会被延迟,所以不要以此为指导。

于 2012-05-10T12:29:14.910 回答