2008-09-03 61 views
39

Trong quá trình phát triển dịch vụ WCF đầu tiên của tôi và khi tôi cố gắng sử dụng dịch vụ này, tôi nhận được "Phương pháp không được phép" mà không có giải thích nào khác.Dịch vụ WCF Trả lại "Phương thức không được phép"

Tôi đã có giao diện của tôi được thiết lập với ServiceContract và OperationContract:

[OperationContract] 
    void FileUpload(UploadedFile file); 

Cùng với các phương pháp thực tế:

public void FileUpload(UploadedFile file) {}; 

Để truy cập vào dịch vụ tôi nhập http://localhost/project/myService.svc/FileUpload nhưng tôi nhận được Lỗi "Phương thức không được phép"

Tôi có thiếu gì đó không?

Trả lời

58

Trình duyệt của bạn đang gửi yêu cầu HTTP GET: Đảm bảo rằng bạn có thuộc tính WebGet trên operatio n trong hợp đồng:

[ServiceContract] 
public interface IUploadService 
{ 
    [WebGet()] 
    [OperationContract] 
    string TestGetMethod(); // This method takes no arguments, returns a string. Perfect for testing quickly with a browser. 

    [OperationContract] 
    void UploadFile(UploadedFile file); // This probably involves an HTTP POST request. Not so easy for a quick browser test. 
} 
+3

Điều này không hiệu quả đối với tôi (asp.net trên khung 4.0) nhưng câu trả lời của darthjit dưới đây đã làm – Quango

+5

vậy tại sao cái này được kiểm tra thay vì darjhit? –

+0

@LeiLeyba Bởi vì tác giả đánh dấu câu trả lời, không phải là cộng đồng –

4

Các loại nội tại cơ bản (ví dụ: byte, int, string và mảng) sẽ được WCF tự động tuần tự hóa. Các lớp tùy chỉnh, như UploadedFile của bạn, sẽ không.

Vì vậy, một câu hỏi ngớ ngẩn (nhưng tôi phải hỏi nó ...): UploadedFile được đánh dấu là [DataContract]? Nếu không, bạn sẽ cần phải chắc chắn rằng nó là, và rằng mỗi thành viên trong lớp mà bạn muốn gửi được đánh dấu với [DataMember].

Không giống như điều khiển từ xa, nơi đánh dấu một lớp với [XmlSerializable] cho phép bạn sắp xếp lại toàn bộ lớp mà không cần đánh dấu các thành viên mà bạn muốn tuần tự, WCF cần bạn đánh dấu từng thành viên. (Tôi tin rằng điều này đang thay đổi trong .NET 3.5 SP1 ...)

Tài nguyên to lớn để phát triển WCF là những gì chúng tôi biết trong cửa hàng của chúng tôi là "sách cá": Programming WCF Services bởi Juval Lowy. Không giống như một số cuốn sách WCF khác xung quanh, đó là một chút khô và học tập, điều này có một cách tiếp cận thực tế để xây dựng các dịch vụ WCF và thực sự hữu ích. Khuyên dùng kỹ lưỡng.

1

Có vẻ như bạn đang sử dụng một địa chỉ không chính xác:

Để truy cập vào dịch vụ tôi nhập http://localhost/project/myService.svc/FileUpload

Giả sử bạn có ý nghĩa này là địa chỉ mà bạn cung cấp cho mã khách hàng của bạn sau đó tôi nghi ngờ nó thực sự là:

http://localhost/project/myService.svc 
70

Nếu bạn đang sử dụng [WebInvoke(Method="GET")] thuộc tính vào phương pháp dịch vụ, hãy chắc chắn rằng bạn đánh vần tên phương pháp như "GET" chứ không phải "Nhận" hoặc "nhận được" vì nó là trường hợp nhạy cảm ! Tôi đã có lỗi tương tự và tôi mất một giờ để tìm ra điều đó.

+0

Hah, đây là vấn đề của tôi. Cảm ơn. – canon

+0

Giải pháp này đã giúp tôi giải quyết lỗi 405 quá! Cảm ơn bạn! – YoYoMyo

+0

Phát ngay! (Tất nhiên tôi sử dụng "Get" thay vì "GET") :) –

-1

Chỉ có thể truy cập các phương pháp với WebGet từ trình duyệt IE; bạn có thể truy cập vào các động từ http khác bằng cách chỉ cần gõ địa chỉ

Bạn có thể thử Restful bộ dịch vụ khởi động của codeples hoặc sử dụng cáy để kiểm tra động từ http khác của bạn

+0

Tôi nghĩ bạn đang thực sự cố gắng nói điều này: Bạn có thể kiểm tra tin nhắn GET trong trình duyệt nhưng các động từ khác phải được kiểm tra trong Fiddler? Tôi đồng ý. – flobadob

0

bạn cần phải thêm trong web.config

<endpoint address="customBinding" binding="customBinding" bindingConfiguration="basicConfig" contract="WcfRest.IService1"/> 

<bindings> 
    <customBinding> 
     <binding name="basicConfig"> 
      <binaryMessageEncoding/> 
      <httpTransport transferMode="Streamed" maxReceivedMessageSize="67108864"/> 
     </binding> 
    </customBinding> 
1

Tôi đã gặp sự cố tương tự này trong hơn một ngày - cuối cùng đã tìm ra. Nhờ @Sameh cho gợi ý.

Dịch vụ của bạn có thể hoạt động tốt. Kiểm tra tin nhắn POST bằng cách sử dụng thanh địa chỉ của trình duyệt sẽ không hoạt động. Bạn cần sử dụng Fiddler để kiểm tra tin nhắn POST.

hướng dẫn Fiddler ... http://www.ehow.com/how_8788176_do-post-using-fiddler.html

+0

Ngoài ra, chỉ cần tìm thấy plugin RESTClient cho Firefox/Chrome/những người khác. Dễ sử dụng hơn Fiddler - có thể là lựa chọn tốt hơn để bắt đầu. – flobadob

+0

Bạn không * cần * để sử dụng Fiddler. Bạn có thể làm điều này mà không cần cài đặt bất cứ điều gì; chỉ cần lưu HTML sau vào tệp (đã chỉnh sửa URL) và mở nó trong trình duyệt:

0

trường hợp của tôi: cấu hình dịch vụ trên máy chủ mới. ASP.NET 4.0 không được cài đặt/đăng ký đúng cách; Phần mở rộng svc không được nhận dạng.

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