błąd wiązania mex w WCF
Używam VSTS 2008 + C# +. Net 3.0. Korzystam z hostowanej przez siebie usługi WCF. Podczas wykonywania następującej instrukcji występuje następujący błąd "nie znaleziono powiązania". Opublikowałem całą aplikację.plik konfiguracyjny, jakieś pomysły co jest nie tak?
ServiceHost host = new ServiceHost(typeof(MyWCFService));
Komunikat o błędzie:
Nie można znaleźć adresu bazowego, który pasuje do schematu http dla punkt końcowy z wiążącym MetadataExchangeHttpBinding. Zarejestrowana baza Schematy adresowe to [https].
Pełne app.config:
<?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>
3 answers
Adres bazowy dla Twojej usługi definiuje "HTTPS: / /" - ale twój adres mex to "HTTP".
Jeśli chcesz, aby Twoja usługa używała https://, musisz również użyć mexHttpsBinding :
<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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 11:13:13
Czy Mogę dostać Podwójny wynik? :)
Ponieważ używasz WS-Http, jesteś związany z protokołem HTTPS, więc musisz użyć poprawnego powiązania MEX;
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 08:59:43
Zadałem pytanie w komentarzu do Marc_s odpowiedź
Czy możliwe jest posiadanie IMetadataExchange dla http i https jako oddzielne punkty końcowe?
Marc_s odpowiedział
Powinieneś być w stanie zdefiniować drugi adres bazowy, dla http:// i użyj tego dla punktu końcowego HTTP mex.
Więc rozwiązaniem jest zadeklarowanie wielu punktów końcowych z tym samym adresem = " mex " i różnych wiązań, takich jak po
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
<endpoint contract="IMetadataExchange" binding="mexHttpsBinding" address="mex"/>
Ostatnio odkryłem, że łatwiej jest mieć jeden przełącznik konfiguracji, który może być używany do włączania MEX na test i wyłączania NA ŻYWO.
Od http://msdn.microsoft.com/en-us/library/aa395224.aspx
Możliwe jest użycie klasy ServiceHostFactory do utworzenia niestandardowego pochodzące z usług serwisowych w internetowych serwisach informacyjnych (IIS Custom ServiceHost, który dodaje ServiceMetadataBehavior, (który umożliwia publikowanie metadanych), nawet jeśli takie zachowanie nie jest jawne dodany w pliku konfiguracyjnym serwisu.
Napisać kod imperatywny, który umożliwia publikowanie metadanych raz i następnie ponownie użyj tego kodu w kilku różnych usługach. To jest realizowane poprzez stworzenie nowej klasy, która wywodzi się z ServiceHost i nadpisuje metodę ApplyConfiguration (), aby bezwzględnie dodać zachowanie publikowania metadanych.
Przykładowy kod z Custom Service Host MSDN article
//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");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:45