Я новичок в .net и очень мало знаю о WCF, так что терпите меня, если возникнут глупые вопросы. Мне интересно, как WCF обрабатывает одновременные вызовы в сценарии SELF-HOST, если мой код явно не порождает какой-либо поток. Итак, после прочтения большого количества данных в стеке, я создал тестовое приложение, но оно, похоже, не работает. Пожалуйста, порекомендуйте. Большое спасибо.
Обратите внимание ...
- Мой вопрос касается только WCF САМОСТОЯТЕЛЬНЫЙ ХОСТИНГ , поэтому, пожалуйста, не обращайтесь к IIS.
- Я использую webHttpBinding .
- Я понимаю, что есть maxConnection и настройки регулирования обслуживания, но меня интересуют только 2 одновременных вызова в моей настройке исследования. Так что не должно быть никаких проблем с максимальным соединением или пулом потоков.
- Мой тестовый сервис НЕ , использующий сеанс.
Код, как показано ниже ...
namespace myApp
{
[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public interface ITestService
{
[OperationContract]
[WebGet(UriTemplate="test?id={id}")]
string Test(int id);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class TestService : ITestService
{
private static ManualResetEvent done = new ManualResetEvent(false);
public string Test(int id)
{
if (id == 1)
{
done.Reset();
done.WaitOne();
}
else
{
done.Set();
}
}
}
}
app.config ...
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name = "TestEndpointBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name = "myApp.TestService">
<endpoint address = "" behaviorConfiguration="TestEndpointBehavior"
binding = "webHttpBinding"
contract = "myApp.ITestService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/test/"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
<system.web>
<sessionState mode = "Off" />
</system.web>
Как я проверял ...
Как только приложение запустилось, я открыл браузер, на всякий случай FF, сделал один вызов http://localhost:8080/test/test?id=1. Этот запрос переводит приложение в режим ожидания сигнала, т.е. WaitOne. Затем сделал еще один вызов на другой вкладке браузера на http://localhost:8080/test/test?id=2.. Ожидается, что этот запрос установит сигнал и, следовательно, сервер вернется для обоих запросов.
Но я видел, что приложение зависло, и функция Test не была введена для второго запроса. Так что, очевидно, мой код не поддерживает одновременные / параллельные вызовы. Ничего плохого?