Ajax请求使用ServiceStack返回空响应

时间:2013-02-23 01:42:25

标签: rest servicestack cors

总计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();
                }
            });

1 个答案:

答案 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数据源,所以我已经不得不去代理路由,或者转储框架,或者找到一些解决我的问题的方法。