总计n00b,当谈到宁静的东西,ajax,等等,所以请保持温柔。
我有一个问题,我已经采用了示例ServiceStack“Todo”服务,并且正在尝试使用此服务作为数据源开发移动客户端。我正在努力学习它是如何工作的所以我可以构建一个特定的服务,我觉得SS更适合与WCF / WebAPI相对。
无论如何,我们假设该服务正在http://localhost:1234/api/todos
上运行
我已经启用了CORS支持,基于将各种其他帖子中的信息拼凑在一起。
所以我的配置功能如下所示:
Plugins.Add(new CorsFeature());
this.RequestFilters.Add((httpReq, httpRes, requestDto) =>
{
httpRes.AddHeader("Access-Control-Allow-Origin", "*");
//Handles Request and closes Responses after emitting global HTTP Headers
if (httpReq.HttpMethod == "OPTIONS")
{
httpRes.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
httpRes.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
httpRes.StatusCode = 204;
httpRes.End();
}
});
我在TodoService上有这样的服务方法:
[EnableCors]
public object Post(Todo todo)
{
var t = Repository.Store(todo);
return t;
}
使用浏览器(FF / IE)如果我称之为ajax函数:
var todo = { content: "this is a test" };
$.ajax(
{
type: "POST",
contentType: "application/json",
data: JSON.stringify(todo),
timeout:20000,
url: "http://localhost:1234/api/todos",
success: function (e) {
alert("added");
app.navigate("Todo");
},
error: function (x, a, t) {
alert("Error");
console.log(x);
console.log(a);
console.log(t);
}
}
);
来自http://localhost:1234
,然后一切正常。 todo被添加,并且在success函数中,“e”包含服务创建的返回的todo对象。
但是,如果我从其他任何地方(http://localhost:9999
即运行移动客户端应用程序的asp.net dev服务器)调用它,那么,虽然Service方法执行,并且todo确实在服务器端添加,返回jquery的响应为空,它立即触发错误函数。
我确信我正在做一些愚蠢的事,但我不能为我的生活看到它。 有人有任何线索吗?提前谢谢......
更新:现在似乎工作正常,问题似乎是
httpRes.AddHeader("Access-Control-Allow-Origin", "*");
在“OPTIONS”块之外。 所以在apphost中运行的代码是
Plugins.Add(new CorsFeature());
this.RequestFilters.Add((httpReq, httpRes, requestDto) =>
{
//Handles Request and closes Responses after emitting global HTTP Headers
if (httpReq.HttpMethod == "OPTIONS")
{
httpRes.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
httpRes.AddHeader("Access-Control-Allow-Origin", "*");
httpRes.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
httpRes.StatusCode = 204;
httpRes.End();
}
});
答案 0 :(得分:4)
所以事实证明我的原始代码存在问题; amdended代码是:
Plugins.Add(new CorsFeature());
this.RequestFilters.Add((httpReq, httpRes, requestDto) =>
{
//Handles Request and closes Responses after emitting global HTTP Headers
if (httpReq.HttpMethod == "OPTIONS")
{
httpRes.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
//this line used to be outside the if block so was added to every header twice.
httpRes.AddHeader("Access-Control-Allow-Origin", "*");
httpRes.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
httpRes.StatusCode = 204;
httpRes.End();
}
});
因此,CorsFeature()插件似乎正确处理POST的所有CORs内容,GET和RequestFilter正在处理飞行前的OPTIONS请求(混淆 - 为什么插件只处理OPTIONS请求? );在旧代码中,每个请求(插件和过滤器)都会添加两次allow-origin标头,这似乎让jquery或浏览器感到困惑。
不是我完全理解这一点,我有一些阅读要做:)而且无论如何都是因为我使用的移动框架(DXTreme)似乎无法处理除JSONP以外的任何东西(没有好处)对我来说,因为我需要POST / PUT)用于跨域Rest数据源,所以我已经不得不去代理路由,或者转储框架,或者找到一些解决我的问题的方法。