Несколько конечных точек службы WCF

Я размещаю службу WCF в качестве службы Windows.

Снимок ниже.

myHost = new ServiceHost(typeof(AnalyticsService));
Uri address = new Uri("http://localhost:8080/MathServiceLibrary");

WSHttpBinding binding = new WSHttpBinding();
binding.MaxReceivedMessageSize = 2147483647;
binding.MaxBufferPoolSize = 2147483647;

//binding.Security.Mode = SecurityMode.None;
Type contract = typeof(IAnalyticsService);

myHost.AddServiceEndpoint(contract,binding,address);

Как вы можете видеть, раньше я открывал Службу только локально. Я хотел бы добавить еще одну ServiceEndpoint, чтобы другие машины в моей сети также могли вызывать службу.

Я предполагаю, что мне нужно будет добавить что-то вроде этого в приведенный выше код:

myHost = new ServiceHost(typeof(AnalyticsService));

Uri address = new Uri("http://localhost:8080/MathServiceLibrary");
Uri new address = new Uri("http://xxx.xxx.xxx:8080/MathServiceLibrary");

WSHttpBinding binding = new WSHttpBinding();
binding.MaxReceivedMessageSize = 2147483647;
binding.MaxBufferPoolSize = 2147483647;

Type contract = typeof(IAnalyticsService);

myHost.AddServiceEndpoint(contract, binding, address);
myHost.AddServiceEndpoint(contract, binding, newaddress);

Теперь моя текущая конфигурация приложения библиотеки служб выглядит так:

 <system.serviceModel>
    <services>
      <service behaviorConfiguration="ServiceLibrary.Service1Behavior"
        name="ServiceLibrary.AnalyticsService">
        <endpoint address="" binding="wsHttpBinding" contract="ServiceLibrary.IAnalyticsService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/ServiceLibrary/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceLibrary.Service1Behavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Пока мой app.config в сервисной библиотеке хоста

  <system.serviceModel>
    <services>
      <service name="ServiceLibrary.AnalyticsService"
               behaviorConfiguration ="MathServiceMEXBehavior">
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/MathService"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MathServiceMEXBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Я предполагаю, что мне нужно добавить еще один базовый адрес в файл библиотеки служб с внешним (не локальным) адресом. Я не понимаю, что нужно изменить в файле служебной библиотеки.


person bearrito    schedule 22.07.2010    source источник
comment
Если вы публикуете код или XML, пожалуйста выделите эти строки в текстовом редакторе и нажмите кнопку кода (101 010) на панели инструментов редактора, чтобы правильно отформатировать и выделить синтаксис!   -  person marc_s    schedule 22.07.2010


Ответы (1)


Нет, вы не можете добавить второй базовый адрес на основе http — вы можете выбрать только один для каждого протокола — один для http, один для net.tcp и так далее.

Что вам нужно сделать, так это создать вторую конечную точку в вашем app.config для вашего хост-приложения службы (app.config из библиотеки службы даже никогда не будет использоваться — забудьте об этом файле) и назначить ей полный адрес.

<system.serviceModel>
    <services>
      <service name="ServiceLibrary.AnalyticsService"
               behaviorConfiguration ="MathServiceMEXBehavior">

        <endpoint name="firstEndpoint"
                  address=""
                  binding="wsHttpBinding"
                  contract="IAnalyticsService" />

        <endpoint name="secondEndpoint"
                  address="http://xxx.xxx.xxx:8080/MathServiceLibrary"
                  binding="wsHttpBinding"
                  contract="IAnalyticsService" />

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

Таким образом, firstEndpoint будет использовать базовый адрес, и вы сможете вызвать его из

http://localhost:8080/MathService

в то время как secondEndpoint использует определенный, полностью определенный URL-адрес, и вы сможете вызвать его под

http://xxx.xxx.xxx:8080/MathServiceLibrary

Однако: почему вы вообще хотите иметь вторую конечную точку ?? Обычно у вас есть только вторая конечная точка, если вы хотите выставить разные протоколы, например. обычно у вас есть одна конечная точка http, одна https, одна конечная точка net.tcp и так далее. Наличие двух отдельных конечных точек http с одним и тем же контрактом и одинаковой привязкой не имеет для меня особого смысла.....

person marc_s    schedule 22.07.2010
comment
Я должен был быть более ясным. Все, что я ДЕЙСТВИТЕЛЬНО хочу сделать, это изменить локальный хост на IP-адрес и сделать службу доступной для других машин, а также иметь возможность вызывать службу с клиента на локальной машине. - person bearrito; 22.07.2010