从JavaScript访问WCF WebService - 对预检请求的响应没有通过访问控制检查

问题描述:

我正在使用WCF(.svc)WebService,它的工作完美 - 我可以在没有Postman,PHP等问题的情况下调用它的方法。但是,当我尝试从调用它时,JavaScript/jQuery使用AJAX,存在一个明显的问题 - 我从WS以外的其他域执行它,所以它不会让我这样做。从JavaScript访问WCF WebService - 对预检请求的响应没有通过访问控制检查

这完全是关于POST方法。但即使我的网页首先发送OPTIONS方法的问题:

OPTIONS 'WS地址' 405(不允许的方法)

的XMLHttpRequest无法加载'WS地址'对预检请求的响应不会 通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头 。产地'我的地址'因此不允许 访问。响应有HTTP状态代码405

有详细的答复:

Responses

好吧,我读到跨域和WS的Web.config包含所有的它是必要的(? )

Web.config

请让我知道我做错了,我不能达到从JavaScript我的WS,尽管在我看来,C ^形状良好。但仍然,似乎不发送这些特殊的标题作为回应...在此先感谢。

+0

405代码表示您的服务器配置为禁止OPTIONS请求。这就是*方法不允许*消息的含义。您必须将其配置为使用200或204成功消息和正确的Access-Control-Allow- *标头响应OPTIONS请求。至于如何做到这一点,听起来像你需要阅读更多的文档,并进一步研究 - 开始在https://stackoverflow.com/questions/16024347/cross-origin-resource-sharing-for-c-sharp- wcf-restful-web-service-hosted-as-wind/16039951#16039951&https://stackoverflow.com/questions/43911702/405-method-not-allowed-wcf-service-and-ionic – sideshowbarker

XML HttpRequest允许将数据从Web服务器传输到浏览器。但是,浏览器默认阻止CORS。 GET请求不会改变服务器端的任何内容(没有任何内容会被创建/更新/删除) - 它只会返回一些数据。

但是,POST/PUT/DELETE请求会处理请求并在服务器端改变某些内容并向浏览器发出响应。如果响应没有正确的Access-Control-Allow-Origin标题,浏览器将阻止响应。但是这并不重要,因为在响应发出时,服务器已经处理了请求并进行了更改,可能是对数据库进行了更改。

为了防止在服务器端处理POST/PUT/DELETE请求,浏览器会发送一个preflight request

prefligth请求是使用方法OPTIONS的http请求。因此,在发送POST请求之前,浏览器将发送一个OPTIONS请求,并附带一个名为Access-Control-Request-Method的标题,其值为POST。

405 (Method Not Allowed)错误表示服务器未配置为接受OPTIONS请求。

您可以使用通配符类似这样您的Web调用方法解决这个问题:

[OperationContract] 
[WebInvoke(Method = "*", UriTemplate = "/Path", ResponseFormat = WebMessageFormat.Json)] 

或通过添加额外的[OperationContract][ServiceContract],处理OPTIONS请求与此类似:

[OperationContract(Name = "OptionsMyFunction")] 
[WebInvoke(Method = "OPTIONS", UriTemplate = "/Path", ResponseFormat = WebMessageFormat.Json)]