これは、これと同様の質問です 。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);
}
}