Многофункциональные конечные точки WCF - PullRequest
0 голосов
/ 22 июля 2010

Я размещаю службу 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);

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

 <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 в хосте Service Library равен

  <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>

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

1 Ответ

0 голосов
/ 22 июля 2010

Нет, вы не можете добавить второй базовый адрес на основе 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 с одним и тем же контрактом и одной и той же привязкой не имеет большого смысла для меня .....

...