Я новичок в .net и очень мало знаю о WCF, так что терпите меня, если зададут какие-нибудь глупые вопросы. Мне интересно, как WCF обрабатывает одновременные вызовы в сценарии SELF-HOST, если мой код явно не порождает какой-либо поток. Поэтому, много читая о stackoverflow, я создал тестовое приложение, но оно, похоже, не работает. Пожалуйста, порекомендуйте. Большое спасибо.
Пожалуйста, обрати внимание ...
- Мой вопрос касается только 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 не была введена для второго запроса. Так что, по-видимому, мой код не поддерживает одновременные / одновременные вызовы. Ничего плохого?
ManualResetEvent
. - person cadrell0   schedule 30.01.2012private static ManualResetEvent done
имеет область действия AppDomain. Он распределяется между потоками и контекстами. WCF может работать как без сохранения состояния, так и с сохранением состояния. Сеансы, создание экземпляров и параллелизм - person oleksii   schedule 31.01.2012