2010-11-12 19 views
11

Tôi có dịch vụ WCF được lưu trữ dưới dạng Dịch vụ Windows. Chúng tôi muốn kích hoạt điểm cuối mex tại cùng một địa chỉ (nhưng với hậu tố '/ mex'). Tôi đã cố gắng để làm điều này (không thành công) bằng cách sử dụng cấu hình sau:Làm thế nào để buộc một điểm cuối net.tcp mex (mexTcpBinding) để tham gia chia sẻ cổng?

<system.serviceModel> 

    <services> 
    <service 
     name="MyCompany.MyService" 
     behaviorConfiguration="defaultServiceBehavior"> 

     <host> 
     <baseAddresses> 
      <add baseAddress="net.tcp://localhost"/> 
     </baseAddresses> 
     </host> 

     <endpoint 
     address="MyService" 
     binding="netTcpBinding" 
     contract="MyCompany.IMyService" 
     bindingConfiguration="netTcpBindingConfig" 
     /> 

     <endpoint 
     address="MyService/mex" 
     binding="mexTcpBinding" 
     contract="IMetadataExchange" 
     /> 

    </service> 
    </services> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="defaultServiceBehavior"> 
     <serviceMetadata /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 

    <bindings> 
    <netTcpBinding> 
     <binding name="netTcpBindingConfig" portSharingEnabled="true" /> 
    </netTcpBinding> 
    </bindings> 

</system.serviceModel> 

Khi nó chạy, các máy chủ dịch vụ ném một AddressAlreadyInUseException phàn nàn rằng "Đã có một người biết lắng nghe trên IP endpoint 0.0.0.0:808". Điều này thực sự có ý nghĩa với tôi vì dịch vụ chia sẻ cổng đã mở cổng đó để phục vụ điểm cuối MyService cùng với bất kỳ dịch vụ nào khác yêu cầu chia sẻ cổng đó trên máy này.

Vì vậy, có vẻ như các thiết bị đầu cuối mex muốn truy cập exlusive đến cổng 808. Tôi có thể làm việc này bằng cách tinh chỉnh mex endpoint như vậy:

<endpoint 
    address="net.tcp://localhost:818/MyService/mex" 
    binding="mexTcpBinding" 
    contract="IMetadataExchange" 
    /> 

này có nghĩa là thiết bị đầu cuối mex hiện nay có cổng độc quyền riêng của mình . Nhược điểm với điều này là bất kỳ dịch vụ nào khác muốn trưng ra một điểm cuối mex cũng sẽ cần một cổng duy nhất cho điểm cuối mex của nó. Điều này làm cho nó rất khó đoán khi tìm kiếm điểm cuối mex.

Có cách nào để buộc điểm cuối mex tham gia chia sẻ cổng không?

+0

Chỉ cần một ý nghĩ: Thêm bindingConfiguration = "netTcpBindingConfig" đến mex endpoint? –

+0

@Torben Yeah, tôi đã thử điều đó. Khi tôi làm điều đó, điểm cuối mex không có vấn đề chia sẻ, nhưng nó hoàn toàn không tạo ra bất kỳ siêu dữ liệu nào. –

Trả lời

8

Hai lựa chọn:

  1. Cách dễ dàng: Thay đổi toàn bộ ràng buộc cho các điểm mex để netTcpBinding và có nó tái sử dụng bindingConfiguration của bạn. mexTCPBinding chỉ có nghĩa là một sự thuận tiện và là tùy chọn. Nếu nó không hoạt động cho bạn, đừng sử dụng nó.

  2. Cách cứng: Bạn có thể sửa đổi mexTCPBinding để bật chia sẻ. Ví dụ duy nhất tôi đã nhìn thấy là trong mã ở đây: http://blogs.msdn.com/b/drnick/archive/2006/08/23/713297.aspx

+0

Cảm ơn bạn đã trả lời. Tôi đã cố gắng thay đổi mexTcpBinding để netTcpBinding nhưng không có con xúc xắc. Khi tôi làm điều đó, dịch vụ khởi động và không phàn nàn về các vấn đề chia sẻ (điều này thật tuyệt) nhưng hoàn toàn không đáp ứng được các yêu cầu của mex (mà là không công bằng). Có lẽ có cái gì khác tôi cần phải cấu hình nếu tôi sử dụng netTcpBinding mà tôi không biết? –

+0

@Damian bạn đã bao giờ giải quyết vấn đề này chưa? Thật lạ lùng khi chúng tôi nhìn thấy vấn đề này trên máy cục bộ của tôi, nhưng không phải trong sản xuất –

+1

Cách dễ dàng đã hiệu quả đối với tôi (Tùy chọn 1). –

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