2014-01-06 99 views
0

我正在寫一些使用jQuery進行web服務調用的JavaScript。JSONP問題

  • 該webservice是我寫的(用C#),所以我完全控制它。
  • 該webservice正在寫入一些值到數據庫。
  • Web服務是不是在同一個域中的網站
  • 的Web服務將包含JSON.stringified參數的所有需要​​提交的值

我有幾個問題:

  1. 如果webservice拋出異常(例如主鍵約束),這是否會導致jQuery Ajax異常?

  2. 如果我想返回一個值,比如受影響的行數,是否必須使用JSONP(因爲它是跨域的)?

更新:我要支持IE8,所以CORS是不是一種選擇。由於@Volodymyr和@mcv用於指出選項

回答

1
  1. 這取決於它在C#中怎麼做,如果它會拋出異常,並響應代碼不會是200則是你會在jQuery的阿賈克斯有錯誤,可以爲錯誤添加事件,如果C#亙古不變拋出異常那麼它將成爲jQuery的成功事件,但可能你會得到不同的狀態響應json。既然你有完全的控制權,那麼你可以做你想做的事。
  2. 不過,如果你有控制,你可以做以下

    公共類AllowCrossSiteAttribute:ActionFilterAttribute {

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
        if (actionExecutedContext.Response != null) 
        actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*"); 
         base.OnActionExecuted(actionExecutedContext); 
        } 
    } 
    

    }

一下添加到您的代碼(請不,在這裏你允許所有的域名,但你可以用你的域名列表替換「*」),然後在web api控制器上添加這個屬性

或者使用網絡配置

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
<add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" /> 
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 
+0

我必須支持IE8,因此CORS不是一種選擇。對不起,我在問答中沒有說清楚,但我認爲你的第一個答案解決了我的一些問題 – jasonscript

0
  1. 如果Ajax調用從服務器獲取錯誤代碼,您error()回調函數被調用,而不是你success()回調。根據您的服務器端框架,您可能能夠捕獲異常並仍然傳遞一些有關錯誤的有用數據以及http錯誤代碼。但是,如果你不處理它,Ajax調用可能會收到一堆無用的HTML和一個錯誤代碼。無論你做什麼,一定要發送一個錯誤代碼,以防出現錯誤。

  2. 在舊版瀏覽器上,是的。但是您將無法使用jsonp執行POST,因此您的所有數據都必須進入請求參數。如果您只關心現代瀏覽器,更好的解決方案是在服務器響應中設置一個Access-Control-Allow-Origin標頭。有關更多信息,請參閱How does Access-Control-Allow-Origin header work?

+0

不幸的是,我要支持IE8,所以CORS是不是真的我的選擇呢。我對服務器端異常處理更感興趣:如果我寫了類似於(在C#中)'System.Web.HttpContext.Current.Response.Status = 404'的東西,AJAX請求會不會收到? – jasonscript

+0

我不知道C#如何處理http請求,但如果http響應的狀態爲404,那麼JQuery將會注意並調用您的錯誤回調。 – mcv