IIS에서 WCF Net.pipe 바인딩을 호스팅 할 때 명명 된 파이프 이름 제어

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

  •  05-07-2019
  •  | 
  •  

문제

HTTP 및 Net.Pipe를 통해 액세스 할 수있는 서비스가 있습니다. IIS 7 (Server 2008)에서 호스팅되고 있습니다. 동일한 컴퓨터의 여러 고객을 위해이 서비스의 다른 인스턴스를 호스팅하고 있으므로 HTTP는 가상 호스트 이름 등으로 설정됩니다. 이것은 모두 잘 작동합니다.

나는 이름이 지정된 파이프 바인딩과 비슷할 것이라고 생각했다. 이름이 지정된 파이프베이스 주소에 고객 'virtualhostname'의 일부 형태를 사용하여 Net.pipe 항아리가 다른 다른 고객 인스턴스에 액세스 할 수있게 될 것이라고 생각했다 (인터넷을 깨닫게된다. 파이프 이름은 URN이 아니기 때문에 본질적으로 임의적 일 수 있지만 HTTP 주소와 비슷한 패턴을 따를 것이라고 생각했습니다).

여기 내 web.config가 있습니다

<service name="Administration" behaviorConfiguration="AdministrationBehavior">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="normalWsBinding" contract="IAdministration" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <endpoint address="" binding="netNamedPipeBinding" bindingConfiguration="normalNetNamedPipeBinding" contract="IAdministration" />
    <endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://virtualhostname.com/service" />
        <add baseAddress="net.pipe://virtualhostname.com/administration/service" />
      </baseAddresses>
    </host>
</service>

그러나 서비스에 대한 WSDL에 액세스 할 때 - Net.Pipe의 기본 주소는 IIS에 의해 무시되는 것 같습니다. 대신 기계의 실제 호스트 이름과 IIS에 의해 완전히 형식화 된 것으로 보이는 Net.pipe 주소 항아리를 얻습니다.

<wsdl:port name="NetNamedPipeBinding_IAdministration" binding="tns:NetNamedPipeBinding_IAdministration">
   <soap12:address location="net.pipe://realhostname/service/Administration.svc"/>
   <wsa10:EndpointReference>
       <wsa10:Address>net.pipe://realhostname.com/service/Administration.svc</wsa10:Address>
       <Identity>
          <Spn>host/realhostname.com</Spn>
       </Identity>
   </wsa10:EndpointReference>
</wsdl:port>

Net.pipe 이름이 형성되는 방식을 제어하지 않으면 기계의 여러 고객 서비스 인스턴스를 구별 할 수 없습니다. IIS 환경 내에서 네트 라인 파이프 바인딩 항아리를 어떻게 제어 할 수 있는지에 대한 단서가 있습니까?

(테스트 중에 독립형 Net.pipe 호스팅을 많이 수행합니다 (예 : New ServiceHost ()) 따라서 내 NET.PIPE 바인딩이 IIS 외부에서 작동하며 사용 된 정확한 파이프 항아리를 제어 할 수 있습니다).

IIS 내에서 이름을 제어 할 수없는 경우 - 동일한 컴퓨터에서 여러 개의 별도의 Net.pipe 서비스 인스턴스를 호스팅하고 액세스하는 경험이 있습니까?

도움이 되었습니까?

해결책

이것은 오래된 질문이지만, 나는 이것에 대한 답이 필요하기 때문에 내 대답을 추가 할 것이라고 생각했습니다 (아마도 그것을 필요로하는 다른 사람들도있을 것입니다).

IIS- 호스트 WCF 서비스의 기본 주소는 IIS에 의해 제어되며 Web.config에서는 재정의 할 수 없습니다. 대신, 서비스를 주최하는 사이트의 IIS 사이트 바인딩 정보를 업데이트하여 기본 주소를 제어 할 수 있습니다.

온라인에서 찾은 대부분의 문서는 * Net.pipe의 바인딩 구성으로 사용하는 것을 제안합니다. 그러나 대신 "virtualsite.com"을 바인딩 구성 값으로 사용하는 경우 Net.pipe endpoint의 기본 주소는 기계 이름이 아닌 "virtualsite.com"이됩니다.

다음은 AppCMD를 사용하여 올바른 Net.pipe 바인딩으로 IIS의 사이트를 구성하는 예입니다.

%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.pipe',bindingInformation='virtualhostname.com']

한 가지 메모 hostnamecomparisonMode, 그것은 IIS에 영향을 미치지 않습니다 MSDN:

이러한 값은 인터넷 정보 서비스 (IIS) 또는 Windows Process Activation Service (WAS) 호스팅 환경에서 사용될 때 영향을 미치지 않습니다. 이러한 경우 WCF는 WCF 서비스를 호스팅하는 IIS 웹 사이트에서 제공하는 호스트 이름 비교 모드를 사용합니다.

대신 위에서 설명한 메커니즘을 사용해야합니다. IIS 용 HTTP에서 호스트 이름 바인딩이 어떻게 작동하는지 조사하여 이것을 알아 냈습니다. 불행히도, 다른 WCF 전송에 대한이 IIS 기반 시나리오에 대한 공식 문서를 찾을 수 없었습니다.

다른 팁

URI의 호스트 이름 부분은 무시되고 채널 바인딩의 호스트 남성 모드를 기반으로 구현으로 대체되는 것으로 보입니다. 서비스의 구성을 통해 "정확한"것으로 변경할 수 있습니다 ...

http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.hostnamecomparisonMode.aspx

netNamedPipeBinding.hostnamecomperisonMode 호스트 이름이 URI와 일치 할 때 호스트 이름이 서비스에 도달하는 데 사용되는지 여부를 나타내는 hostnamecomepisonMode 값. 기본값은 StrongwildCard ()이며 일치에서 호스트 이름을 무시합니다.

여기에서 구성 구문을 참조하십시오.http://msdn.microsoft.com/en-us/library/ms731291.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top