2013-02-07 56 views
2

我試圖讓使用Ajax WCF函數的調用如下:setRequestHeader不添加請求頭WCF調用

$.ajax({ 
     url:http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?', 
     dataType: 'json', 
     beforeSend : function(xhr) { 
      xhr.setRequestHeader("Authorization", "BasicAuthTest"); 
     }, 
     success: function(trackingData) { 
      alert("success"); 
     } 
    }); 

WCF代碼beaking並receving請求

public class CustomUserNameValidatorBasic : ServiceAuthorizationManager 
    { 
     protected override bool CheckAccessCore(OperationContext operationContext) 
     { 
      try 
      { 
       var msg = operationContext.RequestContext.RequestMessage; 

       // If user requests standart help-page then ignore authentication check. 
       if (msg.Properties.ContainsKey("HttpOperationName") && msg.Properties["HttpOperationName"].ToString() == "HelpPageInvoke") 
       { 

        return base.CheckAccessCore(operationContext); 
       } 

       var httpRequestHeaders = ((HttpRequestMessageProperty) msg.Properties[HttpRequestMessageProperty.Name]).Headers; 

       // Is Authorization-header contained in http-headers? 
       if (!httpRequestHeaders.AllKeys.Contains(HttpRequestHeader.Authorization.ToString())) 
       { 
        //code returns here 
        return false; 
       } 

        return false; 

      } 
      catch (Exception e) 
      { 
       return false; 
      } 

     } 
    } 

由於顯示「授權」標頭不包含在req標頭陣列中

enter image description here

在螢火蟲在請求報頭爲Ajax reqeuest:

請求Headersview源 接受/接受編碼的gzip,放氣
接受語言的en-US,連接; Q = 0.5緩存控制最大年齡= 0
連接保持活動主機test.proxyU.com If-Modified-Since Wed,21 Mar 2012 19:46:56 GMT If-None-Match「e0818-17278-4bbc60dc86c00」
User-Agent Mozilla/5.0(Windows NT 6.1; WOW64; RV:16.0)
的Gecko/20100101火狐/ 16.0

更新:考慮回答以下我已經試過3種方法如下他們沒有添加標題。所有調用wcf正確,但`授權'標題只是沒有在請求。如果我看的HTTP請求頭看起來非常像屏幕截圖我張貼以上

方法1

$.ajax({ 
     url: "http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?'", 
     beforeSend: function(xhr){xhr.setRequestHeader("Authorization", "BasicAuthTest");}, 
     success: function(trackingData) { 
      alert("success"); 
     } 
    }); 

方法2

$.ajax({ 
     url: "http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?'", 
     headers: {"Authorization": "BasicAuthTest"}, 
     success: function(trackingData) { 
      alert("success"); 
     } 
    }); 

方法3

$.ajax({ 
     url: "http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?'", 
     beforeSend : function(xhr, settings) { 
      $.extend(settings, { headers : { "Authorization" : "BasicAuthTest" } }); 
     }, 
     success: function(trackingData) { 
      alert("success"); 
     } 
    }); 
+0

在瀏覽器中使用開發人員工具(通常爲F12)並檢查是否添加了頭部請求。 – STO

+0

我更新了標題 – PUG

+0

@jaminator jquery的版本是什麼? – drch

回答

0

是它是一個跨領域的問題,我用this Visual Studio項目模板,並將其製成事情相當簡單。這裏也有一個工作示例,用於從服務獲取http

+0

你能解釋一下你在本地主機上修復這個問題嗎?我有完全一樣的問題。 –

+0

只是使用上面鏈接的項目模板,它有一個工作示例 – PUG

1

從文檔上setRequestHeader()

必須調用setRequestHeader()後的open(),但發送之前()。

望着jQuery source,開放式()調用的send()所以在beforeSend()

在$就關於頭jQuery的文檔說,你無法通過XHR對象設置的頭:

該設置在beforeSend函數被調用之前設置;因此,可以在beforeSend函數中覆蓋標題設置中的任何值。

因此,您可以通過設置對象更新beforeSend(xhr,settings)中的標題,jQuery將會選擇它們。

$.ajax({ 
    url:http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?', 
    dataType: 'json', 
    beforeSend : function(xhr, settings) { 
     $.extend(settings, { headers : { "Authorization", "BasicAuthTest" } } 
    }, 
    success: function(trackingData) { 
     alert("success"); 
    } 
}); 

或者,你可以在頭參數傳遞到您的$。阿賈克斯()調用:

$.ajax({ 
    url: ..., 
    headers : { "Authorization", "BasicAuthTest" } 
}; 
+0

考慮到你的回答的更新問題 – PUG