3

これは、これと同様の質問です 。WCFサービスのWin32Exception @ ServiceHost.Open()

以下のServiceHost.Open呼び出しで非常に遅いマシンがあります。毎回、サービスを開くのに7秒ほどかかります。このマシンは私のホームボックスであり、ドメインの一部ではありません。

ドメインの一部である別のボックス(私のワークボックス)で同じコードを実行でき、サービスホストは最初の呼び出しで約3〜4秒で開きますが、プログラムを再度実行すると、サービスホストは約1秒で開きます秒以下。

私はこれについてMSサポートと協力してきましたが、トレースログを生成し、ドメインの一部ではないマシンでも、トレースログが出て、ドメインに接続しようとしている部分があります。そして、「指定されたドメインが存在しないか、接続できませんでした」というメッセージが表示されます。トレースログの例外であり、それは常に食べ尽くされているところです。

しかし、本当に奇妙なのは、仕事用のマシンでも、ドメインに接続していない場合(仕事用のネットワークに接続しておらず、自宅から実行している場合など)でも、遅延が発生しないことです。

Windows 7 64ビットを使用してマシンを再構築しましたが、同じ動作が発生します(XP SP3を実行していましたが、Windows 7で問題が解決しなかったときに復元しました)。

何がこれを引き起こす可能性があるのか​​、誰かが何か考えを持っているのだろうかと思いました。ちなみに、「Client for microsoft network」を無効にすると、ServiceHostを開くのに4秒ほどかかりますが、それでもこのマシンがサービスを開くことができたほど速くはありません。どういうわけか、それはドメインか何かの一部であることになっていると思います。

    static void RunServiceWithinEXE()
    {
        Uri baseAddress = new Uri("http://localhost:11111/Demo");
        ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);

        try
        {
            // Add a service endpoint
            serviceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                "CalculatorService");

            // Enable metadata exchange
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            serviceHost.Description.Behaviors.Add(smb);
            serviceHost.Opening += new EventHandler(serviceHost_Opening);
            serviceHost.Opened += new EventHandler(serviceHost_Opened);
            serviceHost.Open();
            Console.WriteLine("The service is ready.");

            // Close the ServiceHostBase to shutdown the service.
            serviceHost.Close();
        }
        catch (CommunicationException ce)
        {
            Console.WriteLine("An exception occured: {0}", ce.Message);
            serviceHost.Abort();
        }
    }

    static void serviceHost_Opened(object sender, EventArgs e)
    {
        TimeSpan timeToOpen = DateTime.Now - shOpening;
        Console.WriteLine("Time To Open: :" + timeToOpen.Seconds);
    }

    static void serviceHost_Opening(object sender, EventArgs e)
    {
        shOpening = DateTime.Now;
    }

これが私のapp.configですが、サービス用の特別なセキュリティ構成設定はありません。WCFトレースを有効にするための診断設定のみがあります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <diagnostics>
            <messageLogging maxMessagesToLog="30000"
                    logEntireMessage="true"
                    logMessagesAtServiceLevel="false"
                    logMalformedMessages="true"
                    logMessagesAtTransportLevel="true">
                <filters>
                    <clear/>
                </filters>
            </messageLogging>
        </diagnostics>
    </system.serviceModel>

    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel" switchValue="Warning, ActivityTracing" propagateActivity="true" >
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
            <source name="System.ServiceModel.MessageLogging" switchValue="Warning">
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\Temp\Server.svclog" />
        </sharedListeners>
        <trace autoflush="true" indentsize="4">
            <listeners>
                <remove name="Default" />
                <add name="ScottsConsoleListener" type="System.Diagnostics.ConsoleTraceListener" />
                <add name="ScottsTextListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Temp\DebugLog.txt" />
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>

また、私のサービス定義にはSessionModeが必要であることに注意してください(以下を参照)。SessionMode要件を削除しても、遅延は発生しません。

using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Microsoft.ServiceModel.Samples
{
    // Define a service contract.
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required)]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);

        [OperationContract]
        double Subtract(double n1, double n2);

        [OperationContract]
        double Multiply(double n1, double n2);

        [OperationContract]
        double Divide(double n1, double n2);

        [OperationContract]
        string PrintName(string firstName, string lastName);

        [OperationContract]
        Point MakePoint(double x, double y);

    }
}
4

4 に答える 4

4

さて、私の疑いは、WsHttpBinding特に指示しない限り、デフォルトでWindowsクレデンシャルを使用して呼び出し元を認証するバインディング()を使用しているという事実です。

サービスホスティングコードでは、デフォルトのWsHttpBindingインスタンスをインスタンス化するだけです。この場合、デフォルトのセキュリティ動作を変更するための設定やコードの設定はありません。

テスト目的のためだけに:サービスホスティングコードを次のように変更してみてください。

 // Add a service endpoint
 serviceHost.AddServiceEndpoint(
            typeof(ICalculator),
            new WSHttpBinding(SecurityMode.None),  // pass in SecurityMode.None
            "CalculatorService");

これにより、すべてのセキュリティ設定が効果的にキャンセルされます。たとえば、ServiceHost発信者を認証するWindowsドメインを検索する必要がなくなります。

それはあなたの観察のいずれかを変えますか?

于 2011-01-19T21:42:24.593 に答える
3

ネットワーク接続でnetbiosを無効にしても、ServiceHost.Open呼び出しで遅延が発生しないことがわかりました。理由はわかりませんが、これで問題が解決したようです。

奇妙なことに、XPのクリーンインストールを実行したとき、Netbiosを有効にしても遅延が発生しなかったため、既存のインストールでなぜそれが発生するのかわかりません(この同じマシンでクリーンインストールを実行しました。次に、これらのテストを実行するために、イメージからバックアップを復元しました)。

于 2011-01-22T00:48:45.150 に答える
0

また、Remote Access AutoConnectionManagerサービスを停止してみてください。私の場合、問題はDns.GetHostEntry(String.Empty)とこの投稿http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/493d1b65-9ace-41de-b269-f178d27a8a1bにありました。

于 2011-02-14T10:42:17.307 に答える
0

同じ問題があったようです。例外が原因でオープンコールが長時間続く。Wcfサービスのセキュリティ設定の構成をグーグルで検索しました。私のために働いた次の解決策を見つけました:

Web.config<wsHttpBinding>ファイルの要素の下に、次のエントリを配置します。

<security mode="None" />

クライアントのサービスリファレンスを更新する必要があります!

于 2013-11-05T22:09:18.797 に答える