2009-06-03 27 views
38

nền
Tôi đã tạo ra các dịch vụ web ASMX trong quá khứ và đã có thể truy cập vào dịch vụ từ trình duyệt web và Ajax GET yêu cầu theo quy ước địa chỉ:
MyService.asmx/MyMethod?Param=xxxLàm một WCF Web Service làm việc với GET yêu cầu

Tôi mới bắt đầu sử dụng WCF và tạo một dịch vụ web mới trong dự án ASP.NET của mình. Nó tạo ra một tệp có phần mở rộng .svc như MyService.svc.

Hiện trạng
tôi có thể tiêu thụ các dịch vụ sử dụng WcfTestClient mà đi kèm với VS2008. Tôi cũng có thể tạo WCF Client của riêng mình bằng cách thêm một tham chiếu dịch vụ vào một dự án khác hoặc sử dụng dòng lệnh svcutil.exe để tạo tệp proxy và cấu hình.

Vấn đề
Khi tôi cố gắng sử dụng các dịch vụ từ một trình duyệt sử dụng MyService.svc/MyMethod?MyParam=xxx, tôi nhận được một trang trắng mà không làm lỗi.

Những gì tôi đã cố gắng
tôi đã thêm một basicHttpBinding để web.config và làm cho nó HttpGetEnabled trong cấu hình hành vi. Tôi cũng đã thêm thuộc tính [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")] vào hợp đồng hoạt động của mình.

Tôi đã theo dõi thông tin trong câu hỏi này stack overflow khác:
REST/SOAP EndPoints for a WCF Service

Tuy nhiên, tôi hoặc là nhận được một trang trống hoặc HTTP 404 Lỗi sau khi làm theo những bước sau. Không có gì đặc biệt về mã. Tôi chỉ tham gia vào một chuỗi như một tham số và trả về "Xin chào xxx". Đây là điều cơ bản về "Hello WCF World" bằng chứng kiểu khái niệm.


CẬP NHẬT - Dưới đây là các mã có liên quan

[ServiceContract] 
public interface IMyService 
{ 
    [WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")] 
    [OperationContract] 
    string MyMethod(string MyParam); 
} 

Web.Config - System.ServiceModel Mục

<system.serviceModel>  
    <behaviors> 
     <serviceBehaviors>   
      <behavior name="MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="MyServiceBehavior" name="MyService"> 
     <endpoint address="" 
         binding="wsHttpBinding" contract="IMyService" /> 
     <endpoint address="MyService.svc" 
         binding="basicHttpBinding" contract="IMyService" /> 
     <endpoint address="mex" 
         binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services>  
</system.serviceModel> 

Trả lời

43

Nhìn vào dịch vụ web.configMô hình của bạn, tôi có thể thấy rằng bạn cần thêm webHttpBinding và liên kết một endPointBehavior bao gồm webHttpGet.

Hợp đồng hoạt động của bạn là chính xác. Đây là cách phần cấu hình system.serviceModel của bạn nên tìm kiếm để bạn có thể sử dụng dịch vụ từ một yêu cầu GET HTTP.

<system.serviceModel>  
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true"/>   
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="WebBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors>  
    <services>  
     <service behaviorConfiguration="MyServiceBehavior" name="MyService"> 
     <endpoint address="ws" binding="wsHttpBinding" contract="IMyService"/> 
     <endpoint address="" behaviorConfiguration="WebBehavior" 
        binding="webHttpBinding" 
        contract="IMyService"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services>  
</system.serviceModel> 

Đảm bảo gán địa chỉ khác cho điểm cuối wsHttpBinding của bạn, nếu không bạn sẽ gặp lỗi khi nói rằng bạn có hai điểm cuối nghe trên cùng một URI.

Tùy chọn khác là để trống địa chỉ trong wsHttpBinding, nhưng chỉ định một địa chỉ khác cho dịch vụ webHttpBinding. Tuy nhiên, điều đó cũng sẽ thay đổi địa chỉ GET của bạn.

Ví dụ: nếu bạn chỉ định địa chỉ là "asmx", bạn sẽ gọi cho dịch vụ của mình bằng địa chỉ "MyService.svc/asmx/MyMethod?MyParam=xxxx".

+0

Tôi đoán tất cả những gì tôi cần là thêm endPointBehavior. Nó làm việc như một say mê. Cảm ơn bạn. – ichiban

5

Các yêu cầu WCF bình thường luôn yêu cầu SOAP - bạn sẽ không thể để có được điều này chỉ với trình duyệt của bạn, bạn sẽ cần WCF Testclient cho điều đó.

Có một tiện ích bổ sung cho WCF được gọi là WCF REST Starter Kit (cũng sẽ được bao gồm trong WCF 4.0 với .NET 4.0), cho phép bạn sử dụng các lệnh GET/POST/PUT/DELETE HTTP để truy vấn các dịch vụ WCF và . Bạn cần phải viết các dịch vụ của bạn đặc biệt cho REST, mặc dù - bạn không thể có SOAP và REST trên cùng một cuộc gọi dịch vụ.

Marc

4

Như marc_s says, REST Starter Kit có thể giúp đỡ, nhưng bạn cũng nên biết rằng .NET 3.5 đã hỗ trợ cho các dịch vụ REST trực tiếp trong đó. Nó không hoàn toàn giống như những gì bạn có thể làm với bộ khởi động, nhưng nó rất hữu ích.

Cách nó hoạt động là bạn đặt một thuộc tính [WebGet] về hoạt động của bạn để cho biết nơi trong URL các thông số khác nhau nên đến từ:

[WebGet(UriTemplate = "helloworld/{name}")] 
string Helloworld(string name); 

Xem this portal cho tấn thông tin.

Lưu ý, bạn có thể có cùng dịch vụ được hiển thị dưới dạng SOAP và REST nếu bạn chỉ định nhiều điểm cuối/liên kết trong cấu hình.

+0

Tôi có thuộc tính WebGet trong Hợp đồng hoạt động của mình như tôi đã đề cập trong câu hỏi của mình. Tôi đã bỏ qua phần UriTemplate trong câu hỏi của mình, nhưng đó là cách tôi có nó trong mã của tôi. Bạn đã thử điều này chưa? – ichiban

+0

Vâng, đây là cách chúng tôi xây dựng các dịch vụ REST của chúng tôi. –

+0

UriTemplate hoạt động cho tôi. – Cheeso

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