這是因爲這一個類似的問題: Win32Exception @ ServiceHost.Open() for WCF service。WCF慢ServiceHost.Open()調用
我有一個機器,是下面的ServiceHost.Open通話非常緩慢。每次打開服務始終需要7秒左右的時間。這臺機器是我的家用機箱,它是而不是域的一部分。
我可以在另一個框(我的工作箱)上運行相同的代碼,其中是是域的一部分,服務主機在第一次調用時約3-4秒打開,但如果我再次運行該程序,服務主機在大約1秒或更短時間內打開。
我已經與MS支持人員就此進行了合作,並且我們生成了跟蹤日誌,而且它掛在的部分是出去的地方,並嘗試連接到域,即使是不屬於域的計算機也是如此。它會得到「指定的域名不存在或無法聯繫。」跟蹤日誌中的異常,這就是所有時間都被吃掉的地方。
但是,真正奇怪的是,即使在我的工作機器上,如果我沒有連接到域(如果我不在我的工作網絡上,只是在家中運行),我仍然不要獲取延時。
我使用的是Windows 7 64位重建我的機器,並出現相同的行爲(正在運行XP SP3,當Windows 7似乎沒有解決這個問題,我恢復)。
我只是想知道如果任何人有什麼可能會導致此任何想法。順便說一句,如果我禁用「Client for Microsoft網絡」,時間就像打開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);
}
}
您在該機器上安裝了病毒掃描程序/防火牆/安全套件嗎? – CaptainPlanet 2011-01-19 19:32:38
@CaptainPlanet - 是的,但即使在刪除它們之後,它仍然很慢。我嘗試了沒有安裝病毒掃描程序,並關閉了Windows防火牆。謝謝你的想法。 – dcp 2011-01-19 19:42:30
你能告訴我們服務**配置**,尤其是安全設置嗎?它想要聯繫域名的事實表明,要麼使用默認爲Windows憑據的綁定,ServiceHost希望建立到Windows域的鏈接來檢查用戶憑據,或者您有一個自定義身份驗證機制聯繫Active Directory域。 – 2011-01-19 19:59:56