我有一个WCF服务,其javascript端点仅适用于IE

时间:2011-06-28 22:47:38

标签: javascript wcf browser cross-browser

我有一个带有webhttpbinding的远程服务器,我想使用javascript访问。

下面是一个简单的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中,结果为null。

有没有人知道我能做些什么才能让它在所有现代浏览器上运行?

更新:提琴手结果 铬:

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

1 个答案:

答案 0 :(得分: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>