WCF Max Instanzen zu sein scheint, begrenzt auf 10
Habe ich einen einfachen WCF-Dienst gehostet in IIS7.5 ausgesetzt, die über einen wsHttp Bindung mit message security und InstanceContextMode.PerCall
Habe ich eine einfache Benutzeroberfläche, startet eine konfigurierbare Anzahl von threads, die jeweils den Aufruf der service.
Habe ich die perfmon-Zähler ServiceModel4.- Instanzen. Unabhängig von der Anzahl der erstellten threads und aufrufen der service, perfmon zeigt, dass der service schafft maximal 10 Instanzen.
Meine client-config ist wie folgt:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService3">
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/NGCInstancing/Service3.svc/~/Service3.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService3"
contract="NGCSecPerCall.IService3" name="WSHttpBinding_IService3">
<identity>
<servicePrincipalName value="host/RB-T510" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
Meine service-config ist wie folgt:
<?xml version="1.0"?>
<system.serviceModel>
<configuration>
<behaviors>
<serviceBehaviors>
<behavior name="SecPerCallBehaviour">
<serviceThrottling maxConcurrentCalls="30" maxConcurrentSessions="1000"
maxConcurrentInstances="30" />
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="BindingMessageSecPerCall" >
<security mode="Message">
<!-- it's by setting establishSecurityContext to false that we enable per call instancing with security -->
<message establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="ServiceInstancingDemo.Service3" behaviorConfiguration="SecPerCallBehaviour">
<endpoint address="~/Service3.svc"
binding="wsHttpBinding" bindingConfiguration="BindingMessageSecPerCall"
contract="ServiceInstancingDemo.IService3" />
</service>
</services>
</configuration>
</system.serviceModel>
Den client-code ist wie folgt:
private void btnSecPerCall_Click(object sender, EventArgs e)
{
int i;
int requests;
int delay;
lblStatus.Text = "";
DateTime startTime = DateTime.Now;
this.listBox1.Items.Add("start time=" + DateTime.Now);
delay = Convert.ToInt16(txtDelay.Text);
requests = Convert.ToInt16(txtRequests.Text);
Task<string>[] result;
result = new Task<string>[requests];
for (i = 0; i < requests; i++)
{
result[i] = Task<string>.Factory.StartNew(() => _ngcSecPerCall.WaitThenReturnString(delay));
}
for (i = 0; i < requests; i++)
{
this.listBox1.Items.Add(result[i].Result);
}
DateTime endTime = DateTime.Now;
TimeSpan ts = endTime - startTime;
lblStatus.Text = "Finished! Time taken= " + ts.Seconds + " seconds";
this.listBox1.Items.Add("end time=" + DateTime.Now);
}
Mein service-code ist wie folgt:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service3 : IService3
{
private int m_counter;
public string WaitThenReturnString(int waitMilliSeconds)
{
System.Threading.Thread.Sleep(waitMilliSeconds);
int maxT, workCT;
System.Threading.ThreadPool.GetMaxThreads(out maxT, out workCT);
m_counter++;
return String.Format("Incrementing counter to {0}.\r\nSession Id: {1}. Threads {2}, {3}", m_counter, OperationContext.Current.SessionId, maxT, workCT);
}
}
Gibt der Dienst 400,400 für die Anzahl der threads.
Weiß jemand, warum der Dienst weigerte sich, mehr zu schaffen, die 10 Instanzen?
Ist, wenn ich eine Kopie des service, aber mit ein wsHttp Bindung, hat <security mode="None"/>
dann den service gerne erstellt viele weitere Instanzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie den Test auf einem Windows Server oder Windows 7? Der Grund warum ich Frage ist, dass der IIS auf dem client-OS-Versionen hat eine 10-Verbindung zu begrenzen. Dies ist zu verhindern, dass das client-OS verwendet werden, die in einer server-Umgebung.
Den MaxConcurrentSessions Dokumentation erwähnt eine Optimierung für client-Anfragen, die kommen aus der gleichen AppDomain. Dein Beispiel-code ist im Grunde schlagen die gleiche Buchse auf der service. Da gibt es einige die Drosselung erfolgt pro client, das kann sich auf Ihren service-Verhalten. Auch 10 passiert der Standardwert für MaxConcurrentSessions so kann es sein, dass deine config ist nicht die änderung der WCF-Standard-Wert.
Aktivieren der Sicherheit wirkt sich auf die Gesamt-threads, denn es stellt eine "Sitzung" pro client, so dass jede Anfrage gesendet, muss nicht beglaubigt sein, auf jeden Anruf. Die Sicherheits - "sessions" gezählt MaxConcurrentSessions insgesamt.
Laufen Sie den client und server auf der gleichen Maschine? Dann könnten Sie kämpfen für threads.
Wenn Sie auf einem anderen PC, stellen Sie bitte sicher Sie getan haben, die folgenden config-änderungen auf dem client und dem server.
http://www.codeproject.com/KB/webservices/quickwins.aspx
Ist es möglich, dass der client generiert nicht mehr als 10 Anfragen an den gleichen server. Also, versuchen Sie bitte die oben genannten configs zuerst auf dem client und dem server.
Und natürlich, Sie müssen ein Windows-Server. Ansonsten wird der IIS-limit für Windows 7.