이 질문은이 질문과 비슷합니다. Win32Exception @ ServiceHost.Open() for WCF service.WCF slow ServiceHost.Open() 호출
아래의 ServiceHost.Open 호출에서 매우 느린 컴퓨터가 있습니다. 매번 서비스를 열 때까지 항상 7 초 정도 걸립니다. 이 기계는 내 고향 상자이며 이 아니고 도메인의 일부입니다.
은 도메인의 일부이고 서비스 호스트는 첫 번째 호출에서 약 3-4 초 만에 열리는 다른 상자 (내 작업 상자)에서 동일한 코드를 실행할 수 있지만 프로그램을 다시 실행하면 서비스 호스트가 약 1 초 이내에 열립니다.
나는이 문제에 대해 MS 지원팀에서 작업했으며 추적 로그를 생성했으며 걸려있는 부분은 도메인이 아닌 컴퓨터에서도 도메인에 연결을 시도하는 곳입니다. 그리고 그것은 "지정된 도메인이 존재하지 않거나 접촉 할 수 없습니다."라는 메시지가 나타납니다. 예외 추적 로그에, 그리고 그 모든 시간을 먹는지고있다.
하지만 정말 이상한 점은 내 작업 컴퓨터에서도 도메인에 연결되어 있지 않으면 (내 직장 네트워크에없고 집에서 뛰는 것처럼) 여전히 하지 않음 get 지연.
Windows 7 64 비트를 사용하여 컴퓨터를 재구성했으며 Windows 7이 문제를 해결하지 못했을 때 복원 한 XP SP3을 실행하는 동일한 문제가 발생합니다.
나는 누군가가 이것을 일으킬 수있는 아이디어가 있는지 궁금해했습니다. 그런데 "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
@CaptainPlanet - 예.하지만 제거한 후에도 여전히 느립니다. 바이러스 스캐너가 설치되지 않은 채로 시도했지만 Windows 방화벽이 꺼졌습니다. 생각에 감사드립니다. – dcp
서비스 ** 설정 **, 특히 보안 설정을 보여줄 수 있습니까 ?? 도메인에 연결하려고한다는 사실은 ServiceHost가 Windows 도메인에 대한 링크를 설정하여 사용자 자격 증명을 확인하려고하는 Windows 자격 증명을 기본값으로 사용하거나 사용자 지정 인증 메커니즘을 시도하고 있거나 Active Directory 도메인에 연결할 수 있습니다. –