2013-02-23 100 views
3

當涉及到安靜的東西,AJAX,等等所以請溫柔。Ajax請求返回空響應使用ServiceStack

我有一個問題,我採取了示例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,那麼它一切正常。待辦事項被添加並且在成功功能中,「e」包含服務創建的返回待辦事項對象。然而,如果我從其他任何地方(http://localhost:9999即運行移動客戶端應用程序的asp.net開發服務器)調用此方法,那麼雖然Service方法執行,並且待辦事項確實已添加到服務器端,但響應返回到jquery是空的,它立即打錯誤函數。

我相信我在做一些愚蠢的事情,但我不能爲我的生活看到它。 任何人都有任何線索?在此先感謝...

更新:那麼現在看來,以確定工作,這個問題似乎是

httpRes.AddHeader("Access-Control-Allow-Origin", "*"); 

「選項」塊之外。 因此,在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

如果它解決了您的問題,可能需要添加更新作爲問題的答案。這會讓其他人有類似問題 – levelnis 2013-02-24 10:31:17

+0

@levelnis,我會盡快知道問題已解決:) – 2013-02-24 11:26:16

+0

不夠公平。儘管如此,你仍然可以添加它作爲答案,不是嗎?只有在確認解決方案後才接受它。您的電話... – levelnis 2013-02-24 11:34:18

回答

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()插件似乎是正確處理所有CORS工具和POST,GET和飛行前的OPTIONS請求正在被RequestFilter(混淆處理 - 爲什麼沒有按」插件只處理OPTIONS請求?);在舊代碼中,allow-origin頭文件被每次添加兩次(通過插件和過濾器),這似乎令jQuery或瀏覽器感到困惑。

不是我完全理解這一點,我有一些閱讀要做:),因爲我使用的移動框架(DXTreme)似乎無法處理除JSONP以外的其他任何東西(無對我來說是好的,因爲我需要POST/PUT)來處理跨域的Rest數據源,所以我已經不得不去使用代理路由,或者轉儲框架,或者找到其他方式解決我的問題。

+0

注意:您應該將'httpRes.End()'更改爲'httpRes.EndServiceStackRequest()'以正確結束請求。 – mythz 2013-02-24 16:50:01

+0

@mythz - 謝謝,但是當我這樣做,它再次停止工作......我只看到預檢OPTIONS請求被髮送,並且我的ajax錯誤處理程序立即觸發,因爲沒有響應內容。 響應標頭現在顯示允許來源爲「*,*」,並且所有的允許方法都是重複的。我能夠得到這個工作的唯一方法是在上面的代碼中。現在比以往更加困惑! – 2013-02-24 19:07:39