使用Breeze与另一个域中的WebApi服务

5

我如何使用现有的WebAPI服务与Breeze一起使用?请注意,我的WebAPI服务位于“server1 / api”,而Web应用程序位于“server2”。我尝试更改数据服务中的服务名称,但是出现了XMLHttpRequest异常101。这是跨域错误。是否可以使用来自另一个域的WebAPI服务与Breeze一起使用?

1个回答

14

跨域Breeze应用

是的,可以从一个服务器获取Breeze客户端应用程序,并使该Breeze应用程序与托管在不同服务器上的数据服务进行通信。

当服务配置为CORS时,在CORS-supportive浏览器上,Breeze客户端应用程序可以很好地实现跨域运行。

跨域问题和CORS解决方案属于Web安全问题的一般类别,这些问题不是特定于Breeze的。我们计划在Breeze网站的"Cool Breezes"部分发布有关CORS + Breeze的主题。


更新:2013年12月10日

本示例使用了一种原始的CORS实现,如果您已经升级到Web API2,则不再建议使用。请阅读这篇优秀的文章"ASP.NET Web API 2中的CORS支持",其中解释了基本的CORS以及如何启用Web API2 CORS支持。

其余部分保持原文不变。


带有CORS的Todo示例

在此之前,请查看Todo示例的代码。该示例的服务器已设置为CORS,并已部署到todo.breezejs.com,您可以通过查看Breeze Todo示例主题页面底部的jsFiddle来查看其实际效果。

四个注意点:

  • App_Start/BreezeSimpleCorsHandler.cs 完成了工作

  • App_Start/BreezeWebApiConfig.cs 打开它

// 此服务器启用了CORS
GlobalConfiguration.Configuration.MessageHandlers.Add(new BreezeSimpleCorsHandler());
  • 对于IIS7,您需要的Web.config 行(IIS8或VS2012的IIS Express不需要)

  • Scripts/app/dataservice.js 已准备好连接到外部服务器; 请参考以下代码:

    // * 跨域服务示例 * //var serviceName = 'http://todo.breezejs.com/api/todos'; // 在不同来源的控制器

希望现在能帮到您。


1
仍然没有CORS的完整端到端示例吗? - DATEx2
@DotNetWise,Todo示例对于这个特定目的不足之处在哪里? - Ward
为什么我在Todo中不需要这样做?也许你是说Todo的方法是“不合适”的。没关系,没有恶意 :)。但我想知道是什么使它“不合适”。 - Ward
1
@Ward - 我有一个使用Hot Towel作为客户端和WebApi项目作为服务器端的MVC应用程序。Metadata请求可以到达服务器(我的断点被触发),但是我在浏览器上得到以下错误(index):1:XMLHttpRequest不能加载http://localhost:63017/api/breeze/Metadata。Origin http://localhost:60325未经允许不被Access-Control-Allow-Origin许可。我按照上面的步骤进行了操作,但还是出现这个错误。var mgr = new breeze.EntityManager('http://localhost:63017/api/breeze'); - Carol AndorMarten Liebster
你有一个跨源问题。你的应用程序来自 localhost:60325,而 web api 来自 localhost:63017。最简单的解决方法是从相同的来源(相同的 Web 应用程序)提供应用程序资产和 web api。如果不可能,请了解 CORS。 - Ward
显示剩余5条评论

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