"/>

关于.net:WCF服务返回“不允许使用方法”

关于.net:WCF服务返回“不允许使用方法”

WCF Service Returning “Method Not Allowed”

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

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

1
2
    [OperationContract]
    void FileUpload(UploadedFile file);

连同实际方法:

1
    public void FileUpload(UploadedFile file) {};

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

我想念什么吗?


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


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

1
2
3
4
5
6
7
8
9
10
[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.
 }

基本内在类型(例如byteintstring和数组)将由WCF自动进行序列化。自定义类(例如您的UploadedFile)将不会。

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

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

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


我已经有超过一天的时间遇到??了同样的问题-终于解决了。感谢@Sameh的提示。

您的服务可能工作正常。使用浏览器的地址栏测试POST消息无效。您需要使用Fiddler来测试POST消息。

提琴手说明...
http://www.ehow.com/how_8788176_do-post-using-fiddler.html


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

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

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

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

我的情况:在新服务器上配置服务。 ASP.NET 4.0未正确安装/注册;无法识别svc扩展名。


您需要添加web.config

1
2
3
4
5
6
7
8
9
<endpoint address="customBinding" binding="customBinding" bindingConfiguration="basicConfig" contract="WcfRest.IService1"/>  

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

只有带有WebGet的方法可以从浏览器IE访问;您只需输入地址即可访问其他http动词

您可以尝试Codeple的Restful服务启动工具包,也可以使用Fiddler测试您的其他HTTP动词


推荐阅读