2013-01-09 87 views
3

我想調用外部Web服務,其工作正常在鉻,但不是在Firefox和IE瀏覽器。在Chrome中,它返回'true',但在Firefox,它返回'0 error',在這裏是我的完整代碼...Web服務工作正常鉻,但不是在Firefox和IE瀏覽器

<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 for testing

+0

你加載jQuery兩次? –

+2

看起來好像您正在嘗試發出CORS請求。 jQuery不支持IE 10中的CORS請求,在你使用的舊版本的jQuery中,它可能在firefox中也不起作用。 –

+0

有什麼解決方案/技巧,它可以在Firefox中工作嗎? –

回答

8

您收到此錯誤,因爲你正嘗試在另一個域上調用Web服務。這違反了Same origin policy。這是一個安全限制。大多數舊版瀏覽器都會拒絕這些請求。

如果您想在javascript中訪問不同的域web服務,您將需要設置Cross-Origin Resource Sharing

跨源資源共享(CORS)是一種機制,允許web頁面將XMLHttpRequests創建到另一個域。這種「跨域」請求在其他情況下可能會被網頁瀏覽器禁止,即按照相同的 原始安全策略。 CORS定義了一種在瀏覽器和 服務器可以進行交互,以確定是否允許 跨域請求

如果你有機會到web服務代碼,就可以使在服務器CORS請求。
Enable cors是一個很好的資源。這裏有一些explaination on 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> 

Here are the steps for IIS6

安全注意:對於這裏的例子,我已經允許對服務器的所有請求。如果您提供敏感數據,您可能希望將其限制爲選定的域。

也可以通過WebOperationContext.Current.IncomingRequest檢查基於WCF的請求,併發送相應的標頭。

舊版瀏覽器不支持CORS請求。您可以看到完整的browser compatibility list here

如果您必須支持舊瀏覽器或無法更改Web服務,則始終可以在您的服務器上承載Web服務代理。您將請求發送到您的服務器,並且您的服務器從原始webserivce請求數據。這工作正常,因爲它不違反交叉來源政策。一個簡單的http處理程序可以作爲服務器上的代理服務器。

下面是一個簡單的HTTP處理程序代理一個REST Web服務會是什麼樣子:

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需要。

+0

嗨,謝謝你的迴應。在你的答案中提到的代碼已經在web.config中 –

+0

我也在我的問題中添加了Web服務,並且在我的問題中需要所有東西。你可以試試你的結局嗎? –

+0

剛剛檢查。我沒有收到CORS標題。我提到的設置是針對IIS 7的。你的服務器應該發送一個自定義的http頭文件'Access-Control-Allow-Origin:*'。我在響應中看不到這個標題。 – nunespascal

1

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

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

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

+0

感謝您的回答。我無法控制服務器Web服務。但它唯一的字符串返回「真」或「假」。 –

+0

JSONP只適用於GET,這是POST – flup

+0

是的,JSONP僅適用於GET請求,我沒有看到。感謝flup。 – Sasa

1

您的請求違反同源策略。

在您自己的應用程序中爲該服務編寫代理服務。 將收到的數據發送到遠程服務並轉發答案。

這將有額外的好處,您可以保持AccessKey私密。 您可以將它添加到服務器上的請求,然後將其發佈到遠程服務器。

如果這樣做太費事,可以讓原始服務的開發者在其服務器上添加一個調用它的網頁。然後你可以在IFrame中添加這個網頁。

相關問題