如何为自托管 WCF 服务启用跨域调用

Posted

技术标签:

【中文标题】如何为自托管 WCF 服务启用跨域调用【英文标题】:How to enable cross domain calls for self hosted WCF service 【发布时间】:2013-10-06 10:04:30 【问题描述】:

我创建了一个在 Windows 机器上运行的自托管 WCF 服务。现在我想使用 AJAX 调用来使用服务的操作。在 iExplorer、Firefox 和 Chrome 中,我都没有得到预期的 JSON 流。

我必须向自托管服务添加什么才能允许跨域调用?

问候 西蒙

【问题讨论】:

你使用什么绑定? WCF 服务如何托管(进程?IIS?) webHttpBinding,它在 windows 中作为服务托管,使用 ServiceBase.Run(new ioNotificationService()); 【参考方案1】:

http://pranayamr.blogspot.se/2011/06/calling-cross-domain-wcf-service-using.html 似乎是一篇有效的文章。您需要相应地配置您的服务。这在过去对我有用。

【讨论】:

那篇文章建议添加 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]。在 ASP 中,我假设这篇文章是指 Web 托管服务。我的问题涉及自托管服务。 有人知道自托管服务的解决方案吗?【参考方案2】:

您必须添加额外的方法来公开跨域策略,

http://blogs.msdn.com/b/carlosfigueira/archive/2008/03/07/enabling-cross-domain-calls-for-silverlight-apps-on-self-hosted-web-services.aspx

【讨论】:

【参考方案3】:

对于托管在 localhost\Service.mv​​c 上的 Service GetPerson,请使用:

$.ajax(
            type: 'GET', //GET or POST or PUT or DELETE verb
            url: 'Service.svc/GetPerson', // Location of the service
            data: userid, //Data sent to server
            contentType: 'application/json; charset=utf-8', // content type sent to server
            dataType: 'json', //Expected data format from server
            processdata: true, //True or False
            success: function (data) //On Successfull service call
                alert(data.Name);
            ,
            error: function (msg) // When Service call fails
                alert(msg);
            
        );

链接:http://www.cleancode.co.nz/blog/1041/complete-example-wcf-ajax-ssl-http

【讨论】:

但这是否回答了有关跨域调用的问题?我不这么认为。如果此 JQuery 代码托管在与服务不同的域上,则此代码将失败,或者换句话说,您的浏览器将执行 ajax 请求但不会接收任何数据。那是我的问题。 你能从客户端电脑ping到服务器电脑吗?您可以解析名称(通常通过 ping . 吗?如果可以 - 将 (.) 作为您的 URL。 是的,我可以到达服务器,请求返回 HTTP/1.1 200 OK 但没有收到 JSON 流。 这看起来很奇怪。您确定您正在查看 REST 请求吗?我只是在其余 URL 中使用完整的计算机名称,一切都很好。 非常感谢您的意见。当我在 url 栏中输入 web 服务的地址时,我得到一个 JSON 流,当我通过 html 页面发送 ajax 请求时,该页面没有收到任何 JSON 流。正如我所假设的,这是因为浏览器的跨域策略不允许对位于与调用 javascript 代码相同域的其他任何位置的 web 服务进行 ajaw 请求。对于 IIS 上的 Web 服务,我可以通过将文件添加到 Web 服务的根目录来解决此问题。但是对于作为 Windows 服务安装的自托管 Web 服务,我正在寻找新的答案。

以上是关于如何为自托管 WCF 服务启用跨域调用的主要内容,如果未能解决你的问题,请参考以下文章

如何为现有的 WCF 服务原生启用 JSONP?

如何为 WCF 指定自定义 SoapAction

启用从 jQuery ajax 到不在 IIS 中托管的 WCF 服务的 CORS POST

是否可以在 IE 中进行从 https 到 http 的跨域请求?

从 JQuery 调用 WCF 服务:跨域 OPTIONS 请求给出错误 400

WCF 跨域策略安全错误