簡體   English   中英

Web 服務在 chrome 中工作正常,但在 Firefox 和 IE 中不工作

[英]Web service work fine in chrome, but not in firefox and IE

我正在嘗試調用外部 Web 服務,它在 chrome 中可以正常工作,但在 Firefox 和 IE 中不行。 在 chrome 中,它返回'true' ,但在 firefox 中,它返回'0 error' ,這是我的完整代碼......

 <script type="text/javascript" src="js/jquery-1.3.1.min.js"></script>
<script type="text/javascript">

    $(document).ready(function () {
        $("#btnCall").click(function (event) {
            var campaignid = 1000007;
            var r_source_id = 1000008;
            var parameters = "{'CompanyName': '" + document.getElementById('txtCompanyName').value + "', 'name': '" + document.getElementById('txtName').value + "', 'title': '', 'email':'" + document.getElementById('txtEmail').value + "', 'phone':'" + document.getElementById('txtPhoneNo').value + "', 'web_url':'', 'no_of_emp':'0', 'c_Currency_id':'100', 'r_source_id':'" + r_source_id.toString() + "', 'industry_ID':'1', 'city':'', 'country_ID':'" + document.getElementById('ddlCountry').value + "', 'cur_solution':'','pur_timeline':'','comments':'', 'year_sell_erp':'2013', 'support':'', 'bpgroup_ID':'1', 'C_Campaign_ID':'" + campaignid.toString() + "', 'R_STATUS_ID':'1000033', 'C_Region_ID':'100', 'CreatedBy':'1000012', 'salesrep_id':'1000012', 'ad_org_id':'1000001', 'ad_client_id':'1000001', 'UpdatedBy':'100', 'AccessKey':'caff4eb4fbd6273e37e8a325e19f0991'}";
            $.ajax({
                type: "POST",
                url: "http://cloudservice.softwareonthecloud.com/service.asmx/SetLead",
                data: parameters,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async: false,
                success: function (msg) {
                    AjaxSucceeded(msg);
                },
                error: AjaxFailed
            });
        });
    });
    function AjaxSucceeded(result) {
        alert(result.d);
    }
    function AjaxFailed(result) {
        alert(result.status + ' ' + result.statusText);
    }  
</script>

這是我上傳了這個功能的URL 進行測試

您收到此錯誤是因為您嘗試調用另一個域上的 Web 服務。 這違反了同源政策 這是一個安全限制。 大多數較舊的瀏覽器會拒絕此類請求。

如果您想在 javascript 中訪問不同的域 web 服務,您將需要設置跨域資源共享

跨域資源共享 (CORS) 是一種機制,允許網頁向另一個域發出 XMLHttpRequest。 否則,根據同源安全策略,Web 瀏覽器將禁止此類“跨域”請求。 CORS 定義了一種瀏覽器和服務器交互的方式來決定是否允許跨域請求

如果您有權訪問網絡服務代碼,則可以在服務器上啟用 CORS 請求。
啟用 cors是一個很好的資源。 這是關於cors的一些解釋

在 IIS 7 上,您需要在 web.config 中設置一些自定義標頭。

<system.webserver>
 <httpprotocol>
  <customheaders>
   <add name="Access-Control-Allow-Origin" value="*" />
   <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customheaders>
 </httpprotocol>
</system.webserver>

這是IIS6的步驟

安全說明:例如,我已允許對服務器的所有請求。 如果您提供敏感數據,您可能希望將其限制為選定的域。

基於 WCF 的請求也可以通過WebOperationContext.Current.IncomingRequest進行檢查,並且可以發送適當的標頭。

舊版瀏覽器不支持 CORS 請求。 您可以在此處查看完整的瀏覽器兼容性列表

如果您必須支持較舊的瀏覽器,或者無法更改網絡服務,您始終可以在您的服務器上托管網絡服務代理。 您將請求發送到您的服務器,您的服務器從原始網絡服務請求數據。 這工作正常,因為它不會違反跨源策略。 一個簡單的 http 處理程序可以作為您服務器上的代理。

以下是 REST 網絡服務的示例 http 處理程序代理的樣子:

public void ProcessRequest(HttpContext context) {
  WebClient myClient = new WebClient(); 

  //Fetch response on your server
  string response = myClient.DownloadString("http://example.com/webservice/webMethod");

  // Send response to your javascript.
  context.Response.Write(response);
}

然后,您可以根據需要從 javascript 調用此處理程序。

您也可以嘗試使用 JSONP 或 easyXDM 框架。

對於 JSONP,您應該只更改一個 $.ajax 屬性。 設置dataType:"jsonp" 在這種情況下,服務器應該以這種格式返回 json 和函數名稱: funcName(<JSON structure>) 這僅適用於“GET”請求,但您在此處使用“POST”。 您可以嘗試切換到“GET”請求調用。

如果這是不可能的,您應該考慮使用之前解釋過的 javascript easyXDM 框架或 CORS 設置,easyXDM 有自己的 cors 組件,可以在舊瀏覽器上啟用它。

您的請求違反了同源政策。

在您自己的應用程序中為該服務編寫一個代理服務。 將它接收到的數據發布到遠程服務並轉發答案。

這將具有額外的優勢,您可以將 AccessKey 保密。 在將其發布到遠程服務器之前,您可以將其添加到服務器上的請求中。

如果這太費力了,請要求原始服務的開發人員在他們的服務器上也添加一個調用它的網頁。 然后您可以在 IFrame 中添加此網頁。

我在 Edge 中也遇到了 CORS 問題……我的網絡服務在 Chrome、Firefox 和舊版 IE 中運行。 最終我不得不更新 Edge 並且它起作用了。 以下是 CORS 支持的瀏覽器/版本列表:

啟用 CORS 瀏覽器支持

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM