2011-03-16 4 views
1

외부 용 웹 팜에서 내부 용 WCF 서비스를 설정하려고합니다. (내부적으로 웹 팜이 없으며이 서비스가 장애 조치 및로드 균형 조정을 필요로합니다).방법? WCF customBinding over Https

요구 사항 :

  • PerSession 이와 상태, 우리는 각각의 세션에 변수 데이터를 보존 할 수있는 서비스를 필요로하는.
  • HTTPS. 인터넷 검색을 많이 읽은 후에 customBinding을 작성해야했지만, 올바른지 확실하지 않았습니다.
  • 매개 변수 중 하나가 최대 5MB가 될 수있는 byte [] 배열이기 때문에 메시지 크기가 커집니다.
  • 클라이언트 측 app.config를 수동으로 편집 할 필요가 없습니다. 즉, 서비스 참조를 추가하기 만하면 개발자가 필요하며 app.config를 간신히 변경하지 않고 객체 사용을 시작합니다.

참고 : 이전에이 서비스가 (wsHttpBinding을 사용하여) HTTP에서 올바르게 작동하도록했습니다. 나는 또한 HTTPS 하에서 작동 시켰지만 PerSession 상태를 지원하지 않았고 각 함수 호출에서 내부 변수 값을 잃어 버렸다.

나는 현재 테스트 장치에서이 오류를 받고 있어요 :

ServiceModel은 서비스 클라이언트 구성 섹션에서 계약 'AppMonitor.IAppMonitorWcfService'를 참조하는 기본 끝점 요소를 찾을 수 없습니다. 이는 응용 프로그램에 대한 구성 파일이 없거나이 계약에 일치하는 엔드 포인트 요소가 클라이언트 요소에 없기 때. 일 수 있습니다.

참고 :이 오류는 서비스 참조에서 직접 참조되는 WCF 서비스가있는 테스트 장치 EXE에서 발생합니다. 이것은 exe가 다른 객체를 참조하는 문제가 아니며, 그 객체는 내가 읽은 WCF 서비스를 참조합니다.

URL을 탐색 할 때 WSDL이 올바르게 표시됩니다. 나는의 app.config이있는 wsHttpBinding을 보여주는 이유는 확실하지 않다

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="CustomBinding_IAppMonitorWcfService" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="true" /> 
        <security mode="Transport"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" 
          establishSecurityContext="true" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client /> 
    </system.serviceModel> 
</configuration> 

:

<system.serviceModel> 
    <services> 
     <service name="AppMonitor.AppMonitorWcfService" behaviorConfiguration="ServiceBehavior"> 
     <endpoint address="" binding="customBinding" bindingConfiguration="EnablePerSessionUnderHttps" contract="AppMonitor.IAppMonitorWcfService"/> 
     <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 

    <bindings> 
     <customBinding> 
     <binding name="EnablePerSessionUnderHttps" maxReceivedMessageSize="5242880"> 
      <reliableSession ordered="true"/> 
      <textMessageEncoding> 
      <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </textMessageEncoding> 
      <httpsTransport authenticationScheme="Anonymous" requireClientCertificate="false"/> 
     </binding> 
     </customBinding> 
    </bindings> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

EXE의의 App.config (서비스 참조를 추가 할 때 자동 생성)의 Web.config

? 이게 customBinding일까요? 이 서비스는 수십 명의 개발자가 사용하기 때문에 app.config를 편집하고 싶지 않으며 서비스 참조를 추가 할 수 있기를 원합니다.

VS2008, .NET 3.51 사용. 서버가 IIS7, Windows Server 2008, 필요한 경우 확인할 수 있다고 생각합니다.

답변

0

여러분의 서비스에 대해 주소을 정의하지 않았다는 것이 문제입니다. 엔드 포인트의 ABC를 기억하십시오 : Address-Binding-Contract.

.svc 파일에 의해 거의 다스리고 IIS에서 파일을 찾을 수있는 서비스의 주소를 정의해야합니다. 해당 .svc 파일의 URL이 무엇이든 관계없이 정의한 주소 (빈 문자열)를 추가 한 다음 맨 위에 추가합니다. 그래서 나는 myservice를 넣을 것입니다.루트에 SVC 파일, 그것은 ServiceAddress="" 그래서 URL이 https://localhost/myservice.svc/ 귀하의 경우

https://localhost/myservice.svc/<ServiceAddress>

된다.

자세한 내용은 here을 참조하십시오.

+0

web.config에 주소가 있으므로 클라이언트 측 app.config에서 주소가 누락되었다고 가정합니다. 왜 그것이 누락 되었습니까? 내가 한 것은 동일한 URL을 입력하고 (WSDL 페이지를 탐색하고 볼 수 있음), Add Service Reference 옵션으로 서비스를 찾았습니다. 그런 다음 NameSpace를 입력하고 Goed를 클릭하면 그랬습니다. 이것은 내가 과거에 WCF를 한 방법입니다. 모든 아이디어가 app.config에 주소를 넣지 않은 이유는 무엇입니까? – AaronC

+0

그래, 명백한 문제는 클라이언트 쪽 app.config에 태그 아래에 정보가 없다는 것입니다. 알고 있어야하는 이유는 "서비스 참조 추가"를 수행 할 때 이것이 자동으로 채워지지 않은 이유입니다. b) 어떻게 자동으로 채워지나요? c) 또는 web.config 바인딩이나 뭔가를 변경하여 자동으로 채울 수 있습니다. 서비스를 사용하는 개발자는이 서비스를 사용하기 위해 app.config 파일을 편집 할 필요가 없습니다. 서비스 참조 추가에 URL을 입력 한 다음 서비스를 사용하기 만하면됩니다. 당신의 도움을 주셔서 감사합니다! – AaronC

+0

참고 :이 기사에서 customBinding을 만들어야한다는 것을 알았습니다. http://stackoverflow.com/questions/4396961/why-wcf-instancecontextmode-persession-is-not-working-over-https. 또한 클라이언트 app.config에 채워지는 종단점 세부 정보가있는 문제가 바인딩 문제 (해결책이 제공되지 않음) 때문이라는 것도 읽었습니다. 대신 (또는 다른?) wsHttpBinding을 사용할 수 있으며 여전히 https를 통해 PerSession 컨텍스트가 있습니까? – AaronC