Несколько сервисов WCF могут совместно использовать общий BaseAddress?

По причинам, которые я не могу объяснить, изменение моего импорта решило мою проблему.

const pdfMake = require('pdfmake/build/pdfmake');
const pdfFonts = require('pdfmake/build/vfs_fonts');

Я включаю pdfMake.vfs = pdfFonts.pdfMake.vfs; еще дальше в мою страницу, когда я на самом деле строю PDF.

11
задан Sam 12 January 2009 в 14:42
поделиться

3 ответа

Можно объединить все контракты в одном классе, таким образом, у Вас есть один сервис с baseaddress и одним (или больше) конечная точка (точки) на контракт.

Чтобы постараться не иметь один большой файл класса, можно использовать частичное ключевое слово (предполагающий использование c#) разделять класс через несколько файлов. Каждый файл может реализовать один контракт, который делает поддержание отдельных интерфейсов намного легче.

В C++ можно использовать #includes или множественное наследование, но которые подразумевают большую сумму дисциплины...

Ваша конфигурация была бы похожа на это:

<services>
  <service behaviorConfiguration="WcfService.AlyzaServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceAll">
    <endpoint address="Websites/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceWebsites">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="LogReader/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceLogReader">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="Systemverwaltung/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceSystemverwaltung">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/" />
      </baseAddresses>
    </host>
  </service>
</services>
8
ответ дан 3 December 2019 в 09:42
поделиться

Сервисы могут совместно использовать значения BaseAddress (включая # порта, если Сеть. Услуга Совместного использования Порта Tcp работает). Это - адреса конечной точки, которые должны быть уникальными. Заметьте в своем файле конфигурации, что конечные точки MEX для каждого ServiceHost имеют адрес "mex". Ваши другие конечные точки имеют адрес пустой строки. При обеспечении относительного адреса для конечной точки к WCF (в файле конфигурации, по крайней мере), базовый адрес предварительно ожидается к нему. Поэтому адрес конечной точки MEX для услуг LogReader является "сетью tcp://localhost:8731/Design_Time_Addresses/SamAlyza/LogReader/mex".

Так как относительный адрес не был установлен на основной сервисной конечной точке, базовый адрес ServiceHost используется в качестве исполнительного адреса для основной сервисной конечной точки. Поскольку никакие две конечных точки не могут иметь перекрывающегося Uri. Значения AbsolutePath, Ваш пример привел бы Вас полагать, что значения базового адреса не могут быть совместно использованы. Класс ServiceHost, который размещает сервисы WCF, не имеет встроенной конечной точки, тогда как класс ServiceEndpoint имеет свойство ListenUri, которое будет заполнено на основе настроек, которые Вы обеспечиваете.

При изменении значений baseAddress в примере ко всему соответствию, пока Вы устанавливаете уникальные относительные значения адреса на элементах Конечной точки, все должно работать. Однако кажется, что можно столкнуться с некоторыми проблемами с конечными точками MEX, так как у них всех есть адрес "mex" в настоящее время. Сделайте уникальных, и необходимо быть в порядке.

Теперь, я должен спросить, действительно ли Вы уверены, что просто не желаете, чтобы эти сервисы совместно использовали пространство имен, а не базовые адреса?

2
ответ дан 3 December 2019 в 09:42
поделиться

Вы также можете установить базовые адреса в коде, если используете настраиваемый ServiceHostFactory.

В конфигурации вы можете иметь некоторые настройки приложения:

<configuration>
  <appSettings>
    <add key="BaseAddress" value="http://localhost:1234" />
  </appSettings>
<configuration>

Затем создайте собственный ServiceHostFactory:

public sealed class MyServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        var baseAddy = ConfigurationManager.AppSettings["BaseAddress"];
        baseAddresses.Add(new Uri(baseAddy));
        return new ServiceHost(serviceType, baseAddresses);
    }

}

Затем вам также нужно изменить ваши файлы .svc, чтобы использовать эту фабрику:

<%@ ServiceHost Language="C#" Debug="true" Service="MyApp.MyService" CodeBehind="MyService.svc.cs" Factory="MyApp.MyServiceHostFactory" %>
1
ответ дан 3 December 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: