2010-04-05 20 views
8

Tôi muốn nhận dịch vụ WCF-over-TCP hoạt động. Tôi đã có một số vấn đề với việc sửa đổi dự án của riêng tôi, vì vậy tôi nghĩ rằng tôi muốn bắt đầu với "cơ sở" WCF mẫu bao gồm trong VS2008.mexTcpBinding trong WCF - IMetadataExchange errors

Đây là lần đầu WCF App.config và khi tôi chạy dịch vụ Test Khách hàng WCF có thể làm việc với nó tốt:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
     <compilation debug="true" /> 
    </system.web> 
    <system.serviceModel> 
     <services> 
      <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior"> 
       <host> 
        <baseAddresses> 
         <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfTcpTest/Service1/" /> 
        </baseAddresses> 
       </host> 
       <endpoint address="" binding="wsHttpBinding" contract="WcfTcpTest.IService1"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="WcfTcpTest.Service1Behavior"> 
        <serviceMetadata httpGetEnabled="True"/> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

này hoạt động hoàn hảo, không có vấn đề gì cả.

tôi đã tìm cách thay đổi nó từ HTTP để TCP sẽ là tầm thường: thay đổi các ràng buộc để tương đương TCP của họ và loại bỏ các yếu tố httpGetEnabled serviceMetadata:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
     <compilation debug="true" /> 
    </system.web> 
    <system.serviceModel> 
     <services> 
      <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior"> 
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://localhost:1337/Service1/" /> 
        </baseAddresses> 
       </host> 
       <endpoint address="" binding="netTcpBinding" contract="WcfTcpTest.IService1"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="WcfTcpTest.Service1Behavior"> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

Nhưng khi tôi chạy này, tôi nhận được lỗi này trong dịch vụ WCF Máy chủ:

System.InvalidOperationException: Không thể tìm thấy tên hợp đồng 'IMetadataExchange' trong danh sách các hợp đồng được dịch vụ Service1 triển khai. Thêm ServiceMetadataBehavior vào tệp cấu hình hoặc ServiceHost trực tiếp để bật hỗ trợ cho hợp đồng này.

Tôi có cảm giác rằng bạn không thể gửi siêu dữ liệu bằng TCP, nhưng đó là lý do tại sao có tùy chọn mexTcpBinding?

Trả lời

20

Vâng, nếu bạn muốn có siêu dữ liệu - TCP hoặc HTTP - bạn vẫn cần bao gồm hành vi serviceMetadata!

<behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfTcpTest.Service1Behavior"> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
      <serviceMetadata /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

Chắc chắn, bạn không thể có một "HttpGetEnabled" vào nó - nhưng hành vi bản thân phải có mặt để cho phép trao đổi siêu dữ liệu (và do đó hợp đồng IMetadataExchange).

+0

Cảm ơn bạn! Điều đó đã làm điều đó. Tôi không nghĩ rằng cấu hình của WCF được thiết kế ngay sau đó. App.config là một tập tin cấu hình, tôi giả định rằng khi một yếu tố cấu hình đã được gỡ bỏ nó chỉ đơn giản có nghĩa là "Tôi không rõ ràng thiết lập bất kỳ cấu hình" không "Vô hiệu hóa tính năng này". Một cách tốt hơn sẽ là: Dai

+1

@ David: tốt, đó là một tùy chọn mà người ta có thể tranh cãi trong một thời gian dài. WCF chỉ sử dụng phương pháp "nếu nó không có, nó không hoạt động". Một khi bạn biết nó, nó ổn và làm cho rất nhiều ý nghĩa (bạn không cần phải đặt nó trong đó và thiết lập hoạt động = false để vô hiệu hóa nó - chỉ cần bỏ nó ra) –

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