WCF错误:405方法不允许

坚持这个问题。 我有一个包含2个项目的解决方案,其中一个是带有jquery ajax调用的普通旧html,而另一个是WCF服务。 html页面将发出对WCF服务的ajax调用以获取json字符串并将其用于显示目的。

现在的问题是每当我在调试模式下运行时,html页面和WCF都将以不同的端口启动。 当我执行测试时(即在Firefox中调用类型= OPTIONS获得405 Method Not Allowed错误),这为我创建了一个跨源问题。 我会在我的ajax脚本上检查调用方法,并且WCF服务是相同的(GET)。

我搜索谷歌但发现要么我必须安装扩展程序或在IIS上执行一些配置,我发现这很麻烦,因为我正在做的事情很简单。 下面是一个例子,我将在web.config中添加以下配置,但它不起作用:

                                      

任何人都有任何想法摆脱这个恼人的问题?

编辑:只是添加,我正在使用与VS Studio 2012一起提供的IIS Express运行调试

添加WCF代码并更新web.config

 [ServiceContract] public interface IMemberInfo { [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json )] [OperationContract] string GetMemberInfoById(); // TODO: Add your service operations here } 

我的剧本:

 $(document).ready(function () { $.ajax("http://localhost:32972/SimpleMemberInfo.svc/GetMemberInfoById", { cache: false, beforeSend: function (xhr) { $.mobile.showPageLoadingMsg(); }, complete: function () { $.mobile.hidePageLoadingMsg(); }, contentType: 'application/json', dataType: 'json', type: 'GET', error: function () { alert('Something awful happened'); }, success: function (data) { var s = ""; s += "
  • " + data + "
  • "; $("#myList").html(s); } }); });

    您需要使用JSONP进行跨域调用以绕过浏览器限制,并将crossDomainScriptAccessEnabled设置为true的web.config更新为圆形服务器。 答案中有一个很好的例子: 如何避免使用jquery ajax中的跨域策略来使用wcf服务?

    您可能还有GET请求问题。 尝试这里概述的修复: 使WCF Web服务与GET请求一起工作

    总而言之,您需要一个看起来像这样的web.config:

                            

    (请注意,服务和端点都附加了行为,分别允许webHttp调用和httpGet调用,并且绑定具有显式启用的crossDomain访问权限)。

    ……这样的服务方法:

     [ServiceContract] public interface IMyService { [WebGet] // Required Attribute to allow GET [OperationContract] string MyMethod(string MyParam); } 

    …和使用JSONP的客户端调用:

      

    然而它是一个旧线程,但我想添加我对我遇到的问题的评论以及我为CORS工作所获得的解决方案。 我正在以下环境中开发Web服务:

    1. WCF Web服务。
    2. .NET 3.5框架。
    3. 在现有的asp.net网站中添加了wcf web服务。
    4. Visual Studio 2008

    大多数人提到在web.config中的下的标记中添加crossDomainScriptAccessEnabled属性。 我不确定这是否有效,但它在3.5版本中不可用,所以我别无选择。 我还发现在web.config中添加以下标记将起作用…

    但没有运气……继续得到405方法不允许错误

    在使用这些选项挣扎很多之后,我找到了另一种解决方案,可以动态地在global.asax文件中添加这些头文件,如下所示……

     protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } } 

    并从web.config中删除。 发布网站并继续到客户端jquery / ajax …您将从api调用获取数据。 祝好运!

    只是想在底部附加CORS返工的一些问题 – 它的问题是如果你的输入不支持GET和POST方法,OPTIONS请求实际上并没有返回正确的允许头。 它真的没有看到WCF端点上实际允许哪些方法 – 当客户端执行OPTIONS请求时,它只是人为地说“GET,POST”允许应用程序中的每个端点(实际上是客户端询问什么得到支持)。

    这可能没问题,如果你真的不依赖于OPTIONS方法中的信息来返回一个有效的方法列表(就像一些CORS请求那样) – 但是如果你这样做,你需要做类似的事情。关于这个问题的解决方案: 如何使用WCF自托管处理Ajax JQUERY POST请求

    基本上,每个端点应该实现:

    Webinvoke(Method="OPTIONS", UriTemplate="")

    并调用一个适当的方法,将适当的头加载到响应者(包括该端点的正确“访问控制允许 – 方法”列表)给调用者。 托管的WCF端点不会自动为我们执行此操作,但这是一种允许更好地控制端点的解决方法。 在该解决方案中,在端点实现处加载适当的响应头:

     public void GetOptions() { // The data loaded in these headers should match whatever it is you support on the endpoint // for your application. // For Origin: The "*" should really be a list of valid cross site domains for better security // For Methods: The list should be the list of support methods for the endpoint // For Allowed Headers: The list should be the supported header for your application WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*"); WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization"); } 

    试着用。 WebInvoke(Method = "POST")而不是WebInvoke(Method = "GET")