mex erro obrigatório em WCF
-
06-07-2019 - |
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>
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");
}
}