2010-06-14 31 views
9

Tôi đã tạo một dịch vụ WCF và hiển thị ba điểm cuối là basicHttpBinding, wsHttpBinding và webHttpBinding. Đây là một dịch vụ thử nghiệm cho các thí nghiệm của tôi với WCF. Nhưng, bất cứ khi nào tôi thêm tham chiếu dịch vụ bằng cách sử dụng tệp .svc, tôi chỉ nhận được hai điểm cuối (cơ bản và ws). Có vẻ như không phải là điểm cuối thứ ba (webHttpBidning) bị lộ vì một lý do nào đó.Hiển thị webHttpBinding điểm cuối trong dịch vụ WCF

Để tạo lại vấn đề này, tạo ra một dự án ứng dụng WCF, xóa các dịch vụ Service1, thêm mặt hàng mới> dịch vụ WCF tên TestService, và thay đổi tập tin cấu hình như sau:

<system.serviceModel> 
<services> 
    <service name="WcfTestService.TestService" behaviorConfiguration="TestServiceBehavior"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WcfTestService/TestService.svc"/> 
     </baseAddresses> 
    </host> 
    <endpoint address="basic" 
       binding="basicHttpBinding" 
       contract="WcfTestService.ITestService" /> 
    <endpoint address="ws" 
       binding="wsHttpBinding" 
       contract="WcfTestService.ITestService" /> 
    <endpoint address="web" 
       binding="webHttpBinding" 
       contract="WcfTestService.ITestService" /> 
    <endpoint address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="TestServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="webBehavior"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

đây là mã cho ITestService.cs:

[ServiceContract] 
public interface ITestService 
{ 
    [OperationContract] 
    [WebInvoke] 
    Boolean ValidateUser(User user); 
} 

[DataContract] 
public class User 
{ 
    [DataMember(Name = "Name")] 
    public String UserName { get; set; } 
    [DataMember] 
    public String Password { get; set; } 
} 

và cho TestService.svc

public class TestService : ITestService 
{ 
    public bool ValidateUser(User user) 
    { 
     if (user.UserName == "User" && user.Password == "123") 
     { 
      return true; 
     } 
     return false; 
    } 
} 

Tôi đã thử kết hợp khác nhau của tham số WebInvoke và tham số WebGet nhưng không thành công.

Bất cứ ai có thể cho tôi biết lý do tại sao điểm cuối thứ ba không hiển thị trong tệp WSDL?

Trả lời

5

@decyclone: ​​Tôi đã hiển thị thành công webHttpBindings mà không gặp bất kỳ sự cố nào. Nhưng tôi tìm thấy một số điều thú vị khi nó được tiếp xúc và khi nó không!

Tôi có thể thấy ràng buộc web bị lộ trong Ứng dụng khách kiểm tra Wcf.

Dưới đây là cấu hình của tôi

<services> 
    <service behaviorConfiguration="TestWeb.Service2Behavior" name="TestWeb.Service2"> 
    <endpoint address="" binding="wsHttpBinding" contract="TestWeb.Service2"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="web" binding="webHttpBinding" contract="TestWeb.Service2"> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 

điểm cần lưu ý ở đây là, làm việc của mình tốt sử dụng VS2008 với Framework 3.5, VS2010 với Framework 3.5, khi tôi sử dụng VS2010 và Framework 4.0 sau đó tôi không thể nhìn thấy WebHttpBinding nhận tiếp xúc trong WCF Test Client, tuy nhiên tôi có thể sử dụng binidng đó để thực hiện bài đăng http trong mọi trường hợp.

Tôi giả định rằng trong Framework 4.0 không hiển thị theo mặc định, ngay cả khi tôi thử bật endpointDiscovery nhưng vẫn không có may mắn!

tôi đã bao phủ hành vi này trong post

2

Điểm cuối "web" của bạn sẽ được hiển thị dưới dạng điểm cuối JSON. Nó không tương thích với WSDL.

+2

Vì vậy, làm thế nào để khách hàng biết phương thức/loại nào được hiển thị khi chỉ có một điểm cuối sử dụng webHttpBinding? – decyclone

+0

Tôi thực sự không biết (cách jQuery chuyển siêu dữ liệu). Có thể là một câu hỏi khác. –

+0

@decyclone: ​​Xem câu trả lời cho câu hỏi tiếp theo của bạn bên dưới. – BillVo

0

WebHttpBinding của tôi là trong System.ServiceModel.Web. Nếu bạn đang sử dụng vs2010, hãy vào các thuộc tính của dự án của bạn, kiểm tra khung đích. Theo mặc định nó trỏ đến .Net Framework 4 Client Profile. Nó sẽ trỏ đến .Net Framework 4, sau đó bạn có thể tìm thấy System.ServiceModel.Web khi bạn sẽ đi đến Thêm tài liệu tham khảo

0

@decyclone: ​​Một cách mà một khách hàng javascript có thể tìm hiểu các phương pháp có sẵn trên webHttpBinding là tải xuống một proxy proxy WCF với thẻ script HTML trỏ đến điểm cuối của bạn, sau đó là "/ js": <script src="http://localhost/WcfTestService/TestService.svc/web/js"></script>

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