Это вопрос, аналогичный этому: Win32Exception @ ServiceHost.Open() для службы WCF< /а>.
У меня есть машина, которая очень медленно работает при вызове ServiceHost.Open ниже. Каждый раз для открытия службы требуется около 7 секунд. Эта машина — мой домашний ящик, и она не является частью домена.
Я могу запустить тот же код на другом компьютере (мой рабочий ящик), который является частью домена, и узел службы открывается примерно через 3-4 секунды при первом вызове, но если я снова запущу программу узел службы открывается примерно через 1 секунду или меньше.
Я работал над этим со службой поддержки MS, и мы создали журналы трассировки, и часть, в которой они висят, это то, где они выходят и пытаются подключиться к домену, даже на машине, которая не является частью домена. И выдает "Указанный домен либо не существует, либо с ним невозможно связаться". исключение в журнале трассировки, и именно здесь все время съедается.
Но что действительно странно, так это то, что даже на моем рабочем компьютере, если я не подключен к домену (например, если я не в своей рабочей сети и просто работаю из дома), я все еще не могу получить отсрочку.
Я восстановил свою машину, используя 64-разрядную версию Windows 7, и происходит то же самое (использовал XP SP3, который я восстановил, когда Windows 7, похоже, не решила проблему).
Я просто задавался вопросом, есть ли у кого-нибудь идеи о том, что может быть причиной этого. Кстати, если я отключу «Клиент для сетей 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);
}
}