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:サーバーとのすべての通信にプロキシのインスタンスを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が遅滞なく達成されることです。メソッドが非同期的に呼び出されることを期待しています。これは、最初の呼び出しが2番目の呼び出しに影響を与えないことを意味します。

言い換えると、メソッドを呼び出して、それが完了するのを待っている場合、それを再度呼び出すのが遅れることはありません。

これが事実ですが。これが発生することをどのように理解できますか?Tail for Windowsを使用すると、ログに記録される番号がログに記録されるのが遅れることがわかります。また、サービスメソッドの呼び出しに応答してタイムアウト例外が発生するのを確認すると、これがわかります(カウントエラー...)。私の質問を明確にできればと思います。

また、サービスを閉じた行のコメントを外すと、プログラムの誤動作(例外)が発生するのではないかと思います。

これらの2つの質問に答えてください。

4

1 に答える 1

0

質問1:

デフォルトでは、IIS Webサービスは、同じIPアドレスからの2つの同時要求のみを許可します。この制限は、DOS(Denial Of Service)攻撃を阻止するためのデフォルトです。

つまり、前の呼び出しが完了する間、後続の98の呼び出しはペアごとに少なくとも3秒待機します。最終的には、最後のリクエストが処理されるずっと前に、デフォルトの30秒(?)のサーバータイムアウトになります。

その数の同時リクエストを実行することを主張する場合(とにかくそうすべきではありません)、サーバー上のweb.configファイルのデフォルトの制限を増やす必要があります。詳細については、こちらの他の回答を参照してください

質問2:

非同期呼び出しを開始した直後に閉じないでください...呼び出しはまだ進行中です。そのコードは意味がありません。

ノート:

とにかく効率のためにロギングは遅れるので、それをガイドとして使用しないでください。

于 2012-05-10T12:29:14.910 に答える