Breeze.js返回错误&#39 ;; ' (分号+空格)

时间:2014-04-29 23:22:05

标签: javascript breeze

昨天我的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数据服务进行跨域调用?

2 个答案:

答案 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

请重新考虑您的手动CORS工作。 Web API v.2提供了一个很好described by Mike Wasson的CORS工具。你知道吗?如果是这样,您是否有理由不使用它(因为您似乎没有使用它)?