Я пытаюсь настроить службу WCF для внутреннего использования на нашей внешней веб-ферме (у нас нет веб-фермы внутри, и мне нужен этот сервис для отработки отказа и распределения нагрузки).
Требования:
- Состояние PerSession, так как нам нужен сервис для хранения переменных данных для каждого сеанса.
- HTTPS. После долгих поисков я прочитал, что мне нужно создать customBinding, что я и сделал, но не уверен, правильно ли это.
- Больший размер сообщения, поскольку одним из параметров является массив байтов [], который может быть не более 5 МБ.
- нет необходимости вручную редактировать файл app.config на стороне клиента. т. е. мне нужно, чтобы разработчик просто добавил ссылку на службу, а затем начал использовать объект без изменения файла app.config.
Примечание. Ранее эта служба корректно работала по протоколу HTTP (с использованием wsHttpBinding).
Я также работал с HTTPS, но он не поддерживал состояние PerSession и терял значения внутренних переменных при каждом вызове функции.
В настоящее время я получаю эту ошибку от тестового жгута:
Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт 'AppMonitor.IAppMonitorWcfService' в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации или из-за того, что в клиентском элементе не найден элемент конечной точки, соответствующий этому контракту.
ПРИМЕЧАНИЕ. Ошибка возникает в EXE-файле Test Harness, в котором служба WCF указана непосредственно в разделе «Ссылки на службу». Это не проблема exe-ссылки на другой объект, который затем ссылается на службу WCF, о которой я читал.
WSDL отображается правильно при просмотре URL.
Web.Config:
<system.serviceModel>
<services>
<service name="AppMonitor.AppMonitorWcfService" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="customBinding" bindingConfiguration="EnablePerSessionUnderHttps" contract="AppMonitor.IAppMonitorWcfService"/>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<customBinding>
<binding name="EnablePerSessionUnderHttps" maxReceivedMessageSize="5242880">
<reliableSession ordered="true"/>
<textMessageEncoding>
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</textMessageEncoding>
<httpsTransport authenticationScheme="Anonymous" requireClientCertificate="false"/>
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Файл App.config EXE (генерируется автоматически при добавлении ссылки на службу):
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="CustomBinding_IAppMonitorWcfService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="true" />
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client />
</system.serviceModel>
</configuration>
Я не уверен, почему app.config показывает wsHttpBinding? Разве это не должно быть customBinding?
Я действительно не хочу редактировать app.config, так как этим сервисом будут пользоваться десятки разработчиков, и я хочу, чтобы они просто могли добавить ссылку на сервис, и они сразу уходят ...
Использование VS2008, .NET 3.51.
Я думаю, что сервер IIS7, Win Server 2008, может подтвердить при необходимости.