그건 정확히 내가 생각한 것입니다! 계약 정의
[ServiceContract(CallbackContract = typeof(IAliveCallback))]
public interface IAlive
{
[OperationContract]
bool Validate();
[OperationContract]
string AliveWait(int i); // test test
}
- - 내 살아 클래스의 계약을 이행
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
public class Alive : SymHostBase, IAlive
{
private readonly static string _ID = "Alive";
private static int _MaxAliveWaitSeconds = 5;
public bool Validate()
{
return true;
}
public string AliveWait(int i)
{
Thread.Sleep(i * 1000);
return string.Format("I waited {0} seconds", i);
}
...
...
}
: 그래서 여기 (복사 및 붙여 넣기 ...의 비트 후) 소스 코드의 일부입니다
- 다음 호스트 응용 프로그램에이
string s = string.Format("net.tcp://localhost:{0}/Host/", port);
Uri tcpAddr = new Uri(s);
Uri[] baseAddress = { tcpAddr };
int MaxBuffer = 64; // 64 Mb
int bufferSize = MaxBuffer * 1024 * 1024; // 67108864
NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None, true);
tcpBinding.MaxBufferPoolSize = bufferSize; // 64 Mb
tcpBinding.MaxBufferSize = bufferSize;
tcpBinding.MaxReceivedMessageSize = bufferSize;
tcpBinding.TransferMode = TransferMode.Buffered;
tcpBinding.ReaderQuotas.MaxArrayLength = bufferSize;
tcpBinding.ReaderQuotas.MaxBytesPerRead = bufferSize;
tcpBinding.ReaderQuotas.MaxStringContentLength = bufferSize;
tcpBinding.MaxConnections = 100;
//tcpBinding.ReceiveTimeout = new TimeSpan(20, 0, 0);
tcpBinding.SendTimeout = new TimeSpan(0, 0, 5);
tcpBinding.ReliableSession.Enabled = true;
tcpBinding.ReliableSession.InactivityTimeout = new TimeSpan(7, 0, 0, 0); // 7 days
_HostAlive = new ServiceHost(typeof(Alive), baseAddress);
_HostAlive.AddServiceEndpoint(typeof(IAlive), tcpBinding, "alive"); // tcpBinding
ServiceThrottlingBehavior throttle = _HostAlive.Description.Behaviors.Find<ServiceThrottlingBehavior>();
if (throttle == null)
{
throttle = new ServiceThrottlingBehavior();
host.Description.Behaviors.Add(throttle);
}
throttle.MaxConcurrentCalls = 1000; // default 16
throttle.MaxConcurrentInstances = 1000; // default 26
throttle.MaxConcurrentSessions = 1000; // default 10
// open the host - bring it into life!
host.Open();
그게 정확히 내가 생각한 것입니다 - 나는 그들의 500 자 제한을 exceeeded 이후 내 질문에 대한 답변으로 코드를 게시하고 있습니다! – Marcel
각 WCF 노출 특성을 살펴 보았습니다. 이제 막 잊어 버렸던 점은 Test 클래스의 ServiceBehaviour에서 UseSynchronizationContext를 false로 설정하는 것이 었습니다. 동일한 스레드에서 실행되도록 서비스에 대한 모든 호출을 동기화하는 기본값은 true입니다. 따라서 다른 클라이언트의 후속 호출은 단순히 대기열에 저장됩니다. – Marcel