2016-11-03 19 views
2

我是angularjs的新手,嘗試使用angularjs客戶端來使用wcf寧靜服務。初期我嘗試了http.get(url)並獲得了CORS問題我通過在我想調用的wcf服務方法中添加以下代碼來解決問題。使用Angularjs和wcf寧靜服務製作http.post時發生CORS問題

WebOperationContext.Current.OutgoingResponse.Headers.Add( 「訪問控制允許來源」, 「」); WebOperationContext.Current.OutgoingResponse.Headers.Add(「Access-Control-Allow-Methods」,「POST,GET,OPTIONS」); WebOperationContext.Current.OutgoingResponse.Headers.Add(「訪問控制允許報頭」,「內容類型,接受」);當我發了帖子調用(http.post)同*

現在我的方式得到我得到的迴應與CORS問題。

但是,當我試圖通過JSON對象,同時發佈帖子時,我再次開始獲取CORS問題。

我的后角碼爲:

var requestData = { 
      RequestUserName: "Abc1", 
      RequestPass: "123" 
     }; 

     var req = { 
        method: 'POST', 
        url: 'url', 
        headers: { 
         'Content-Type': 'application/json; charset=utf-8' 
        }, 
        data: requestData 
     }; 
     $http(req).success(function(){console.log("Success"); 
     $scope.userDetails = response.UserNameAuthenticationResult;}).error(function(){console.log("Error");}); 

我的WCF經營合同看起來如下:

[WebInvoke(Method="POST",UriTemplate="/Authenticate" 
      ,RequestFormat=WebMessageFormat.Json 
      ,ResponseFormat=WebMessageFormat.Json 
      ,BodyStyle = WebMessageBodyStyle.Wrapped)] 

     string UserNameAuthentication(Request request); 

和方法的實現如下:

public string UserNameAuthentication(Request request) 
     { 
     WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*"); 
     WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "POST,GET,OPTIONS"); 
     WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept"); 

      return "true"; 
     } 

而且錯誤我得到如下:

**選項URL(匿名函數)@ angular.js:11442sendReq @ angular.js:11235serverRequest @ angular.js:10945processQueue @ angular.js:15552(匿名函數)@ angular.js:15568 $ @ EVAL angular.js:16820 $ digest @ angular.js:16636 $ apply @ angular.js:16928(匿名函數)@ angular.js:24551defaultHandlerWrapper @ angular.js:3398eventHandler @ angular.js:3386 localhost /:1 XMLHttpRequest無法加載 ​​。對 預檢請求的響應未通過訪問控制檢查:否 「所請求的 資源上存在」Access-Control-Allow-Origin「標頭。原因'http://localhost:14703'因此不允許 訪問。該響應具有HTTP狀態碼405。

+0

我認爲沒有什麼做angularjs。您需要在wcf應用程序中配置CORS。 [檢查出來](http://www.codeproject.com/Articles/845474/Enabling-CORS-in-WCF)。 –

+0

使用此插件:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl = en – Arjun

+0

這沒有幫助,我已經嘗試把這段代碼放在調用方法內部在wcf服務,但仍然是相同的錯誤。此外,因爲我已經構建了wcf服務作爲類庫,所以我沒有選擇添加global.asax文件,但我們確實在wcf應用程序中獲得了它,因此我在調用方法中添加了Headers代碼。 – Nishant

回答

0

CORS是瀏覽器和服務器設置之間的交互。

發佈請求和響應標頭將會很有用。

我假設您正在與位於不同域(如api.example.com)上的API(而不是www.example.com)進行交互。由服務器決定設置Access-Control-Allow-Origins響應頭。要允許所有來源作爲臨時措施,請將其設置爲「*」而不是空字符串,但很快應將其設置爲您網站的實際來源,例如www.example.com

實際上,您可能不希望它完全打開,因爲它可能是安全風險,有人可能會創建您的網站的假版本。

一個簡單的避免CORS的方法就是使用代理服務器。這樣所有請求都轉到同一個域(包括html和API)。如果運行Node應用程序,則可以使用node-http-proxy或類似的方法。如果您有自定義標題或數據,這也可以避免預檢請求。預檢請求是您在實際請求之前在API上看到的OPTIONS請求。

下面是預檢行爲的一些詳細信息: https://www.soasta.com/blog/options-web-performance-with-single-page-applications/

+0

嗨德里克,我已經嘗試了所有可能的方法來解決這個問題,但沒有運氣。不知道是否有我的JSON對象的問題,如果我發佈沒有JSON對象,它工作正常。我提到了我發佈數據的方式。不知道這是否是正確的方法。 – Nishant

+0

您是否可以複製粘貼來自Chrome開發人員工具的HTTP呼叫,然後我們可以查看標題和響應?具體來說,你可能會看到你的電話和第二次使用OPTIONS方法。如果您無法訪問Chrome開發工具或生產環境,也有像Fiddler和Moesif這樣的工具可以捕獲HTTP調用進行調試。 – Derric

+0

請求URL:http://本地主機:8733/Design_Time_Addresses/TestService的/登錄/身份驗證 請求方法:OPTIONS 狀態代碼:405不允許的方法 遠程地址:[:: 1]:8733 響應頭 觀點解析 HTTP/1.1 405方法不允許 允許:POST 內容長度:1565 內容類型:text/html;字符集= UTF-8 服務器:HTTPAPI/2.0 日期:星期六,2016年11月5日13點33分10秒GMT – Nishant

0

看起來像在服務器端沒有啓用CORS因爲OPTIONS方法是不理解。

也許試試這個:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
    { 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE, OPTIONS"); 

     HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
     HttpContext.Current.Response.End(); 
    } 
} 
+0

由於我使用WCF服務天秤座ry我無法添加Global.asax文件,它可以添加到WCF服務應用程序中。不過,我在我的調用方法中添加了一段代碼,它解決了我在發出沒有JSON對象的發佈請求時的問題,但是當我使用JSON對象發佈發佈請求時發生問題。我已經提到了我在頂部的問題中提出發佈請求的方式。 – Nishant

+0

您可以粘貼更新後的HTTP記錄的調用,這有助於調試。 – Derric