2012-10-08 1 views
0

웹 응용 프로그램의 일부 Silverlight 코드에서 사용하는 WCF 서비스가 있습니다. 다음과 같은 ASP.NET 라우팅 기능을 사용합니다.WCF는 ASP.NET 라우팅에서 webHttpBinding에 사용되는 끝점 주소를 어떻게 결정합니까?

private void RegisterRoutes() 
{ 
    var factory = new WebServiceHostFactory(); 
    RouteTable.Routes.Add(new ServiceRoute("Service", factory, typeof(ServiceService))); 
} 

이 기능은 현재 프로덕션 환경에서 작동합니다. 다른 환경에

, 나는 예외를

System.InvalidOperationException를 얻을 : 기본 주소를 찾을 수 없습니다 그 WebHttpBinding이라는 바인딩에 엔드 포인트에 대한 경기 방식에 http가. 등록 된 기본 주소 체계는 [https]입니다.

통합 환경 및 교육 환경에 정확히 동일한 코드를 배포했습니다. 통합에서는 작동하지만 교육에서는 실패합니다. 두 환경 모두 동일한 버전의 IIS 7.5를 사용하여 동일한 버전의 Windows Server 2008 R2 Enterprise를 실행합니다. 둘 다 IIS (모든 IP 주소의 포트 443 및 80)에서 구성된 동일한 바인딩을 사용합니다.

나는 코드를 구현했으며 작동 할 때 http 및 https가 서비스에서 사용되고 있음을 알 수 있습니다. 실패하면 https 만 사용됩니다. web.config는 두 시스템간에 동일합니다.

일반적으로 IIS 응용 프로그램에서 호스팅되는 서비스의 경우 WCF는 IIS의 바인딩 정보를 사용한다는 것을 알고 있습니다. 이 경우 ASP.NET 라우팅 기능이 사용됩니다.

WCF는 사용할 기본 주소를 어떻게 결정합니까?


업데이트는 :

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
    <diagnostics> 
     <endToEndTracing propagateActivity="true" activityTracing="true" 
     messageFlowTracing="true" /> 
    </diagnostics> 
    <extensions> 
     <behaviorExtensions> 
     <add name="silverlightFaults" type="Services.SilverlightFaultBehavior, Services" /> 
     </behaviorExtensions> 
    </extensions> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="SilverlightRESTBehavior"> 
      <webHttp helpEnabled="false" automaticFormatSelectionEnabled="false" 
        defaultOutgoingResponseFormat="Json" faultExceptionEnabled="false" /> 
      <silverlightFaults /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service behaviorConfiguration="ServiceBehavior" name="Services.SpendAnalysisService"> 
     <endpoint address="" behaviorConfiguration="SilverlightRESTBehavior" 
      binding="webHttpBinding" contract="Services.SpendAnalysisService" /> 
     <host> <!-- Added: not in the original--> 
      <baseAddresses> 
      <add baseAddress="http://" /> 
      <add baseAddress="https://" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <standardEndpoints> 
     <webHttpEndpoint> 
     <standardEndpoint name="d" helpEnabled="false" defaultOutgoingResponseFormat="Json" 
      automaticFormatSelectionEnabled="false" faultExceptionEnabled="false" /> 
     </webHttpEndpoint> 
    </standardEndpoints> 
    </system.serviceModel> 
</configuration> 

편집 :

또 다른 힌트 : "SSL 필요"가 IIS에서 설정 여기에 우리의 web.config 파일의 발췌 한 것입니다 교육 환경에서는 통합 환경에서 정리되었습니다. 교육 환경에서이를 지우면 서버 측 예외가 발생하지 않습니다. 이제 두 환경의 WCF 로그는 http 및 https 주소가 모두 고려되고 있음을 보여줍니다.

질문은 다음과 같습니다. 요청이 https로 도착하면 WCF가 http가 필요하다고 생각하는 이유는 무엇입니까? 이 매우 구체적인 질문에 대한

+0

HTTP 및 HTTPS에 대한 별도의 baseAddress를 정의하는 것이 올바르지 않지만 작동하지 않는다고 말하는 것은 찾을 수 없습니다. 설정을 [이 SO 질문 & 답변] (http://stackoverflow.com/questions/3056730/configuring-wcf-4-with-routing-global-asax-for-both-http-https- 엔드 포인트)를 사용하여 구성이 올바른지 확인하십시오. 또한 다양한 환경 사이에서 IIS의 호스트 헤더간에 일부 차이가있을 수 있습니다 (SSL 작동을 위해). 클라이언트 측에서는 호스트 환경에 따라 호스트 파일에 항목이 다를 수 있습니다. –

+0

별도의 기본 주소는 실험이므로 문제가 해결되지 않았기 때문에 제거됩니다. 바인딩에 지정된 호스트 헤더가 없습니다. 호스트 파일에 대해 말하는 것은 흥미 롭습니다. 그게 어떻게 중요 할 수 있니? 호스트 파일이 사용되며 문제가 될 수 있다고 생각되지만 실제로는 볼 수 없습니다. –

+0

클라이언트 측에서는 통합 시스템에 프로덕션과 유사한 호스트 파일이 있지만 교육 환경 시스템이 다른 경우 비슷한 문제가 발생할 수 있습니다. 또한 hosts 파일에는 mySecureDomain.org와 같은 컴퓨터 홈 주소 (127.0.0.1)를 127.0.0.1로 바꾸는 항목이 있으므로 SSL 인증서의 도메인이 여전히 HTTPS를 사용하도록 설정됩니다. –

답변

0

대답은 간단하다 :

실패한 사이트는 httphttps 모두 IIS 바인딩을했다. 그러나 IIS의 "SSL 설정"에서 "SSL 필요"플래그가 설정되었습니다. 이것은 사이트가 SSL을 통해 액세스하기위한 것이기 때문에 (로드 밸런서가 올바르게 설정되면) 의미가 있습니다. 이로 인해 WCF는 기본 주소 검색에서 http 체계를 제외 시켰습니다. "Require SSL"플래그를 지우면 문제가 해결되었습니다. 왜 세계에서 WCF도 전체 요청 이후에 대한 http 생각하고 모든 관련 요청이 https 이상에서 오는 것입니다 : 내가 만든 재생 장치를 일단

나머지 질문은 아마도 Microsoft 지원에 대한 질문?

이 질문을 좀 더 일반적으로 다시 작성하여 답변이 다른 사람에게 도움이 될 수 있기를 바랍니다. 지금 당장은이 질문을 "너무 지역화 된"것으로 생각합니다.