WCF, 메타 데이터 및 BIGIP- WSDL 항목에 대한 올바른 URL을 강요 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/634522

  •  10-07-2019
  •  | 
  •  

문제

우리는 Servera에서 호스팅 된 WCF 서비스를 보유하고 있으며, 이는 인터넷에 액세스 할 수없는 서버이며 Internet 비 인터넷 라우팅 가능한 IP 주소가 있습니다.

이 서비스는 SSL 암호화 및 암호 해독을 처리하고 암호화되지 않은 요청을 Servera로 전달하는 BigIP에 의해 정면으로 전환됩니다 (현재로드 밸런싱을 수행하지는 않지만 향후 특정 포트에서 추가 될 가능성이 높습니다).

그 의미는 우리의 고객이 https://www.ourdomain.com/serviceurl 그리고 우리의 서비스에 도달 할 것입니다 http : // severa : 85/serviceurl BIGIP 장치를 통해;

우리가 게시 된 WSDL을 탐색 할 때 https://www.ourdomain.com/serviceurl WSDL에 포함 된 모든 주소는 http : // severa : 85/serviceurl 기본 주소

우리는 호스트 헤더 설정을 사용하여 도메인을 설정할 수 있다는 것을 알았지 만 문제는 도메인을 정렬하지만 여전히 잘못된 체계를 사용한다는 것입니다. http://www.ourdomain.com/serviceurl 우리는 그것을 https가 필요합니다.

또한 - 해당 서버에 다른 서비스 (ASMX 기반)가 호스팅되어 있으므로 호스트 헤더를 설정하는 몇 가지 문제가 있었으므로 서버에서 다른 사이트를 만들 수 있다고 생각했습니다 (예 : 포트 82). 그것에 호스트 헤더; 이제 HTTP/HTTPS 문제 위에 WSDL에는 모든 URL에 포트 번호가 포함되어 있기 때문에 BigIP가 포트 443 (SSL 용)에서 작동하는 문제가 있습니다.

호스트 헤더를 구현하는 것보다 더 유연한 솔루션이 있습니까? 이상적으로는 유연성과 지원의 용이성을 유지해야합니다.

도움을 주셔서 감사합니다…

도움이 되었습니까?

해결책

이것은 본질적으로 전체 답변을 제공하기위한 다수의 개별 솔루션을 포함하는 다중 부분 문제입니다. 본질적으로 F5 뒤에 앉아있는 데 3 가지 문제가 있습니다.

  1. 광고 된 서비스 엔드 포인트 호스트 이름.
  2. XSD에 대한 링크의 호스트 이름 : 데이터 계약을 설명하는 수입 스키마
  3. 설명하는 HTTP/HTTPS 문제.

찾은 것처럼 호스트 헤더를 변경하면 1과 2가 해결됩니다 (호스트 헤더 이외의 방식으로 접근 할 수 있지만 여기에 들어갈 필요는 없습니다). 숫자 3은 조금 더 까다 롭고 더 많은 코드가 필요합니다 (여기에 너무 많은 것을 덤프하기에는 너무 많음).

짧은 대답은 IconTractBehavior 및 Iwsdlexportextension을 모두 구현하는 계약 행동을 작성해야한다는 것입니다.

구현해야 할 중요한 비트는 iwsdlexportextension.exportendpoint입니다. 이 방법 내에서 모든 WSDLPORT 확장 기능을 반복해야하며 SOAPADDRESSBINDING 유형의 확장을 찾으면 HTTPS 프로토콜 지정자가 포함 된 새 URI로 교체해야합니다. 또한 XSD 가져 오기 주소 및 스키마 링크에 대해 유사한 비트를 수행해야합니다.

서비스가 WS 조정을 사용하는 경우 추가 주소를 처리하기 위해 유사한 작업을 수행해야합니다.

코드를 기반으로 CodePlex에서 사용할 수있는 wsdlextras 프로젝트에 글을 썼습니다.http://wcfextras.codeplex.com/). WSDLEXTRAS에 사용 된 방법은 추가해야 할 여분의 비트에 대한 훌륭한 기반을 제공합니다 (메모리에서 WS- 드레싱 비트를 다루지 않았다고 생각합니다). 보고 싶은 비트는 "비누 주소 위치 URL"입니다.

다른 팁

Mark Allanson 덕분에 Yossi Dahan과 동일한 시나리오가 있었는데 Wcfextras.dll 파일이 저를 위해 일했습니다.

1 단계. wcfextras.dll을 다운로드하십시오 (http://www.codeplex.com/wcfextras/).
2 단계. 프로젝트에 대한 참조를 추가하십시오.
STEP3. 샘플 서버 앱에서 제안 된대로 코드를 작성하는 데 시간을 낭비하지 마십시오.
단계 4. web.config를 열고 아래 코드를 넣습니다.

  <system.net>
     <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
     </settings>
  </system.net>


<system.serviceModel>
<services>
  <service behaviorConfiguration="ServiceBehaviorName" name="ServiceName">
    <endpoint address="" behaviorConfiguration="ServiceEndpointBehaviorName" binding="basicHttpBinding" contract="IServiceName">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="ServiceEndpointBehaviorName">
      <wsdlExtensions location="https://sslLoadBalancer/ServiceName.svc"/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviorName">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <!-- Declare that we have an extension called WSDL Extras-->
    <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>
        </system.serviceModel>


스텝 5. 또한이 URL로 참조를 추가하면 "https://sslLoadBalancer/ServiceName.svc" 그런 다음 작동하지 않으며 항상 다음과 같이 참조를 추가해야합니다. "https://sslLoadBalancer/ServiceName.svc?wsdl" 이렇게하면 응용 프로그램에 대한 참조를 추가 할 수 있습니다.

그게 IT ... 아직 작동하지 않으면 알려주세요. 전체 web.config 파일을 붙여 넣을 것입니다 ..

감사

기존 서비스 위에 SSL을 추가하는 경우 WCF 클라이언트의 바인딩 보안 모드에도 쉽게 재정의 할 수 있습니다.

WSDL의 경우 파일을 다운로드하고 원하는대로 URL을 변경하고 수동으로 파일로 게시하지 않겠습니까?

엔드 포인트의 주소 속성을 WSDL에 표시하려는 URL에 주소 속성을 설정 한 다음 실제 URI를 사용하여 엔드 포인트에 ListenUri 속성을 추가하면 트릭을 수행 할 수 있습니다.

테스트 페이지의 URL은 영향을받지 않지만 (예 : 여전히 ListenUri에 지정된 주소를 표시합니다) WSDL 내에서 올바른 URI가 설정됩니다 (주소에 지정된 것입니다.

그러나 가장 성가 시게서 - 질문을 게시 한 직후 이것을 시도했을 때, 나는 콘솔 앱에서 자체 호스팅 할 때만 IIS 내에서 일할 수 없었습니다. 오늘 나 자신을 확인하면서 나는 그것이 실제로 작동한다는 것을 알았습니다. 그래서 지금 나는 그것이 왜 전에 나에게 효과가 없었는지 잘 모르겠습니다.

우리가 그 중에 한 일은 WSDL에 필요한 주소를 구성에서 바꾸는 서비스 설명을 변경 한 간단한 사용자 정의 동작입니다. 분명히 그에 대한 지원이 내장되어 있다면 훨씬 나아 졌기 때문에 다음 주에 더 자세히 살펴보기 위해 희망을 갖게 될 것입니다.

서비스 클래스에 속성을 추가합니다.

<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>

이를 통해 클라이언트가 https : //로서 서비스를 해결할 수 있지만 http : // .....

서비스 호스트의 web.config에서 엔드 포인트 요소는 클라이언트가 사용할 공개 URL 인 주소 속성에 절대 URL이 있어야합니다. 동일한 엔드 포인트 요소에서 ListenUri 속성을 서비스 호스트가 듣는 절대 URL로 설정하십시오. 호스트가 듣고있는 기본 절대 URI를 결정하는 방법은 서비스가 호스팅되는 물리적 서버를 가리키는 클라이언트 응용 프로그램에 서비스 참조를 추가하는 것입니다. 클라이언트의 web.config에는 서비스에 대한 주소가 있습니다. 그런 다음 호스트 web.config의 ListenUri 속성으로 복사합니다.

서비스 동작 구성에서 속성 httpgetenabled = true가있는 요소 ServiceMetAdata를 추가합니다.

그래서 당신은 다음과 같은 것을 가질 것입니다.

<serviceBehaviors>
  <behavior name="myBehavior">
    <serviceMetadata httpGetEnabled="true" />
  </behavior
</serviceBehaviors>
...
<services>
  <service name="NamespaceQualifiedServiceClass" behavior="myBehavior" >
    <endpoint address="https://www.sslloadbalancer.com" binding="someBinding" contract="IMyServiceInterface" listenUri="http://www.servicehost.com" ...  />
  </service>
</services>

이것이 메시지 보안 또는 전송 보안과 함께 작동하는지 확실하지 않습니다. 이 특정 응용 프로그램의 경우 자격 증명이 데이터 콘텐츠의 일부로 전달되었으므로 Basichttpbinding 보안 모드 = 없음. 전송이 안전하기 때문에 (SSL로드 밸런서에) 보안 문제는 없었습니다.

ListenUri 속성을 비워 두는 것도 가능하지만 존재해야합니다.

불행히도 WCF에는 WSDL의 수입 스키마의 기본 주소가 공공 기반 주소 (엔드 포인트의 주소 속성을 사용하여 구성된 하나)가 아닌 ListenUri 기본 주소가있는 WCF에 버그가 있습니다. 이 문제를 해결하려면 Iwsdlexportextension 구현을 작성하여 가져온 스키마를 WSDL 문서에 직접 가져와 가져 오기를 제거해야합니다. 이것의 예는 여기에 제공됩니다 http://winterdom.com/2006/10/inlinexsdinwsdlwithwcf. 또한 Class Class는 BehavioreTexensionElement에서 상속 받고 다음과 같이 두 가지 새로운 방법을 완성 할 수 있습니다.

Public Overrides ReadOnly Property BehaviorType() As System.Type
    Get
        Return GetType(InlineXsdInWsdlBehavior)
    End Get
End Property

Protected Overrides Function CreateBehavior() As Object
    Return New InlineXsdInWsdlBehavior()
End Function

이를 통해 .config 파일에 확장 동작을 추가하고 서비스 공장을 만들지 않고 구성을 사용하여 동작을 추가 할 수 있습니다.

System.ServiceModel 구성 요소 추가 :

  <endpointBehaviors>
    <behavior name="SSLLoadBalancerBehavior">          
      <flattenXsdImports/>
    </behavior>
  </endpointBehaviors>
        </behaviors>
<extensions>
  <behaviorExtensions>
    <!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1-->
    <add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>        
  </behaviorExtensions>
</extensions>

그리고 동작 구성 속성을 사용하여 엔드 포인트 구성에서 새로운 엔드 포인트 동작을 참조하십시오.

<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top