programing

WSDL URL을 내부 시스템 이름에서 공용으로 변경하는 방법은 무엇입니까?

showcode 2023. 6. 4. 10:44
반응형

WSDL URL을 내부 시스템 이름에서 공용으로 변경하는 방법은 무엇입니까?

Azure에 구축한 간단한 서비스가 있습니다.다음을 통해 액세스할 수 있습니다.

http://xxxxxxxxxxxxxxxxxxxxxxx.cloudapp.net/MyTestService.svc

WSDL의 URL은 공용 DNS 대신 내부 시스템 이름을 사용합니다.

svcutil.exe http://rd001520d328923a/MyTestService.svc?wsdl

분명히, WSDL은 이것으로 기계 외부에서 접근할 수 없습니다.

IIS에서 실행 중이거나 서비스 URL을 알고 있는 경우 변경할 수 있는 몇 가지 사항을 알고 있습니다.예를 들어 다음을 변경합니다.<serviceMetadata>를 지정하도록 구성합니다.httpGetUrl속성, 하지만 절대 URL을 포함해야 하므로 작동하지 않습니다.상대 URL을 사용하여 내부 시스템 이름을 계속 사용합니다.실제 문제는 WSDL에 기계 이름과 함께 URL 참조가 포함되어 있기 때문에 사용할 수 없다는 것입니다.

다음과 같은 두 가지 하위 표준 해결 방법이 있습니다.

  • WSDL을 가져다가 URL을 수정한 다음 다른 URL에서 액세스할 수 있도록 업로드할 수 있다는 제안이 있었습니다.

  • 2010년 초의 핫픽스를 사용할 수 있었지만 더 나은 방법이 있을 것입니다.

컴퓨터 이름 대신 공용 DNS를 사용하려면 어떻게 해결할 수 있습니까?

알겠습니다. 저는 거의 일주일 동안 이것을 보고 있어요.드디어 답을 찾았습니다, 쉽게 구할 수 없기 때문에 저는 이것이 색인화되어 다른 사람들을 위해 시간을 절약하기를 바랍니다.

기본적으로 이러한 전반적인 동작은 WCF 3.0/3.5의 알려진 문제로, 이에 대해 핫픽스를 릴리스했습니다.자세한 내용은 여기에서 확인할 수 있습니다. FIX: WCF WSDL 문서에서 URI는 로드 밸런서 대신 액세스할 수 없는 내부 인스턴스를 참조합니다...

저는 연구하는 동안 이 문제를 몇 번 발견했지만, 대부분의 경우 Azure에 핫픽스를 배포하는 방법에 대해 전혀 알지 못했기 때문에 다시 생각해 본 적이 없습니다.

다행히 MSDN 포럼의 마이크로소프트 진행자는 이 문제가 .net 4.0에서 해결되었다고 지적했습니다.즉, 위의 KB 문서에서 권장하는 "수정"이 적용되지만 핫픽스를 적용할 필요가 없다는 것입니다.그렇다면 해결책은 무엇일까요?단순하게 구성 파일에 다음을 추가합니다.

<serviceBehaviors>
   <behavior name="<name>">
     <!-- Other options would go here -->
     <useRequestHeadersForMetadataAddress>
       <defaultPorts> <!-- Use your own port numbers -->
          <add scheme="http" port="81" />
          <add scheme="https" port="444" />
        </defaultPorts>
      </useRequestHeadersForMetadataAddress>
   </behavior>
</serviceBehaviors>

그게 다였다.이 문제가 이제 해결되었다는 것이 더 명확했다면 훨씬 더 간단한 검색이었을 것입니다.아마도 나는 충분히 열심히 보이지 않았을 것입니다.

블로그 게시물 메타데이터 주소에 대한 요청 헤더 사용은 다음과 유사합니다.
Victor의 답변이지만 기본 포트는 선택 사항이며 생략할 수 있다고 설명합니다.

<system.serviceModel>
  <behaviors>
       <serviceBehaviors>
          <behavior>
            <useRequestHeadersForMetadataAddress/>
          </behavior>
        </serviceBehaviors>
  </behaviors>
</system.serviceModel>

또한 코드에서 동작을 활성화하는 방법도 보여줍니다.

sh.Description.Behaviors.Add(new UseRequestHeadersForMetadataAddressBehavior());

WSDL을 게시하기 위해 WSDL을 생성하는 것입니까, 아니면 다른 프로젝트에 참조를 추가하려는 것입니까?

후자의 경우 "서비스 참조 추가"가 아닌 WCF Channel Factory 접근 방식을 사용하는 것이 좋습니다.저는 그것이 제게 더 일관적이고 통제 가능한 결과를 제공한다는 것을 알게 되었습니다.

http://msdn.microsoft.com/en-us/library/ms734681.aspx

덧붙이자면, 나는 Azure에서 이것을 시도해 본 적이 없습니다.

언급URL : https://stackoverflow.com/questions/5007270/how-to-change-wsdl-url-from-internal-machine-name-to-public

반응형