WCF / EF / SQL Server / VS2017 / C#: многоуровневое приложение получает ошибку при развертывании на локальном IIS 10.0 в качестве хост-сервера - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь развернуть настольное приложение Windows с уровнем обслуживания, уровнем logi c и уровнем данных. Уровень данных использует SQL сервер с EF 6.2. Уровень клиента пользовательского интерфейса - это приложение Windows Forms.

Приложение отлично работает в тестовом режиме отладки, когда служба размещается в приложении WcfSvcUtil.exe с псевдонимом службы в IIS - без ошибок и извлечения всех данных и обновления работают в тестовом режиме.

Теперь я опубликовал уровень обслуживания, уровень logi c и уровень данных как пустой веб-сайт, который будет размещен IIS на моем локальном компьютере (c: / inetpub / wwwroot/) в подпапке «псевдоним». Я создал приложение IIS с именем псевдонима для службы. Уровень пользовательского интерфейса и уровень службы публикуются в другой локальной папке на моем компьютере.

Когда я запускаю уровень пользовательского интерфейса и пытаюсь запросить SQL базу данных сервера, я получаю следующую ошибку:

Конечная точка http://localhost/TheACTSFactoryWCFLocal/MemberService/, которая могла бы принять сообщение, отсутствовала. Часто это вызвано неправильным адресом или действием SOAP. Для получения дополнительных сведений см. InnerException, если он присутствует.

Элемент My Service Model в web.config на размещенном веб-сайте:

<system.serviceModel>
    <services>
        <service name="ACTSFactoryService.MemberService">
            <endpoint name="BasicHttpBinding_IMemberService"
                address="" 
                binding="basicHttpBinding" 
                contract="ACTSFactoryService.IMemberService" >
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint 
                address="mex" 
                binding="mexHttpBinding" 
                contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost/TheACTSFactoryWCFLocal/MemberService/" />
                </baseAddresses>
            </host>
        </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
        <serviceActivations>
            <add factory="System.ServiceModel.Activation.ServiceHostFactory" 
                 relativeAddress="./MemberService.svc" 
                 service="ACTSFactoryService.MemberService" />
        </serviceActivations>
    </serviceHostingEnvironment>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" />
                <serviceDebug includeExceptionDetailInFaults="True" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IMemberService" 
                     maxReceivedMessageSize="20000000" maxBufferSize="20000000" />
        </basicHttpBinding>
    </bindings>
</system.serviceModel>

Я новичок в WCF и Entity Framework, поэтому любые предложения будут оценены. У меня также есть app.config и web.config на уровне обслуживания и app.config на уровне пользовательского интерфейса. Я могу опубликовать их, если вы считаете, что они будут полезны, но для показанного IIS web.config я в основном объединил конечные точки из конфигурационных файлов уровня сервиса для публикации на веб-сайте IIS.

** Изменено мой файл web.config, как показано ниже **

***

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
  </system.web>

  <system.serviceModel >   
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" >
      <serviceActivations > 
        <add factory ="System.ServiceModel.Activation.ServiceHostFactory"
                relativeAddress="./MemberService.svc"
                service="ACTSFactoryService.MemberService" />
     </serviceActivations> 
    </serviceHostingEnvironment>

    <behaviors >
      <serviceBehaviors >
        <behavior >
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

***

Кроме того, когда я перехожу к http://localhost/TheACTSFactoryWCFLocal/MemberService.svc, моя служба обнаруживается.

enter image description here

Ниже приведен файл App.config на уровне пользовательского интерфейса:

***
 <configuration>
   <startup>
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
   </startup>
   <system.serviceModel>
     <bindings>
       <basicHttpBinding>
         <binding name="BasicHttpBinding_IMemberService"      maxBufferSize="20000000"
           maxReceivedMessageSize="20000000" />
       </basicHttpBinding>
     </bindings>
     <client>
       <endpoint address="http://localhost/TheACTSFactoryWCFLocal/MemberService/"
         binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMemberService"
         contract="MemberServiceProxy.IMemberService" />
     </client>
   </system.serviceModel>
 </configuration>
***

Вот сервер IIS папка с именем псевдонима приложения IIS, там нет SV C файл

enter image description here

Вот библиотеки DLL , et c, опубликовано в папке Bin

enter image description here

Развертывание папки Alias ​​/ Bin на сервере IIS выглядит нормально для служба WCF, размещенная в IIS 10.0 дюйма NET 4.5.2? Также я ничего не публиковал sh в папку Roslyn (CodeDom). Есть комментарии или предложения?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Согласно вашему описанию, я обнаружил, что когда вы публикуете sh службу в IIS, тег хоста все еще существует в вашем файле конфигурации. Только программы, размещенные на собственном хостинге или размещенные на хосте, такие как windows service, должны настраивать хост. Когда вы размещаете службу в IIS, базовый адрес службы состоит из номера порта, развернутого в IIS, и имени файла службы.

enter image description here

Это файл конфигурации службы WCF, развернутой в IIS.

enter image description here

Я установил номер порта службы на 8063.

enter image description here

Получите доступ к этому адресу, и мы увидим каталог службы.

enter image description here

Щелкните service1.scv, чтобы убедиться, что служба запускается нормально. В это время «localhost: 8063 / Service1.sv c» в адресной строке является адресом службы. Для успешного выполнения клиенту необходим доступ к этому адресу.

обновление

Если ваш проект развернут в IIS, я предлагаю использовать шаблон приложения службы WCF при создании проекта.

enter image description here

Структура каталога после создания выглядит следующим образом:

enter image description here

Service1 - это класс реализации услуги.

0 голосов
/ 04 июля 2020

Мне не удалось развернуть решение, размещенное в IIS, поэтому я изменил свою стратегию на использование проекта Self-Hosting Windows Forms в качестве приложения для хостинга.

Я изменил свой проект службы с VS2017 .NET4.5.2 WCF Service Library в шаблон WCF Service Application, и мне удалось более успешно заставить мое общее решение работать в режиме разработки / отладки. Однако мне не удалось должным образом опубликовать / развернуть свое решение, чтобы IIS разместил Службу. Итак, я перешел на использование Windows Forms метода «самостоятельного размещения». Это соответствует моей конечной цели - иметь возможность использовать элементы управления Windows Forms, и он будет хорошо работать для предполагаемых пользователей группа на данный момент.

Вот что я сделал:

  1. Изменил мой проект службы на шаблон приложения службы WCF.

  2. В. NET 4.5.2 файл * .SV C не требуется, но интерфейс и реализация обязательны.

  3. Удалена папка IIS Host Solution, добавлены Windows Forms проект как приложение для хостинга служб.

  4. Web.config службы скопирован в проект HostWinFormsApp, переименован в App.config.

  5. Внесены изменения в В файле App.config проекта хостинга должен быть раздел «serviceHostingEnvironment»

  6. Добавлен раздел «serviceActivations», указывающий на базовый адрес в проекте хостинга. Пример: relativeAddress = "./ HostWinFormsApp / MemberService. sv c "

  7. Добавлен almos t то же самое, что и Web.config в проекте службы, но с простым relativeAddress = "./ MemberService.sv c" только

  8. С исправлением HostWinFormsApp и файлов конфигурации приложения службы, Мне удалось запустить службу, запустить SVCUTIL.exe и создать прокси службы для пользовательского интерфейса. Эта утилита также обновила app.config UI Client, указав адрес конечной точки:

  9. Переименовал «Setup.exe» в «Client.exe» и дважды щелкнул для завершения установки.

  10. Создан файл «RunApps.bat» для запуска обоих приложений . Создал ярлык на рабочем столе для c: \ pub-folder \ RunApps.bat, отредактировал «Дополнительно» в ярлыке для запуска от имени администратора.

  11. Дважды щелкнул ярлык и хост. exe и Client.exe запущены.

  12. Снимок экрана ниже показывает службу, клиент пользовательского интерфейса, папку развертывания и значок «Ярлык» на рабочем столе.

Deployed Service, Host, Client and Shortcut

  1. Следующий pi c показывает класс Program.cs проекта WinForms. В этом классе определяется объект ServiceHost с типом службы и базовым адресом службы, а затем открывается узел службы, который запускает службу, работающую (прослушивающую) запросы.

The ServiceHost defined and opened.

  1. После завершения этого развертывания (localdb) мне пришлось удалить и перезагрузить мой EntityFramework и перестроить класс модели объекта на уровне DAL, используя удаленную базу данных в качестве источника. После того, как новое соединение и модель сущности для удаленной базы данных были завершены, и все файлы конфигурации были обновлены с помощью новой строки соединения, я повторно развернул таким же образом, как указано выше, на свой ноутбук - с локально установленной службой, которая теперь обращается к удаленной базе данных. Это была реализация модели EF DB Model First. SQL Серверная база построена в MS SSMS.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...