WCF中的405方法不允许错误

4

请问有人能发现这个实现存在的问题吗?我可以在浏览器中打开它并且可以正常工作,但是从客户端调用(使用jquery和asp.net ajax)失败了。

服务契约

[OperationContract(Name = "GetTestString")]
[WebInvoke(Method = "GET",
           ResponseFormat = WebMessageFormat.Json
   )]
string GetTestString();

在Web.config文件中,除了其他绑定之外,我还有一个webHttp绑定。
<endpoint address="ajax" binding="webHttpBinding" contract="TestService" behaviorConfiguration="AjaxBehavior" />

端点行为

  <endpointBehaviors>
    <behavior name="AjaxBehavior">
      <enableWebScript/>
    </behavior>
  </endpointBehaviors>
</behaviors>

Svc文件

<%@ ServiceHost Service="TestService" %>

客户端

var serviceUrl = "http://127.0.0.1/Test.svc/ajax/";
var proxy = new ServiceProxy(serviceUrl);

我正在使用http://www.west-wind.com/weblog/posts/324917.aspx中的方法来调用该服务。

2个回答

6
您提供的链接示例使用的是Http POST而不是Http GET。这就是“方法不允许”的原因,您需要更改代码以执行GET请求。
您发布的链接作为客户端代码的来源具有以下块:
 $.ajax( { 
                url: url,
                data: json,
                type: "POST",
                processData: false,
                contentType: "application/json",
                timeout: 10000,
                dataType: "text",  // not "json" we'll parse

请注意其中的 type: "POST" - 你需要将其改为 "GET"。我假设你已经从你发布的链接中获取了 JQuery,因为 405 状态表明你的调用代码有误,而不是服务本身出错。

为了提供更多细节,我编辑了我的答案(因为代码块无法很好地放在评论中)。 - Dan Puzey
谢谢!当我在代理JS中将POST更改为GET时,它开始工作了。您知道作者为什么选择在从服务获取信息时使用POST(我认为应该是POST)吗? - DotnetDude
2
任何 Web 服务都可以选择实现任何 Http 方法 - 其中最常见的是 GETPOSTPUTDELETEPOSTPUT 通常用于写入信息,因此在这方面,您提供的示例有些不寻常 - 一个名为 GetStockQuote 的方法似乎不太适合作为 POST 实现 - 但这是服务作者的选择 :-) 值得注意的是,您可以使用任何方法返回结果(如果您愿意,您可以使用 Http DELETE 返回信息!)- 只是这并不一定是个好主意! - Dan Puzey
从上面来看,最重要的可能是:使用哪种Http方法并不那么重要(除非涉及到服务是否合理)。重要的是,如果服务是一个“POST”调用,客户端必须进行“POST”调用才能使服务正常工作。或者,在您的情况下,是一个“GET” :-) - Dan Puzey
1
我希望我能为此点赞一百万次。错过这个真是太愚蠢了。 - broguyman
显示剩余5条评论

1

对于方法不允许的错误,您需要检查的是确保您的 HTTP Web 调用/请求与服务中指定的 [WebInvoke...] 相同。

  $.ajax({
                type: "POST",.....});

应该与服务接口中指定的内容完全相同(在“[操作契约]”下)

 [WebInvoke(Method = "POST",BodyStyle = WebMessageBodyStyle.Wrapped,ResponseFormat = WebMessageFormat.Json)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接