2011-09-16 24 views
11

Tôi biết điều này đã được hỏi nhiều lần và trả lời nhiều lần, nhưng, tất cả các mẫu được cung cấp nên dường như không muốn làm việc cho tôi ngày hôm nay.mexHttpBinding - Thêm ServiceMetadataBehavior vào tệp cấu hình hoặc ServiceHost trực tiếp để hỗ trợ cho hợp đồng này

Khi tôi cố gắng để bắt đầu dẫn chương trình, tôi tiếp tục nhận được lỗi sau:.

"Tên hợp đồng 'IMetadataExchange' không thể được tìm thấy trong danh sách các hợp đồng thực hiện bởi TraceService dịch vụ Thêm một ServiceMetadataBehavior đến tập tin cấu hình hoặc ServiceHost trực tiếp để kích hoạt hỗ trợ cho hợp đồng này. "

dịch vụ của tôi đang được lưu trữ trong một loạt các cửa sổ dịch vụ được quản lý theo của Microsoft dụ: http://msdn.microsoft.com/en-us/library/ms733069%28v=vs.90%29.aspx

Và đây là tốt đẹp và đơn giản cấu hình của tôi:

<system.serviceModel> 
    <services> 
     <service name="Daff.Lae.Service.TraceService"> 
     <endpoint address="" binding="wsHttpBinding" name="TraceService" contract="Contracts.Service.ITraceService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8080/TraceService" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="DefaultBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Tất nhiên, vấn đề trở nên thú vị hơn khi không có lỗi nào nếu tôi xóa dòng này:

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 

Bất kỳ trợ giúp nào sẽ được đánh giá rất rất nhiều :)

Trả lời

24

Đảm bảo chỉ định behaviorConfiguration trong cấu phần service của cấu hình của bạn để cho phép httpGet hoặc httpsGet.

Tôi thấy rằng bạn đã xác định một serviceBehavior tên DefaultBehavior - bây giờ tất cả các bạn cần làm là thêm behaviorConfiguration="DefaultBehavior" tới phần tử service, vì vậy dòng đó trở thành:

<service name="Daff.Lae.Service.TraceService" behaviorConfiguration="DefaultBehavior"> 

Nếu bạn không xác định một cách rõ ràng hành vi cho dịch vụ của bạn, cả HTTP GET và HTTPS GET đều không được phép theo mặc định và siêu dữ liệu của bạn sẽ không bị lộ.

+0

hành vi mặc định đã có trong cấu hình của tôi. – agAus

+0

@agAus - Có, nhưng bạn chưa chỉ định rằng dịch vụ của bạn là sử dụng hành vi mặc định của bạn. Bạn cần thêm thuộc tính 'behaviorConfiguration' vào phần tử 'service' trong cấu hình của bạn, như được hiển thị trong câu trả lời của tôi. – RoccoC5

+0

Đã chỉnh sửa câu trả lời của tôi cho rõ ràng. – RoccoC5

2

Khi bạn đang sử dụng WS-Http, bạn đang ràng buộc với giao thức HTTPS, vì vậy bạn cần sử dụng liên kết MEX chính xác;

<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 

và thay đổi chân đế thành https.

Hoặc (theo cách khác) chuyển đổi wsHttp của bạn ràng buộc thành ràng buộc cơ bảnHttp và mọi thứ sẽ bắt đầu hoạt động cho bạn.

+0

Ahh ... Tôi không nhận ra wsHttpBinding có nghĩa là https? Tôi bị ràng buộc với bản phát hành ngay hôm nay nhưng chắc chắn sẽ muốn thử điều này và liên hệ lại với bạn. Tôi đã đánh dấu câu hỏi của mình để tôi có thể cập nhật bài đăng cho phù hợp. Cảm ơn :) – agAus

0
`<services> 
    <service name="MyService.Service1" behaviorConfiguration="Service1" > 

</services> 
` 

where MyService is the application name , Service1 is the default implementation class for IService1 
` 
<protocolMapping> 
    //Remove any http or https bindings provided 
</protocolMapping> 
` 
It should help when you use WCF Application Project