2011-06-03 97 views
19

大多數ajax框架似乎都使用標題或查詢字符串中的「X-Request-With」標準化。在ASP.NET上檢測JSON請求的最佳方式是什麼?

而在ASP.NET MVC可以使用擴展方法

Request.IsAjaxRequest() 

因爲一個AJAX客戶端可以請求多種不同的內容類型,不只是「應用/ JSON」例如:「應用程序/ XML」。

我正在使用下面的代碼片段/擴展方法,但我很想看看別人在做什麼,或者如果有什麼我錯過了,或者更好的方法。

public static bool IsJsonRequest(this HttpRequestBase request) 
{ 
    return request.Headers["Accept"].Split(',') 
     .Any(t => t.Equals("application/json", StringComparison.OrdinalIgnoreCase)); 
} 

在此先感謝。

+0

爲什麼你需要檢測JSON接受類型?我只是好奇,因爲我使用單獨的方法JSON結果 – xelibrion 2011-06-03 05:30:35

+4

@Xelibrion我想重複使用相同的動作,沒有重複的點,如果唯一的區別是結果類型,我可以很容易地檢測到上面的代碼。 – Dax70 2011-06-09 22:37:47

回答

4

爲什麼你不能只傳遞一個布爾變量,說你正在請求的客戶端的IsJsonRequest?

然後檢查一下行動方法。

您可以使用該請求的接受標頭。這表明客戶希望服務器發送給它的內容類型。

+0

這有點多餘,因爲大多數ajax api已經擁有該信息或默認它。例如:請參閱http://api.jquery.com/jQuery.ajax/ – Dax70 2011-06-09 22:36:09

+0

上的「dataType」試試這個Request.ContentType.StartsWith(「application/json」,StringComparison.OrdinalIgnoreCase) 它應該工作! – Lamps 2011-06-10 04:22:51

+1

@Bhaskar,謝謝,但那不起作用。我在下面的評論中提到,Request.ContentType是一個空字符串,但帶有「application/json」的頭部就在那裏。 – Dax70 2011-06-10 05:30:46

0

您可以在任何控制器方法使用的是使用

Request.ContentType 

。如果你需要它在多個地方工作,你也可以把它放在ActionFilterAttribute中。

+0

謝謝,但Request.ContentType不起作用,顯示「」(空字符串)。 – Dax70 2011-06-09 22:32:19

+0

您能否請求發佈您的請求代碼? – Lamps 2011-06-10 04:27:34

0

您可以使用

Request.IsAjaxRequest() 

所以,你可以檢查

if (Request.IsAjaxRequest()) 
{ 
    return new JsonResult(); 
} 
return ActionResult 
+0

他想識別請求是否是JsonRequest。 你的代碼正在檢查它是否是AjaxRequest。 – Lamps 2011-06-09 08:27:41

+0

謝謝,但如果你看看我的例子,我已經檢查過了。然而,ajax請求可以在部分(使用MVC)的情況下請求xml甚至html。我正在尋找過濾器來請求具體的JSON。 – Dax70 2011-06-09 22:33:45

19

您應該使用請求的accept header這一點。這表明客戶希望服務器發送給它的內容類型。

請勿使用請求的content type標頭 - 這表示請求消息的正文的類型。通過一切手段將它設置爲「application/json」,如果你正在POST或者將一些Json發送給服務器,但是如果你正在發出GET請求,那麼內容類型應該是空的(因爲GET請求的主體是空的)如果您發佈多部分表單或其他內容,則應該反映該類型。

Web上表單的行爲是將請求內容類型設置爲'multipart/form-data',接受類型設置爲'text/html'。在Web上,重載服務器以使其返回與請求內容類型相同的類型,而忽略接受類型標題意味着發佈的表單返回編碼後的表單數據而不是HTML頁面。這顯然不是正確的行爲,所以不要圍繞請求內容類型的這種解釋來構建應用程序。

+2

+1地獄! – giammin 2014-01-10 16:35:39

4

我發現Pete Kirkham answer非常有用。我認爲這應該被標記爲解決方案。

這是根據它我的代碼:

/// <summary> 
/// Determines whether the request is a Json Request 
/// </summary> 
public static bool GetIsJsonRequest(HttpRequest request) 
{ 
    if (request == null) 
    { 
     throw new ArgumentNullException("request"); 
    } 
    bool rtn = false; 
    const string jsonMime = "application/json"; 

    if (request.AcceptTypes!=null) 
    { 
     rtn = request.AcceptTypes.Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase)); 
    } 
    return rtn || request.ContentType.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase)); 
} 

--- UPDATE ---

Foollowing @Mvision suggestion這是MVC版本:

public static bool GetIsJsonRequest(HttpRequestBase request) 
{ 
    if (request == null) 
    { 
     throw new ArgumentNullException("request"); 
    } 
    bool rtn = false; 
    const string jsonMime = "application/json"; 

    if (request.AcceptTypes!=null) 
    { 
     rtn = request.AcceptTypes.Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase)); 
    } 
    return rtn || request.ContentType.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase)); 
} 

如果您需要使用此方法在asp.net classic和MVC中,第二個是建議的。 要轉換HttpRequestHttpREquestBase只是HttpRequestWrapper把它包:

public static bool GetIsJsonRequest(HttpRequest request) 
{ 
    return GetIsJsonRequest(new HttpRequestWrapper(request)); 
} 
+0

有趣的解決方案,因爲filterContext.HttpContext.Request是一個HttpRequestBase,你可以安全地改變你的代碼,以接受一個HttpRequestBase,使它對我們更友好MVC傢伙試圖在屬性中使用它:) – 2015-03-30 15:25:16

+1

@Mvision好點!但我是一個老aspnet人:D和我不想每次都包裝我的請求:'新的HttpRequestWrapper(Context.Request)'。無論如何,我更新了我的年輕MVC傢伙的答案:DD – giammin 2015-03-31 08:45:50

0

希望這將是更有效的

public static class JsonResultController 
{ 
    public static bool IsJsonRequest(this HttpRequestBase request) 
    { 
     return GetIsJsonRequest(request); 
    } 

    public static bool IsJsonRequest(this HttpRequest request) 
    { 
     return GetIsJsonRequest(request); 
    } 

    private static bool GetIsJsonRequest(dynamic request) 
    { 
     if (request == null) 
     { 
      throw new ArgumentNullException("request"); 
     } 
     bool rtn = false; 
     const string jsonMime = "application/json"; 

     if (request.AcceptTypes != null) 
     { 
      rtn = (request.AcceptTypes as string[]).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase)); 
     } 
     return rtn || (request.ContentType as string ?? "").Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Any(t => t.Equals(jsonMime, StringComparison.OrdinalIgnoreCase)); 
    } 
} 
相關問題