2009-11-27 27 views
6

Tôi có dịch vụ có thể truy cập qua http và net.pipe. Nó đang được lưu trữ trong IIS 7 (Server 2008). Tôi có thể lưu trữ các trường hợp khác nhau của dịch vụ này cho một số khách hàng trên cùng một máy và do đó HTTP được thiết lập với tên máy chủ ảo, v.v. Tất cả đều hoạt động tốt.kiểm soát tên của một đường ống được đặt tên khi lưu trữ WCF net.pipe ràng buộc trong IIS

Tôi nghĩ tôi sẽ làm tương tự cho các mạng có tên ống ràng buộc - sử dụng một số hình thức khách hàng 'virtualhostname' vào địa chỉ cơ sở ống được đặt tên, do đó cho phép tôi để truy cập các trường hợp khách hàng khác nhau với chiếc bình net.pipe khác nhau (Tôi nhận ra tên net.pipe là URN không phải của URL để chúng có thể cơ bản tùy ý nhưng Tôi nghĩ rằng tôi sẽ theo một mẫu tương tự với các địa chỉ HTTP).

Đây là web.config của tôi

<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> 

Tuy nhiên, khi truy cập vào WSDL cho dịch vụ - địa chỉ cơ sở cho net.pipe dường như để được bỏ qua bởi IIS. Thay vào đó, tôi nhận được tên máy chủ thực của máy và địa chỉ net.pipe net.pipe URN dường như đã được định dạng hoàn toàn bởi IIS.

<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> 

Với không kiểm soát cách tên net.pipe được hình thành, tôi sẽ không thể phân biệt giữa nhiều trường hợp dịch vụ khách hàng trên máy tính này. Có ai có bất kỳ đầu mối như thế nào net có tên là ràng buộc ống URN có thể được kiểm soát trong môi trường IIS?

(Tôi làm rất nhiều net.pipe độc ​​lập trong khi kiểm tra (ví dụ ServiceHost mới)()) vì vậy tôi biết rằng ràng buộc net.pipe của tôi hoạt động bên ngoài IIS và cho phép điều khiển URN được sử dụng)

Nếu không thể kiểm soát tên trong IIS - có ai có kinh nghiệm với lưu trữ và truy cập nhiều phiên bản dịch vụ net.pipe riêng biệt trên cùng một máy không?

+0

bạn biết rằng ràng buộc net.pipe chỉ hoạt động "trên máy", ví dụ: bạn không thể truy cập chúng từ một số máy khác, ngay cả khi chúng được lưu trữ trong IIS .... –

+0

khi lưu trữ trong IIS, bạn không thực sự chọn địa chỉ dịch vụ của mình - luôn luôn là 'http: // machinename [: port ]/virtualdir/yourservice.svc' - Tôi nghi ngờ điều tương tự cũng áp dụng cho địa chỉ net.pipe - bạn không thể kiểm soát việc đặt tên của chúng nếu được lưu trữ trong IIS .... –

+0

Có, các điểm cuối HTTP là để truy cập off-machine, và tôi hy vọng sẽ sử dụng các điểm cuối net.pipe cho một số truy cập hạn chế (nhưng hy vọng nhanh hơn) trên máy. Khi tôi lưu trữ các điểm cuối HTTP của mình trong IIS, tuy nhiên tôi có thể chọn địa chỉ dịch vụ (ở một mức nào đó) vì tôi chỉ định miền tôi muốn sử dụng. Điều này cho phép tôi có nhiều trang IIS mỗi truy cập thông qua các url khác nhau tức là http://customer1.com/admin/Admin.svc và http://customer2.com/admin/Admin.svc Nếu tôi có thể ' t chọn địa chỉ cơ sở của tôi cho net.pipe, làm thế nào tôi có thể có nhiều ràng buộc net.pipe được lưu trữ cho các khách hàng khác nhau trong IIS? –

Trả lời

2

Đây là một câu hỏi cũ, nhưng tôi figured tôi muốn thêm câu trả lời của tôi kể từ khi tôi cũng cần một câu trả lời cho điều này (và có thể có những người khác ra có những người cũng cần nó).

Địa chỉ cơ sở của dịch vụ WCF được lưu trữ trên IIS được kiểm soát bởi IIS và không thể bị ghi đè trong web.config. Thay vào đó, bạn có thể kiểm soát các địa chỉ cơ sở bằng cách cập nhật thông tin liên kết trang web IIS cho trang web mà bạn đang lưu trữ dịch vụ của mình.

Hầu hết tài liệu tôi tìm thấy trực tuyến đều đề xuất sử dụng * làm cấu hình ràng buộc cho net.pipe. Nhưng nếu bạn thay vì sử dụng "virtualsite.com" làm giá trị cấu hình ràng buộc, địa chỉ cơ sở của điểm cuối net.pipe của bạn sẽ là "virtualsite.com" thay vì tên máy.

Dưới đây là một ví dụ sử dụng appcmd để cấu hình một trang web trong IIS với các ràng buộc net.pipe đúng:

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

Một lưu ý về HostnameComparisonMode, nó không có tác dụng trong IIS theo MSDN:

Các giá trị này không có tác dụng khi được sử dụng bên trong môi trường lưu trữ dịch vụ thông tin Internet (IIS) hoặc Windows Process Activation Service (WAS). Trong những trường hợp đó, WCF sử dụng bất kỳ chế độ so sánh tên máy chủ nào được cung cấp bởi trang web IIS lưu trữ các dịch vụ WCF.

Thay vào đó, bạn phải sử dụng cơ chế tôi đã mô tả ở trên. Tôi đã tìm ra điều này bằng cách điều tra cách gắn kết tên máy chủ hoạt động trong HTTP cho IIS. Thật không may, tôi đã không thể tìm thấy bất kỳ tài liệu chính thức nào cho kịch bản dựa trên IIS này cho các vận chuyển WCF khác.

+0

Cảm ơn Chris. Nhu cầu của tôi cho điều này được giải quyết từ lâu đã trôi qua nhưng điều này trông giống như thông tin tốt! –

0

Dường như phần tên máy chủ lưu trữ của URI bị bỏ qua và được thay thế bằng cách triển khai dựa trên HostNameComparisonMode của liên kết kênh. Bạn có thể thử thay đổi nó để "Chính xác" qua cấu hình của dịch vụ ...

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

NetNamedPipeBinding.HostnameComparisonMode Giá trị HostnameComparisonMode cho biết xem hostname được sử dụng để đạt được dịch vụ khi kết hợp URI. Giá trị mặc định là StrongWildcard(), bỏ qua tên máy chủ trong khớp.

Xem cú pháp cấu hình ở đây: http://msdn.microsoft.com/en-us/library/ms731291.aspx

+0

Tôi không chắc chắn nếu điều này là mới kể từ câu trả lời ban đầu của bạn, nhưng theo liên kết của bạn, HostnameComparisonMode không có hiệu lực trong IIS. –

Các vấn đề liên quan