WCF服务返回"不允许的方法"

时间:2020-03-05 18:46:52  来源:igfitidea点击:

在开发我的第一个WCF服务的过程中,当我尝试使用它时,我得到了"不允许使用方法",没有其他说明。

我已经使用ServiceContract和OperationContract设置了我的界面:

[OperationContract]
    void FileUpload(UploadedFile file);

连同实际方法:

public void FileUpload(UploadedFile file) {};

要访问该服务,请输入http://localhost/project/myService.svc/FileUpload
但出现"方法不允许"错误

我想念什么吗?

解决方案

回答

基本的内在类型(例如,字节,整数,字符串和数组)将由WCF自动进行序列化。自定义类(例如UploadedFile)将不会。

因此,一个愚蠢的问题(但我不得不问...):UploadedFile是否标记为" [DataContract]"?如果不是,则需要确保它是正确的,并且要发送的类中的每个成员都标记有[DataMember]。

与远程处理不同,在远程处理中,使用[XmlSerializable]标记类使我们可以序列化整个类而不必费心去标记要序列化的成员,而WCF需要标记每个成员。 (我相信这在.NET 3.5 SP1中正在改变...)

WCF开发的巨大资源是我们在商店中所知的"鱼书":Juval Lowy编写的WCF服务编程。与周围的其他WCF书籍有些枯燥和学术性不同,这本书采用一种实用的方法来构建WCF服务,并且实际上很有用。彻底推荐。

回答

听起来我们使用的地址不正确:

To access the Service I enter http://localhost/project/myService.svc/FileUpload

假设意思是这是我们提供给客户代码的地址,那么我怀疑它实际上应该是:

http://localhost/project/myService.svc

回答

浏览器正在发送HTTP GET请求:确保合同中的操作具有WebGet属性:

[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.
 }

回答

如果在服务方法上使用了[WebInvoke(Method =" GET")]]属性,请确保将方法名称拼写为" GET"而不是" Get"或者" get",因为它区分大小写!我遇到了同样的错误,花了一个小时才弄清楚那个错误。