在开发我的第一个WCF服务的过程中,当我尝试使用它时,我得到“Method not Allowed”,没有其他解释。
我的界面设置了ServiceContract和OperationContract:
[OperationContract]
void FileUpload(UploadedFile file);
与实际方法一起:
public void FileUpload(UploadedFile file) {};
要访问服务,请输入http://localhost/project/myService.svc/FileUpload 但我得到“方法不允许”错误
我错过了什么吗?
答案 0 :(得分:72)
如果您在服务方法上使用[WebInvoke(Method="GET")]
属性,请确保将方法名称拼写为“GET”而不是“获取”或“获取”,因为它区分大小写!我有同样的错误,我花了一个小时来计算出那一个。
答案 1 :(得分:59)
您的浏览器正在发送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.
}
答案 2 :(得分:4)
基本内在类型(例如byte
,int
,string
和数组)将由WCF自动序列化。自定义类(如UploadedFile)不会。
所以,一个愚蠢的问题(但我必须要问......):UploadedFile是否标记为[DataContract]
?如果没有,您需要确保它是,并且您要发送的类中的每个成员都标有[DataMember]。
与远程处理不同,使用[XmlSerializable]标记类允许您序列化整个类而无需标记要序列化的成员,WCF需要您标记每个成员。 (我相信这在.NET 3.5 SP1中正在发生变化......)
WCF开发的巨大资源是我们在商店中所知道的“鱼书”:Juval Lowy的Programming WCF Services。与其他一些WCF书籍不同,这些书籍有点干燥和学术性,这一点采用实用的方法来构建WCF服务,实际上是有用的。彻底推荐。
答案 3 :(得分:1)
听起来你使用了错误的地址:
假设您的意思是这是您提供客户端代码的地址,那么我怀疑它应该是:
http://localhost/project/myService.svc
答案 4 :(得分:1)
我现在已经有一天多时间遇到同样的问题了 - 终于明白了。感谢@Sameh提示。
您的服务可能正常运作。使用浏览器的地址栏测试POST消息不起作用。您需要使用Fiddler来测试POST消息。
提琴手指示...... http://www.ehow.com/how_8788176_do-post-using-fiddler.html
答案 5 :(得分:1)
答案 6 :(得分:0)
只能从浏览器IE访问WebGet的方法;只需输入地址
即可访问其他http动词您可以尝试使用Restful service startup of codeples或使用fiddler来测试其他http动词
答案 7 :(得分:0)
您需要添加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>
答案 8 :(得分:0)
我的情况:在新服务器上配置服务。 ASP.NET 4.0未正确安装/注册; svc扩展未被识别。