웹 응용 프로그램의 일부 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가 필요하다고 생각하는 이유는 무엇입니까? 이 매우 구체적인 질문에 대한
HTTP 및 HTTPS에 대한 별도의 baseAddress를 정의하는 것이 올바르지 않지만 작동하지 않는다고 말하는 것은 찾을 수 없습니다. 설정을 [이 SO 질문 & 답변] (http://stackoverflow.com/questions/3056730/configuring-wcf-4-with-routing-global-asax-for-both-http-https- 엔드 포인트)를 사용하여 구성이 올바른지 확인하십시오. 또한 다양한 환경 사이에서 IIS의 호스트 헤더간에 일부 차이가있을 수 있습니다 (SSL 작동을 위해). 클라이언트 측에서는 호스트 환경에 따라 호스트 파일에 항목이 다를 수 있습니다. –
별도의 기본 주소는 실험이므로 문제가 해결되지 않았기 때문에 제거됩니다. 바인딩에 지정된 호스트 헤더가 없습니다. 호스트 파일에 대해 말하는 것은 흥미 롭습니다. 그게 어떻게 중요 할 수 있니? 호스트 파일이 사용되며 문제가 될 수 있다고 생각되지만 실제로는 볼 수 없습니다. –
클라이언트 측에서는 통합 시스템에 프로덕션과 유사한 호스트 파일이 있지만 교육 환경 시스템이 다른 경우 비슷한 문제가 발생할 수 있습니다. 또한 hosts 파일에는 mySecureDomain.org와 같은 컴퓨터 홈 주소 (127.0.0.1)를 127.0.0.1로 바꾸는 항목이 있으므로 SSL 인증서의 도메인이 여전히 HTTPS를 사용하도록 설정됩니다. –