Публикация службы WCF на внешний сервер IIS с другими приложениями

Ошибка использования раздела, зарегистрированного как allowDefinition = 'MachineToApplication', превышающего уровень приложения. Эта ошибка может быть вызвана тем, что виртуальный каталог не настроен как приложение в IIS.

    </service>
  </services>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>

Я понимаю, что это очень распространенная и двусмысленная ошибка, и что там уже много вопросов, но никто из них не решил мою проблему. Поэтому я постараюсь быть более основательным и конкретным:

Это WCFService, который я публикую на внешний сервер IIS через FTP. Я получаю эту ошибку, когда пытаюсь просмотреть сайт в браузере https://www.domain.com/correctdirectory/JobsService.svc

Это мой Web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=*token*" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" />
    <customErrors mode="Off"></customErrors>
    <httpModules>
    </httpModules>
  </system.web>

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttpBindingConfiguration">
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="WcfServiceAPI.Services.Validation.ValidationService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBindingConfiguration" contract="WcfServiceAPI.Services.Validation.IValidationService"/>
      </service>
      <service name="WcfServiceAPI.Services.Jobs.JobsService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBindingConfiguration" contract="WcfServiceAPI.Services.Jobs.IJobsService"/>
      </service>
    </services>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>
    <directoryBrowse enabled="true" />
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

И вот что я убедился:

  • Проект очищен в режиме отладки и выпуска.
  • Проект построен в режиме отладки.
  • Web.config в корне IIS не конфликтует с этим Web.config. Он в основном просто навязывает https и обрабатывает разные запросы типа файла.
  • Служба размещается как приложение в IIS (а не только в виртуальном каталоге)

Он отлично работает, когда я публикую его на сервере во внутренней сети, у которого нет других веб-сайтов или служб.

Я знаю, что на сервере, на котором я пытаюсь опубликовать, есть много других приложений, но мое приложение находится на корневом уровне, так что это не имеет значения, не так ли? Если это имеет значение, я также знаю, что хотя бы одно из этих приложений является веб-службой ASMX. Владелец сервера также не знает проблему.

Я также попытался понизить мой проект до .NET 4.0, так как я знаю, что его служба ASMX работает на этом.

Любые идеи?

Ответ 1

Я уже пробовал переместить каталог в корень виртуального каталога через внешний FTP-клиент (Total Commander) без успеха, но когда я использовал Visual Studio, встроенный в инструмент публикации, и убедился, что у вас есть пустой Site Path, он, наконец, начал работать.

Я до сих пор не уверен, почему это так, но я думаю, что я буду делать некоторые исследования по этому поводу в другой раз, когда я получу время. Если кто знает, комментарии будут очень оценены!