昨天我的Breeze代码正在使用我的WCF数据服务。
然后今天它刚刚停止工作!当我运行查询时,我收到错误消息&#39 ;; ' (一个分号和一个空格)来自微风。
错误对象中的其他所有内容看起来都很正常(我是微风的新手,因此可能有一些我不知道的东西。)
知道可能导致这种情况的原因吗?
更新
当我在调试器中运行我的WCF数据服务时(在我的机器上)一切正常!但是当我在服务器上托管它时,我得到了上述错误。
我唯一能想到的是跨域的东西不能正常工作。这是我的跨域代码:
protected void Application_BeginRequest(object sender, EventArgs e)
{
EnableCrossDomain();
}
static void EnableCrossDomain()
{
string origin = HttpContext.Current.Request.Headers["Origin"];
if (string.IsNullOrEmpty(origin)) return;
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", origin);
string method = HttpContext.Current.Request.Headers["Access-Control-Request-Method"];
if (!string.IsNullOrEmpty(method))
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", method);
string headers = HttpContext.Current.Request.Headers["Access-Control-Request-Headers"];
if (!string.IsNullOrEmpty(headers))
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", headers);
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.StatusCode = 204;
HttpContext.Current.Response.End();
}
}
以下是我如何调用它的示例:
function getBags() {
var bags;
var query = breeze.EntityQuery.from('Bags');
return manager.executeQuery(query).then(querySucceded, _queryFailed);
function querySucceded(data) {
bags = data.result;
logSuccess("Retrieved Bag Data")
return bags;
}
}
function _queryFailed(error) {
logError(config.appErrorPrefix + "Query Failed: " + error.message);
throw error;
}
是否有更好的方法允许使用Breeze和WCF数据服务进行跨域调用?
答案 0 :(得分:3)
我遇到了类似的问题,得到了&#34 ;; "错误消息,我也使用CORS。在尝试为您的响应找到正确的处理程序时,Breeze会收到错误。它没有获得" DataServiceVersion"的价值。在返回的标题中,Breeze在response.body.message中查找错误消息,但这是空的,所以你只能获得&#34 ;; &#34 ;.理想情况下,此错误报告应该有一些友好的文本告诉您正文消息是空的或不存在。
我的解决方法是在他的回答中使用Ward提供的链接来使用Mike Wasson CORS设置。我以前一直在使用在Breeze提供的ToDo应用程序示例中使用的SimpleCorsHandler.cs类,但是没有返回" DataServiceVersion"在" Access-Control-Allow-Headers" OPTIONS请求的标头值。我不确定我是否可以配置SimpleCorsHandler来解决这个问题;删除SimpleCorsHandler并在WebApiConfig.cs的Register方法中使用这两行是ealiser:
var cors = new EnableCorsAttribute("*", "*", "*", "DataServiceVersion, MaxDataServiceVersion");
config.EnableCors(cors);
(有关参数的更多信息,请参阅EnableCorsAttribute文档;对于第一个使用" *"不是一个好主意,但这只是一个示例。)Breeze仍然为每个运行OPTIONS请求然后,服务调用执行GET请求,具体取决于OPTIONS响应,现在包括允许DataServiceVersion标头。 GET请求获取DataServiceVersion标头(我的值为3.0),错误消失了。
答案 1 :(得分:0)
我会看看@Guilherme所建议的意外缩小和丢失分号;除了logSuccess
之后的其他人,您可能还有其他人。
请查看" Debugging Query Result Mysteries"中的步骤,特别注意实际通过电线传输的内容;浏览器工具或Fiddler可能会在这里提供帮助。
您实施CORS的努力不太可能是原因,但它是可能的。您是否在致电Response
之前检查了.End()
的内容?当然,您始终可以从提交向后工作到代码工作的时间点。您正在使用版本控制,是吗?
我认为你已经消除了你的BreezeJS代码副本在昨天和今天"之间发生变化的可能性。
请重新考虑您的手动CORS工作。 Web API v.2提供了一个很好described by Mike Wasson的CORS工具。你知道吗?如果是这样,您是否有理由不使用它(因为您似乎没有使用它)?