Вызов службы Lbrary из веб-проекта - что происходит в Web.Config?

Я новичок в WCF и работаю над проектом, в котором я создаю библиотеку WCF, которая вызывается веб-проектом (ASP.NET 2.03.5 / C #).

У меня тут кое-что происходит.

1) Я предоставил дополнительный контракт (IJSON) для своих контрактов SOAP (ISOAP) для моих веб-методов JSON. 2) У меня есть один контракт IFileTransferService, который обрабатывает потоковую передачу файлов.

Не могли бы вы взглянуть на мои файлы APP.CONFIG и WEB.CONFIG и сказать, правильно ли они выглядят или я без надобности воспроизводю то, что находится в моем App.Config? Если я использую служебную библиотеку, действительно ли мне нужно делать что-то дважды (объявлять службы, привязки и т. Д.)? Выглядит правильно?

Кроме того, всегда приветствуются любые другие стилистические / конструктивные комментарии относительно того, что у меня есть на стороне system.serviceModel.

Спасибо за ваше время.

WEB.CONFIG

<system.serviceModel>
    <client>
      <endpoint name="MySOAPAuthEP" 
                address="http://localhost:1241/WebProj/auth.svc/soap"
                binding="basicHttpBinding" 
                bindingConfiguration="soapWeb" 
                contract="Project.WebAPI.Authentication.ISOAPAuthService" />
      <endpoint name="MySOAPTradeEP"
                address="http://localhost:1241/WebProj/trade.svc/soap"
                binding="basicHttpBinding" 
                bindingConfiguration="soapWeb" 
                contract="Project.WebAPI.Trade.ISOAPTradeService" />
      <endpoint name="MySOAPFileTransferEP"
                address="http://localhost:1241/WebProj/filetransfer.svc/soap"
                binding="basicHttpBinding" 
                bindingConfiguration="httpLargeDataStream"
                contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" />

      <endpoint name="MyJSONAuthEP"
                binding="webHttpBinding" 
                bindingConfiguration="jsonWeb"
                contract="Project.WebAPI.Authentication.IJSONAuthService"  />
      <endpoint name="MyJSONTradeEP"
                binding="webHttpBinding" 
                bindingConfiguration="jsonWeb"
                contract="Project.WebAPI.Trade.IJSONTradeService"  />
      <endpoint name="MyJSONFileTransferEP"
                binding="webHttpBinding" 
                bindingConfiguration="jsonWeb"
                contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" />
    </client>
    <bindings>
      <basicHttpBinding>
        <binding name="soapWeb" />
        <binding name="httpLargeDataStream" closeTimeout="00:01:00" openTimeout="00:01:00"
          receiveTimeout="00:10:00" sendTimeout="00:01:00" maxBufferSize="65536"
          maxReceivedMessageSize="2147483647" messageEncoding="Mtom" transferMode="Streamed">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="jsonWeb" maxBufferSize="1500000" maxBufferPoolSize="1500000"
          maxReceivedMessageSize="1500000">
          <readerQuotas maxDepth="32" maxStringContentLength="656000" maxArrayLength="656000"
            maxBytesPerRead="656000" maxNameTableCharCount="656000" />
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WebHttpEPBehavior">
          <webHttp />
        </behavior>
        <behavior name="BasicHttpEPBehavior" />
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
      <service behaviorConfiguration="Default" name="Project.WebAPI.Trade.TradeService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
          binding="webHttpBinding" name="MyJSONTradeEP" contract="Project.WebAPI.Trade.IJSONTradeService" />
        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPTradeEP"
          contract="Project.WebAPI.Trade.ISOAPTradeService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1243/WebProj/trade.svc" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="Default" name="Project.WebAPI.Authentication.AuthService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
          binding="webHttpBinding" name="MyJSONAuthEP" contract="Project.WebAPI.Authentication.IJSONAuthService" />
        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPAuthEP"
          contract="Project.WebAPI.Authentication.ISOAPAuthService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1242/WebProj/auth.svc" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="Default" name="Project.WebAPI.FileTransfer.FileTransferService">

        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
                  binding="webHttpBinding" name="MyJSONFileTransferEP" contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" />

        <endpoint address="soap" 
                  binding="basicHttpBinding" 
                  name="MySOAPFileTransferEP"
                  bindingConfiguration="httpLargeDataStream"
                  contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" />

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1244/WebProj/filetransfer.svc" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

APP.CONFIG

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="soapWeb" />
        <binding name="httpLargeDataStream"
                 maxReceivedMessageSize="2147483647"
                 closeTimeout="00:01:00"
                 openTimeout="00:01:00"
                 receiveTimeout="00:10:00"
                 sendTimeout="00:01:00"
                 transferMode="Streamed"
                 messageEncoding="Mtom"
                 maxBufferSize="65536">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="jsonWeb" maxBufferSize="1500000" maxBufferPoolSize="1500000"
          maxReceivedMessageSize="1500000">
          <readerQuotas maxDepth="32" maxStringContentLength="656000" maxArrayLength="656000"
            maxBytesPerRead="656000" maxNameTableCharCount="656000" />
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Default" name="Project.WebAPI.Trade.TradeService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
          binding="webHttpBinding" name="MyJSONTradeEP" contract="Project.WebAPI.Trade.IJSONTradeService" />
        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPTradeEP"
          contract="Project.WebAPI.Trade.ISOAPTradeService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1243/WebProj/trade.svc" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="Default" name="Project.WebAPI.Authentication.AuthService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
          binding="webHttpBinding" name="MyJSONAuthEP" contract="Project.WebAPI.Authentication.IJSONAuthService" />
        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPAuthEP"
          contract="Project.WebAPI.Authentication.ISOAPAuthService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1242/WebProj/auth.svc" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="Default" name="Project.WebAPI.FileTransfer.FileTransferService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
                  binding="webHttpBinding" name="MyJSONFileTransferEP" contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" />

        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPFileTransferEP"
                  contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" />

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1244/WebProj/filetransfer.svc" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WebHttpEPBehavior">
          <webHttp />
        </behavior>
        <behavior name="BasicHttpEPBehavior" />
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

person Peter    schedule 25.10.2009    source источник


Ответы (1)


Несколько комментариев, которые помогут упорядочить ваши файлы конфигурации и сделать их более читабельными:

  • у вас есть разделы <services> и <client> в файлах web.config и app.config. Почему? Обычно в этом нет необходимости - стороне сервера (где выполняется код вашего сервера) нужен <services>, а стороне клиента, вызывающей сервер, нужен только раздел <client>.
  • похоже, вы использовали Visual Studio или svcutil.exe для создания своих конфигураций, поскольку в вашей конфигурации привязки также перечислены все значения привязки по умолчанию (это огромное множество настроек, которые у вас есть). Вы можете уменьшить это, чтобы оставить только те настройки, которые вы фактически изменили для своего конкретного сценария, таким образом сделав конфигурации намного меньше и более понятными.
  • вам действительно нужна настройка <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>? Это в основном «подделывает» HttpContext внутри ваших WCF-сервисов, так что они выглядят и ведут себя так же, как веб-сервисы ASMX - вам это нужно?
  • этот параметр здесь <serviceDebug includeExceptionDetailInFaults="true" /> может быть полезен и приемлем в среде разработки / тестирования, но я определенно рекомендую удалить его для производства
  • вы самостоятельно размещаете или размещаете в IIS? Если вы используете IIS для размещения, определенная запись <baseAddress> не будет использоваться; в среде хостинга IIS базовый адрес игнорируется, поскольку местоположение файла * .svc (виртуального каталога, в котором он находится) является вашим базовым адресом, и вы не можете его переопределить.

Вот и все на первый взгляд :-)

Марк

person marc_s    schedule 25.10.2009
comment
Спасибо, Марк. Я последовал вашему совету и просто покинул раздел ‹client› в моем web.config, но теперь не могу заставить его работать. Я получаю следующую ошибку: Служба AuthService не имеет конечных точек приложения (не инфраструктуры). Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или потому, что в файле конфигурации не может быть найден элемент службы, соответствующий имени службы, или потому, что в элементе службы не определены конечные точки. Я помню, что у меня была эта ошибка, когда я начал, и решил ее, сбросив службы и привязки в Web.config. Идеи? Еще раз спасибо. - person Peter; 26.10.2009
comment
Где вы размещаете свой класс обслуживания? IIS? Затем вам понадобится <services> в вашем web.config и ваш <client> (но без служб) в клиентском app.config, который обращается к этой службе. - person marc_s; 26.10.2009
comment
Еще раз спасибо. Нет, сейчас я занимаюсь разработкой самостоятельно. - person Peter; 26.10.2009
comment
Похоже, моему web.config нужны вещи ‹services›, ‹bindings› и ‹behaviors› - иначе я не могу заставить его работать. Работает нормально, когда я добавляю все обратно в файл. Ну что ж, если он не сломан, не чините его, верно? Еще раз спасибо. - person Peter; 26.10.2009