Pergunta

Estou usando o VSTS 2008 + C # + .NET 3.0. Eu estou usando um serviço WCF auto-hospedado. Ao executar a seguinte declaração, há o seguinte "obrigatório não encontrado" erro. Tenho postado todo o meu arquivo app.config, todas as idéias que está errado?

ServiceHost host = new ServiceHost(typeof(MyWCFService));

Mensagem de erro:

Não foi possível encontrar um endereço base que corresponde esquema de http para o ponto final com MetadataExchangeHttpBinding ligação. base de Registered esquemas de endereço são [https].

app.config completa:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="MyBinding"
            closeTimeout="00:00:10"
            openTimeout="00:00:20"
            receiveTimeout="00:00:30"
            sendTimeout="00:00:40"
            bypassProxyOnLocal="false"
            transactionFlow="false"
            hostNameComparisonMode="WeakWildcard"
            maxReceivedMessageSize="100000000"
            messageEncoding="Mtom"
            proxyAddress="http://foo/bar"
            textEncoding="utf-16"
            useDefaultWebProxy="false">
          <reliableSession ordered="false"
               inactivityTimeout="00:02:00"
               enabled="true" />
          <security mode="Transport">
            <transport clientCredentialType="Digest"
               proxyCredentialType="None"
               realm="someRealm" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="MyWCFService"
                behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyBinding" contract="IMyService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mexServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
Foi útil?

Solução

O endereço base para os seus define serviço "https: //" -., Mas o seu endereço de mex é "HTTP"

Se você quiser que o seu serviço para usar https: //, você vai precisar usar o mexHttpsBinding , assim:

<services>
    <service name="MyWCFService" behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" 
                binding="wsHttpBinding" 
                bindingConfiguration="MyBinding" 
                contract="IMyService" 
        />
        <endpoint address="mex" 
                binding="mexHttpsBinding" 
                contract="IMetadataExchange" 
        />
    </service>
</services>

Marc

Outras dicas

Posso ir para a pontuação dupla? :)

Como você está usando WS-Http você está ligando a um protocolo HTTPS, então você precisa usar o MEX correta vinculativo;

<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />

Eu tenho uma pergunta em um comentário para marc_s resposta

É possível ter IMetadataExchange para HTTP e HTTPS como endpoints separados?

marc_s respondeu

Você deve ser capaz de definir um segundo endereço de base, para http: // e uso que para o http mex endpoint.

Assim solução é declarar vários pontos de extremidade com o mesmo endereço = "mex" e diferente ligações como o seguinte

<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />  
<endpoint contract="IMetadataExchange" binding="mexHttpsBinding" address="mex"/>

Recentemente eu descobri que é mais fácil ter uma opção de configuração que pode ser usado para permitir MEX em teste e desabilitar no Live.

A partir http://msdn.microsoft.com/en-us/ biblioteca / aa395224.aspx

É possível usar a classe ServiceHostFactory para criar um personalizado derivada de ServiceHost no Internet Information Services (ServiceHost personalizado IIS que adiciona a ServiceMetadataBehavior, (que permite a publicação de metadados), mesmo que este comportamento não é explicitamente adicionada no arquivo de configuração do serviço.

Escreva o código imperativo que permite a publicação de metadados de uma vez em seguida, reutilizar esse código em vários serviços diferentes. Isto é conseguido através da criação de uma nova classe que deriva de ServiceHost e Substitui o método ApplyConfiguration () para adicionar imperativamente o metadados comportamento publicação.

Exemplo de código de Personalizado de Serviços do Host artigo MSDN

//Add a metadata endpoint at each base address
//using the "/mex" addressing convention
foreach (Uri baseAddress in this.BaseAddresses)
{
    if (baseAddress.Scheme == Uri.UriSchemeHttp)
    {
        mexBehavior.HttpGetEnabled = true;
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexHttpBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeHttps)
    {
        mexBehavior.HttpsGetEnabled = true;
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexHttpsBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeNetPipe)
    {
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexNamedPipeBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeNetTcp)
    {
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexTcpBinding(),
                                "mex");
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top