문제

VSTS 2008 + C# + .NET 3.0을 사용하고 있습니다. 자체 주최 WCF 서비스를 사용하고 있습니다. 다음 진술을 실행할 때 다음과 같은 "바인딩이 찾을 수 없음"오류가 있습니다. 전체 app.config 파일, 어떤 아이디어가 잘못 되었습니까?

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

에러 메시지:

바인딩 메타 데이터 exchangehttpbinding을 사용하여 엔드 포인트의 체계 HTTP와 일치하는 기본 주소를 찾을 수 없습니다. 등록 된 기본 주소 체계는 [HTTPS]입니다.

전체 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>
도움이 되었습니까?

해결책

서비스의 기본 주소는 "https : //"를 정의하지만 MEX 주소는 "http"입니다.

서비스가 https : //를 사용하려면 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>

마크

다른 팁

이중 점수로 갈 수 있습니까? :)

WS-HTTP를 사용하면 HTTPS 프로토콜에 바인딩되므로 올바른 MEX 바인딩을 사용해야합니다.

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

나는 의견으로 질문을했다 marc_s 대답

http와 https에 대해 별도의 엔드 포인트로 iMetadataexChange를 가질 수 있습니까?

marc_s가 대답했습니다

http : //에 대한 두 번째 기본 주소를 정의하고 HTTP MEX 엔드 포인트에 사용할 수 있어야합니다.

따라서 솔루션은 동일한 주소 = "Mex"와 함께 여러 엔드 포인트를 선언하는 것입니다. 다른 다음과 같은 바인딩

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

최근에 나는 테스트에서 MEX를 활성화하고 라이브에서 비활성화하는 데 사용할 수있는 하나의 구성 스위치를 사용하는 것이 더 쉽다는 것을 알았습니다.

에서http://msdn.microsoft.com/en-us/library/aa395224.aspx

ServiceHostFactory 클래스를 사용하여 인터넷 정보 서비스 (ServiceMetAdatabeHavior를 추가하는 IIS 사용자 정의 서비스 호스트 (IIS 사용자 정의 서비스 호스트)에서이 동작이 서비스의 구성 파일에 명시 적으로 추가되지 않더라도 서비스 호스트에서 파생 된 사용자 정의를 만들 수 있습니다.

메타 데이터 게시를 한 번만 활성화 한 다음 여러 서비스에서 해당 코드를 재사용하는 명령 코드를 작성하십시오. 이는 ServiceHost에서 파생 된 새로운 클래스를 만들고 ApplyConfiguration () 메소드를 무시하여 메타 데이터 게시 동작을 필수적으로 추가함으로써 달성됩니다.

예제 코드 사용자 정의 서비스 호스트 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");
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top