Pode adicionar um serviço de referência para vários contratos WCF Serviços

StackOverflow https://stackoverflow.com/questions/1661284

  •  12-09-2019
  •  | 
  •  

Pergunta

Eu tenho vários contratos de serviço definidos em uma biblioteca WCF que são hospedados em um serviço do Windows. Estes serviços são expostos como se segue no arquivo de configuração de serviço do Windows:

<services>
  <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
    name="ReportingComponentLibrary.TemplateService">
    <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateService" bindingConfiguration="wsHttp" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateService/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
    name="ReportingComponentLibrary.TemplateReportService">
    <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateReportService" bindingConfiguration="wsHttp" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateReportService/" />
      </baseAddresses>
    </host>
  </service>
</services>

Agora, quando eu adicionar referência de serviço no meu aplicativo cliente,

É possível adicionar apenas um serviço de referência para acima de dois serviços ou

Eu preciso de referência separado para cada contrato de serviço / serviço.

Update:

Aqui estão os meus detalhes de aplicação:

Eu tenho três projectos diferentes:

  1. Biblioteca Serviço WCF
  2. Windows Service para hospedagem acima Serviço WCF
  3. Cliente - Aplicação Console for Testing

Agora, O App.Config em WCF Service Library é a seguinte:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>     

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttp" maxReceivedMessageSize="50000000" maxBufferPoolSize="50000000" messageEncoding="Mtom">
          <readerQuotas maxDepth="500" maxStringContentLength="500000000" maxArrayLength="500000000"
          maxBytesPerRead="500000000" maxNameTableCharCount="500000000" />
        </binding>
      </wsHttpBinding>
    </bindings>

    <services>
      <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
        name="ReportingComponentLibrary.TemplateService">
        <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateService" bindingConfiguration="wsHttp" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateService/" />
          </baseAddresses>
        </host>
      </service>

      <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
        name="ReportingComponentLibrary.TemplateReportService">
        <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateReportService" bindingConfiguration="wsHttp" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateReportService/" />
          </baseAddresses>
        </host>
      </service>

    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="ReportingComponentLibrary.TemplateServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

E App.Config no Windows Service é o mesmo que acima.

Agora, no meu aplicativo cliente, eu preciso consumir métodos de ambos TemplateService e TemplateReportService.

Então, eu posso sempre dois diferentes Referências de serviços como:

http: // localhost: 8080 / ReportingComponentLibrary / TemplateService / e

http: // localhost: 8080 / ReportingComponentLibrary / TemplateReportService /

Esta é toda a multa de trabalho.

Mas eu queria saber se há alguma maneira (para além do invólucro solucionar você sugeriu) por que eu preciso adicionar apenas uma referência e Eu posso chamar métodos de ambos os serviços.

Foi útil?

Solução

Tal como está, eu não acho que isso é possível, você vai precisar de 2 referências de serviço, pois ambos implementar contratos separados. Supondo que você tenha o controle do código de serviço, você poderia implementar uma solução alternativa onde você cria um invólucro de serviço para implementos ambos os contratos, apontando para os dois serviços separados. Isso permitirá que você tenha uma referência de serviço. Existe uma questão específica a respeito de porque você quer que eles ambos em um serviço em oposição a dois?

EDIT: Este Blog Artigo - Meineck.Net mostra como você pode configurar seus serviços para conseguir o que você está depois, mas, novamente, é praticamente uma em torno do trabalho. Boa sorte.

Outras dicas

Um Serviço de Referência = Contrato de Serviço Um

O serviço Windows tem muitos serviços dentro dela, cada um com o seu próprio contrato.

Há, porém, nada que você parar a criação de um único contrato que contém a funcionalidade de todos os serviços, em seguida, criar uma classe que implementa o contrato, mas é simplesmente uma passagem através da camada para as outras servcies.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top