Развертывание веб-форм с WCF внутри в IIS 8 не запускает WCF - PullRequest
0 голосов
/ 31 января 2019

У меня есть решение VisualStudio с проектами WebForms (называемыми EDWMS) и WCF (называемыми EDWMS.SYNC).WCF добавляется в качестве ссылки на сервис для проекта WebForms с помощью функции Discover.При локальном запуске в режиме «релиз» WCF корректно вызывается из приложения и работает нормально (хотя мне нужно запустить VS от имени администратора, чтобы он работал).Но при публикации проекта веб-форм в IIS 8 как через пакет веб-развертывания, так и через публикацию на FTP WCF, похоже, не публикуется.

Я попытался создать WCF как отдельный сайт в IIS, а затем настроил проект WCF как«Запуск проекта» в VS и публикация его в новом слоте сайта, а также добавление его порта в привязки сайта.В этом случае я могу просмотреть файл .svc и убедиться, что он настроен Вы создали службу.Чтобы протестировать этот сервис, вам понадобится ... .Но когда я вызываю его из приложения WebForms, он по-прежнему не отвечает этой ошибкой:

There was no endpoint listening at http://localhost:8733/Design_Time_Addresses/ED_WMS.SYNC/Sync/ that could accept the message. This is often caused by an incorrect address or SOAP action.
The remote server returned an error: (404) Not Found. 

Это код из приложения WebForms, который вызывает WCF:

var client = new SyncClient("BasicHttpBinding_ISync");
client.InnerChannel.OperationTimeout = new TimeSpan(2, 00, 0);
var message = string.Empty;
try
{
    var syncResult = new SyncResult();
    syncResult = client.GetInventory(1, 2, 3);
    message += $"Sync Result<hr/>Added: {syncResult.ItemsAdded}<br/>Updated: {syncResult.ItemsUpdated}<br/>Duration: {syncResult.Duration}";
    ((ICommunicationObject)client).Close();
}
catch (System.Exception ex)
{
    (client as ICommunicationObject)?.Abort();
    message += $"Error<hr/>{ex?.Message ?? "null"}<hr/>{ex?.InnerException?.Message ?? "null"}";
}
inventoryItemsLbl.Text = message;

Это мои WebForms 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=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>...</connectionStrings>
  <appSettings>...</appSettings>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="Login.aspx" timeout="2880" />
    </authentication>
    <compilation targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" executionTimeout="900" />
    <pages>...</pages>
  </system.web>
  <system.webServer><modules>...</modules></system.webServer>
  <runtime>...</runtime>
  <system.codedom><compilers>...</compilers></system.codedom>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ISync" />
      </basicHttpBinding>
    </bindings>
    <client>
<endpoint address="http://localhost:8733/Design_Time_Addresses/ED_WMS.SYNC/Sync/" 
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISync" 
contract="ServiceReferenceWMS.ISync" name="BasicHttpBinding_ISync" />
    </client>
  </system.serviceModel>
</configuration>

Это мой WCF App.config :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>...</configSections>
  <entityFramework>...</entityFramework>
  <runtime>...</runtime>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="MobilityBeanSoapBinding" closeTimeout="02:00:00" openTimeout="02:00:00"
            receiveTimeout="02:00:00" sendTimeout="02:00:00" maxReceivedMessageSize="100000000"
            maxBufferSize="100000000" maxBufferPoolSize="100000000">
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://warehouse:8080/wmwebservice_ejb/MobilityBean" binding="basicHttpBinding" bindingConfiguration="MobilityBeanSoapBinding" contract="EdWmsReference.MobilityBean" name="MobilityRemotePort" />
    </client>
    <services>
      <service name="ED_WMS.SYNC.Sync" behaviorConfiguration="MyServiceTypeBehaviors">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/ED_WMS.SYNC/Sync/" />
          </baseAddresses>
        </host>
        <endpoint name="basicHttpEndpoint" address="" binding="basicHttpBinding" contract="ED_WMS.SYNC.ISync" bindingConfiguration="MobilityBeanSoapBinding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

1 Ответ

0 голосов
/ 31 января 2019

Когда вы переходите из DEV -> Production (когда приложение WCF теперь размещается в IIS), URL-адрес времени разработки изменяется, вам потребуется установить правильный URL-адрес designTime в приложении веб-форм.

Доступно несколько вариантов, но все они указывают на изменение URI, связанного со службой

client.Endpoint.Address = new EndpointAddress(Server.IsLiveServer() ?
    @"LiveUrl" : @"TestURl"); 

Где TestURI - это URL-адрес designTime, а LiveURL - это рабочий URL-адрес.IsLiveServer - это просто логическое значение, позволяющее проверить, являетесь ли вы разработчиком или производственником.

Другой способ, которым вы можете воспользоваться, - просто создать Realease vs Debug webconfig, релиз будет иметь URL-адресразвернуть приложение, а затем установить конечную точку клиента с помощью appSetting или чего-то подобного

. Третий вариант потребует использования DLL-библиотеки IIS Administration для запроса размещенного веб-сайта и поиска URL-адреса службы WCF ииспользуйте это в своих веб-формах.

...