2011-06-28 50 views
1

我有一個webhttpbinding的遠程服務器,我想訪問使用JavaScript。我有一個JavaScript端點,只能在IE瀏覽器的WCF服務

下面是一個簡單的javascript函數,它執行測試函數,它只是一個隨機數生成器,它返回該數字。

Function DoTest() 
{ 
    var xmlHttp = new XMLHttpRequest(); 


    var url = "location/to/service/service.svc/ajax/"; 
    url = url + test; 


var body = '{ }'; 


xmlHttp.open("POST", url, true); 
xmlHttp.setRequestHeader("Content-type", "application/json"); 
xmlHttp.send(body); 
xmlHttp.onreadystatechange=function(){ 
    if(xmlHttp.readyState == 4){ 
     alert(xmlHttp.responseText); 
} 
} 
} 

當我執行在IE9這個功能,我得到{d:6}或什麼,但是當我嘗試執行在Chrome或Firefox 5相同的功能,它使我警覺與它沒有任何文字。

當我將xmlHttp.responseText更改爲xmlHttp.responseXML,即我得到[Object]並在Firefox 5和Chrome中結果爲空。

有沒有人知道我能做些什麼才能使它適用於所有現代瀏覽器?

UPDATE:提琴手結果 鉻:

OPTIONS http://www.address.com/service.svc/ajax/add HTTP/1.1 
Host: www.address.com 
Connection: keep-alive 
Access-Control-Request-Method: POST 
Origin: null 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko)    Chrome/12.0.742.112 Safari/534.30 
Access-Control-Request-Headers: Content-Type 
Accept: */* 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

IE 9

POST http://www.address.com/service.svc/ajax/add HTTP/1.1 
    Accept: */* 
    Content-Type: application/json 
    Accept-Language: en-us 
    Accept-Encoding: gzip, deflate 
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
    Host: www.address.com 
    Content-Length: 17 
    Connection: Keep-Alive 
    Pragma: no-cache 
    Cookie: ASP.NET_SessionId=m54ult1lvdqj0yeb3nm4dz4w 
    {"x":123,"y":332} 

FF:

OPTIONS http://www.address.com/service.svc/ajax/add HTTP/1.1 
    Host: www.address.com 
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:7.0a1) Gecko/20110617 Firefox/7.0a1 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    Accept-Language: en-us,en;q=0.5 
    Accept-Encoding: gzip, deflate 
    Connection: keep-alive 
    Origin: null 
    Access-Control-Request-Method: POST 
    Access-Control-Request-Headers: content-type 
    Pragma: no-cache 
    Cache-Control: no-cache 

回答

0

一個可能的(可能)的問題是,你傳遞的請求正文GET請求 - 這不是每個HTTP規範允許的。某些瀏覽器可能對其他瀏覽器更爲寬鬆,但是一旦修復它(傳遞GET請求的查詢字符串中的參數或更改爲使用POST傳遞請求正文),您應該具有更一致的跨瀏覽器行爲。

更新:加入例如

我從客戶端複製代碼,並創建了一個服務,我得到正確的結果(在多個瀏覽器)。你可以嘗試使用這段代碼,並開始改變你的看法,看看它打破了什麼地方?

Service1.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="SO_6513977.Service1" CodeBehind="Service1.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %> 

IService1.svc:

namespace SO_6513977 
{ 
    [ServiceContract] 
    public interface IService1 
    { 
     [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] 
     int Add(int x, int y); 
     [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] 
     string Echo(string text); 
    } 
} 

Service1.svc.cs:

namespace SO_6513977 
{ 
    public class Service1 : IService1 
    { 
     public int Add(int x, int y) { return x + y; } 
     public string Echo(string text) { return text; } 
    } 
} 

HtmlPage1.html:

<body> 
<script type="text/javascript"> 
    function TestAdd() { 
     var xmlHttp = new XMLHttpRequest(); 
     var url = "/Service1.svc/Add"; 
     var body = '{"x":123,"y":332}'; 
     xmlHttp.open("POST", url, true); 
     xmlHttp.setRequestHeader("Content-Type", "application/json"); 
     xmlHttp.onreadystatechange = function() { 
      if (xmlHttp.readyState == 4) { 
       alert("Response of Add: " + xmlHttp.responseText); 
       //TestEcho(); 
      } 
     }; 
     xmlHttp.send(body); 
    } 

    function TestEcho() { 
     var xmlHttp = new XMLHttpRequest(); 
     var url = "/Service1.svc/Echo"; 
     var body = '{"text":"Hello world"}'; 
     xmlHttp.open("POST", url, true); 
     xmlHttp.setRequestHeader("Content-Type", "application/json"); 
     xmlHttp.onreadystatechange = function() { 
      if (xmlHttp.readyState == 4) { 
       alert("Response of Echo: " + xmlHttp.responseText); 
      } 
     }; 
     xmlHttp.send(body); 
    } 

    //TestAdd(); 
</script> 
    <input type="button" value="Test Add" onclick="TestAdd();" /><br /> 
    <input type="button" value="Test Echo" onclick="TestEcho();" /><br /> 
</body> 
+0

那麼,你是對的,我現在在瀏覽器之間得到了更一致的行爲。不幸的是,它不是一個好方法。我現在得到了所有的瀏覽器,包括即給我什麼也沒有。 萬一這個問題,我修改我的wcf webinvoke行看起來像這樣[WebInvoke(Method =「POST」,BodyStyle = WebMessageBodyStyle.Wrapped,ResponseFormat = WebMessageFormat.Json)] – TheNewM

+0

得到它的工作與ie再次基本複製和粘貼+與我的服務相關的所需更改(從示例中,但沒有Chrome或Firefox的運氣)......它們仍然給我輸出null或空字符串。 – TheNewM

+0

您可以看看Fiddler,看看Chrome/FF/IE發送的請求有什麼不同嗎? – carlosfigueira

相關問題