Как?WCF customBinding через Https - PullRequest
1 голос
/ 17 марта 2011

Я пытаюсь настроить службу 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, может подтвердить при необходимости.

1 Ответ

0 голосов
/ 17 марта 2011

ОК, ваша проблема в том, что вы не определили Адрес для своей услуги.Запомните ABC конечной точки: Address-Binding-Contract.

Вам необходимо определить адрес для службы, который в значительной степени определяется вашим файлом .svc и где этот файл можно просматривать из IIS.Каким бы ни был URL этого файла .svc, вы добавляете адрес, который вы определили (в вашем случае пустую строку), а затем он добавляется сверху.Поэтому, если я помещаю файл myservice.svc в корень, он становится

https://localhost/myservice.svc/<ServiceAddress>

В вашем случае ServiceAddress="", поэтому URL равен https://localhost/myservice.svc/.

См. здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...