2014-10-19 20 views
0

這可能是一個愚蠢的問題,但這裏是我的簡單的WebAPI 2方法當我的ajax調用無法完成時,SoapUI如何繞開CORS問題?

public class ProductsController : ApiController 
    { 
     Product[] products = new Product[] 
     { 
      new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, 
      new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
      new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
     }; 

     public IEnumerable<Product> GetAllProducts() 
     { 
      return products; 
     } 

現在,如果我運行它,在我的電腦運行在http://localhost:3145/Products,我可以看到的產品作爲XML

它也適用於使用的soapUI

enter image description here

但現在,如果我嘗試用一​​個HTML文件,該JavaScript訪問此

 <script type="text/javascript"> 
      function GetProducts() { 


       $.ajax({ 
        url: "http://localhost:3145/Products", 
        dataType: "json", 
        success: function (data) { 
         for (var i = 0; i < data.length; i++) 
          $('#myDiv').append(data[i].Category).append("<br/>"); 
        }, 
        error: function (xhr, status) { 
         alert(xhr); 
        } 
       }); 
      } 

     </script> 
    </head> 
<body onload="GetProducts()"> 
    <h1>My App</h1> 
    <div id="myDiv"></div> 

我得到的CORS錯誤

enter image description here

如何SOAP UI不在這裏時,它是使用HTTP以及得到一個錯誤?

感謝

回答

2

把該索引文件記錄到一些服務器的位置,然後瀏覽頁面與服務器的URL一樣,http://localhost/virtual_dir/index.html,否則它會說file:///域名不匹配http://localhost:port。如果您將此頁面部署到其他域並開始使用,則可能面臨CORS issue

我已經看到您正在使用webapi,如果你把你的JS域,你可能面臨的問題CORS(「example1.com」),我的意思是文件從example1.com供應將有AJAX調用的WebAPI和的WebAPI可能託管在example2.com。這會引起CORS問題。瀏覽器將ajax調用限制到其他域,除非該域允許您調用。要做到這一點,你可以按照這個鏈接 - Angular.js $resource with ASP.Net webapi?(不要通過標題去)

我已經在那裏回答相同的情況。

0

我剛剛遇到了與我正在開發的網頁相同的情況,它需要將SOAP請求發送到由未啓用CORS的遠程服務器提供的Web服務。這是在一個測試環境中;在生產中,網頁和網絡服務從相同的域和端口提供。

當使用http時,SOAP UI在這裏還沒有得到錯誤?

是的,SoapUI和網頁瀏覽器都使用HTTP。但是SoapUI不是一個Web瀏覽器,並且不會共享相同的限制。

一位同事通過將我指向CORS Anywhere解決了這個問題。

  1. 安裝Node.js,如果你還沒有它。

  2. 安裝CORS Anywhere(npm install cors-anywhere)。

  3. 運行CORS Anywhere(node cors-anywhere.js)。

  4. 您可以使用CORS Anywhere(「在...上運行CORS Anywhere」)產生的消息中的域和端口,而不是使用原始的非啓用CORS的Web服務URL,並將原始Web服務URL路徑組件。

您可以指定任何地方CORS口的環境變量(或在當地的cors-anywhere.js副本編輯默認值)。

就我而言,生產Web服務URL在網頁中被硬編碼爲相對路徑。但是我添加了代碼,它從片段標識符(「哈希字符串」)中的參數中讀取一個URL,覆蓋默認的Web服務URL。

例如:

http://localhost:8081/mywebpage.html#url=http://localhost:8089/remote.domain.com:8085/servicename

其中:

  • http://localhost:8081/mywebpage.html是我的網頁(我使用http://,不file://,這個)。

  • http://localhost:8089是CORS Anywhere代理。

  • remote.domain.com:8085/servicename(您可以放棄領先的http://)是遠程的,不支持CORS的Web服務。

相關問題