2011-02-02 5 views
14

WCF 예제의 대부분은 WCF 클라이언트와 서버를 구성하는 방법을 보여줍니다. 이제 구성을 약간 다르게하면 어떻게됩니까? 내 말은, 누가 최종적인 말을 했니? WCF 클라이언트와 서버를 설정할 때 구성 파일이 얼마나 동기화되어 있어야합니까?

이의 예를 들어이 클라이언트 구성을 보자 :

<configuration> 
<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_ISampleService" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:01: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="false" /> 
       <security mode="Message"> 
        <transport clientCredentialType="None" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="Windows" negotiateServiceCredential="true" 
         algorithmSuite="Default" establishSecurityContext="true" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:8080/SampleService" binding="wsHttpBinding" 
      bindingConfiguration="WSHttpBinding_ISampleService" contract="ISampleService" 
      name="WSHttpBinding_ISampleService"> 
     </endpoint> 
    </client> 
</system.serviceModel> 
보통 서버 측이 동일한이 노출 된 서버에 구성된 바인딩해야합니다.

하지만 서버 측에서 openTimeout = 00:00:30으로 정의하면 어떻게됩니까? 타임 아웃은 어떻게됩니까? 누가 이겼어? 다른 모든 매개 변수에 대해 동일한 질문을합니다.

모든 것은 구성의 각 요소 (바인딩, 클라이언트, 서비스, 동작 등) 및 모든 세부 사항에 대해 어떤 매개 변수가 필요하며 어떤면 (클라이언트 또는 서버)?

서버 측의 모든 시간 초과 매개 변수로 전체 바인딩을 정의 할 수 있으며 클라이언트 측에서는 서버의 모든 매개 변수가 허용되도록 최소한의 필수 구성 만 지정하면됩니다. 그러나 이제는 서버의 깊이 구성이 더 깊다는 것을 고려할 때 클라이언트의 최소 필수 매개 변수는 무엇입니까?

구성의 각 요소에 대한 매개 변수 (바인딩, 서비스, 클라이언트/끝점 및 동작)와 관련하여 WCF를 사용하여 클라이언트 및 서버를 구성 할 때 가장 좋은 방법은 무엇입니까?

WCF가 클라이언트와 서버간에 충돌 매개 변수를 정의 할 때 어떻게 처리합니까?

+1

내가 대답을 찾고 있는데요 : 대부분의 시간은 서버 구성이 모든 구성의 일부이며 일부 속성은 클라이언트에서 변경할 수 있습니다. 측면. 아니면 그런 식으로. 질문 텍스트를 변경하여 도움을 받으시면 감사하겠습니다. – Alex

+0

몇 가지 다른 구성으로 놀고 있어요. 예를 들어 httpTransport 요소의 maxReceivedMessageSize가 다음과 같이 작동하는 것 같습니다. 서버와 클라이언트에서 정의 할 수 있지만 기본 값 (한 번에 65k) 사용. 그게 어떻게 도움이됩니까? 서버가 어떻게 구성되었는지 알고 클라이언트에서 같은 값을 복사하지 않으면 원하는 동작을 얻을 수 없습니다. 이 시행 착오는 나를 미치게 만듭니다! 이 질문을 WCF 구성의 문제점을 해결할 수있는 간단한 문장으로 쓸 수 있었으면 좋겠습니다. – Alex

+0

내 최신 업데이트보기 - 예, 때때로 WCF 구성이 실제로 시행 착오입니다 - 다음 번에 알게 될 것이며 시간이 지남에 따라 WCF 환경을 구축 할 것입니다. 그것은 큰 짐승입니다. 모든 것을 알기 위해 시도하지 마십시오. 당신은하지 않을 것입니다. ... –

답변

14

이전 의견에 대한 마지막 의견에 대한 귀하의 요청을 해결하기 위해 주어진 서비스에 대해 서버 측 및 클라이언트 측 구성을 어떻게 작성 (및 수정)하는지에 대한 접근 방식을 고안했습니다. 이것은 내가 읽은 이론 (책, 블로그), Juval Lowy의 WCF Master Class에서 배운 것들과 몇 가지 대규모 서비스 구현 프로젝트에 대한 실용적인 경험에 기반합니다. 이것은 한 곳에서, 웹 또는 책 .... 그래서 여기 그것은 간다 :

나는 기본적으로 처음부터 시작했다. 서비스를 먼저 생각해보십시오.

  • 서비스가 거주하는 주소는 무엇입니까?
  • 어떤 바인딩을 지원 하시겠습니까?

간단한 시나리오 : 단일 서비스, 단일 엔드 포인트,은 BasicHttpBinding 모든 기본값

서비스 설정 : 다음 오직 무언가를 변경

<system.serviceModel> 
    <client name="Default"> 
     <endpoint name="Default" 
      address="http://YourServer/SomeVirtualDirectory/YourService.svc" 
      binding="basicHttpBinding" 
      contract="YourClientProxyNamespace.IYourServiceContract" /> 
    </client> 
</system.serviceModel> 

: 클라이언트 설정을 해당

<system.serviceModel> 
    <services> 
     <service name="YourNamespace.YourServiceClass"> 
     <endpoint name="Default" 
      address="http://YourServer/SomeVirtualDirectory/YourService.svc" 
      binding="basicHttpBinding" 
      contract="YourNamespace.IYourServiceContract" /> 
     </service> 
    </services> 
</system.serviceModel> 

당신이 정말로해야한다면! 그리고 무엇보다도 : 절대적으로 Visual Studio (서비스 참조 추가) 또는 svcutil.exe이 사용자의 설정을 망칠 수 있습니다! 눈의 사과처럼 보호하십시오!

다음 : 예 : 데이터 전송에 기본 시간 초과 인 1 분이 허용하는 것보다 더 많은 시간이 걸리면 서비스 측과 클라이언트 측 모두에서 단일 설정을 변경하십시오. 이를 위해 사용자 정의 바인딩 구성을 정의하고 엔드 포인트에서 해당 참조를 참조하십시오 (). 그 밖의 모든 것을 기본값으로 둡니다. 절대적으로 (그리고 당신이하고있는 일과 그 일을하는 이유를 알아야 만하지 않는 한) 아무것도 바꾸지 마십시오.

마음 당신에게 -이 excellent blog post를 참조 (에 오는 전체 메시지에 허용되는 시간이 MSDN forum thread에 대한 클라이언트 (전체 메시지가 전송 될 때까지 허용 된 시간)에 sendTimeout은 서버에 receiveTimeout에 해당합니다 자세한 내용은)

서비스 설정 :

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="ExtendedTimeout" 
       receiveTimeout="00:05:00" /> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service name="YourNamespace.YourServiceClass"> 
     <endpoint name="Default" 
      address="http://YourServer/SomeVirtualDirectory/YourService.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="ExtendedTimeout" 
      contract="YourNamespace.IYourServiceContract" /> 
     </service> 
    </services> 
    </system.serviceModel> 

해당 클라이언트 설정 :

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="ExtendedTimeout" 
        sendTimeout="00:05:00" /> 
     </basicHttpBinding> 
    </bindings> 
    <client name="Default"> 
     <endpoint name="Default" 
      address="http://YourServer/SomeVirtualDirectory/YourService.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="ExtendedTimeout" 
      contract="YourClientProxyNamespace.IYourServiceContract" /> 
    </client> 
</system.serviceModel> 

서비스 측면의 여러 끝점 또는 bypassProxyOnLocal과 같은 로컬 설정과 같은 다른 변경 사항이 필요하므로 신중하게 단계별로 수동 설정하고 구성을 전체 서비스의 필수 요소로 간주하십시오. 그것을 관리, 버전 제어 등에 넣어.

+1

그게 내가 찾고 있던 바로 그거야! 구성 팁이 여기 저기에 퍼져 있다는 사실을 알았습니다. 그게 정확히 내가 원하는 것입니다. 클라이언트/서버를 구성하는 방법에 대한 몇 가지 일반적인 지침이있는 WCF 경험이 많은 사람입니다. SendTimeout에 대한 이러한 종류의 통찰력은 receiveTimeout으로 변환되어 필수적이며 MSDN에는 이러한 종류의 특전에 대한 전반적인 문서가 없습니다. 나는 사람들이 다른 대답으로 공헌 할 수 있도록 하루나 이틀 만 줄 것이지만 나에게 승자처럼 들릴 것입니다. 고맙습니다. @ marc_s! – Alex

+0

''- 네임 스페이스를 서비스 이름에 추가하면 서비스가 실패하게됩니다. 네임 스페이스를 제거하면 서비스를 시작할 수 있습니다. – greenoldman

2

결국 클라이언트와 서버에서 주어진 시간 초과가 거의 동일하고 두 값이 일치하지 않으면 짧은 시간 초과가 서버에 정의되어 있는지 또는 서버에 정의되어 있는지에 관계없이 "승리"합니다. 고객. 주소, 바인딩 등 해야 경기와 같은

대부분의 다른 것들 - 그렇지 않으면 통신이 가능하지 않습니다 ...

서버 설정의 이점은 하나를 위해 여러 엔드 포인트를 정의 할 수 있다는 것입니다 서비스를 다른 옵션 및 바인딩과 함께 제공 할 수 있습니다. 그러면 클라이언트는 연결할 엔드 포인트를 "선택하여 선택"할 수 있습니다.

하지만 일단 연결에 하나의 서비스 종점이 선택되면 바인딩, 프로토콜, 보안, 안정성 등과 같은 설정이 정확히 일치해야합니다.

또한 Visual Studio Add Service Reference 또는 svcutil.exe 명령 줄 도구가 생성하는 기본 구성은 모두 심각한 결과를 초래합니다. 즉, 기본값을 모두 반영하는 설정이 너무 많아서 무엇이 실제로 필요한지 알기 어렵고 그렇지 않다.

DotNet Rocks TV 쇼 # 122 : Miguel Castro on Extreme WCF 미구엘이 수동으로 설정을 손쉽게 만드는 것이 얼마나 쉬운 지 보여주는 것이 좋습니다. 그런 다음 여러분이 무엇을 가지고 있는지 완전히 이해할 수 있습니다. 하기! 추천!

+0

그건 의미가 있지만 다른 매개 변수는 어떨까요? bypassProxyOnLocal? transactionFlow? allowCookies? "allowCookies"의 기본값이 true라고 가정 해 봅시다. 서버에서 false로 설정 한 다음 클라이언트에서 아무 말도하지 않는다면 어떻게됩니까? true (기본값) 또는 false (서버 구성)? – Alex

+0

@Alex : AllowCookies 또는 BypassProxyOnLocal은 내가 아는 한 클라이언트 측 설정 일 것입니다. 서버가 무언가를 설정할 수도 있지만 관련이 없습니다. 클라이언트에만 영향을 미칩니다 (서비스 참조 추가를 수행 할 때 일부 설정은 서버 측에서 가져 오지 않습니다). TransactionFlow는 ** 클라이언트와 서버 사이에 ** 일치해야만하는 또 다른 것입니다. 그렇지 않으면 작동하지 않을 것입니다. –

+0

@marc_s 물론, 그룹별로 매개 변수를 설명하는 문서가 있습니까? 클라이언트 전용, 서버 필수 등과 같이? 항상이 추측 게임을 계속하는 것이 좋습니다. 나는 모든 매개 변수를 마음으로 알지 못한다. 내가 어디로 가는지 알 겠어? – Alex

관련 문제