开发者

I have a WCF service with a javascript endpoint that only works in IE

I have a remote server with a webhttpbinding that i'd like to access using javascript.

Below is a simple javascript function that executes the test function which is just a random number generator which returns that number.

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);
}
}
}

When i execute this function in ie9, i get {d: 6} or whatever but when i try executing the same function in chrome or firefox 5, it gives me alert with no text in it.

when i changed the xmlHttp.responseText to xmlHttp.responseXML in ie i get [Object] and in firefox 5 and chrome the result is null.

Does anyone have any idea what i can do to get this to work on all modern browsers?

UPDATE: Fiddler Results Chrome:

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
     C开发者_如何学JAVAonnection: keep-alive
     Origin: null
     Access-Control-Request-Method: POST
     Access-Control-Request-Headers: content-type
     Pragma: no-cache
     Cache-Control: no-cache


One possible (likely) problem is that you're passing a request body in a GET request - and that's not allowed per HTTP spec. Some browser may be more lenient with others, but once you fix it (pass parameters in the query strings for GET requests, or change to use POST to pass a request body), you should have a more consistent cross-browser behavior.

Update: adding example

I copied your code from the client and created a service, and I get the results correctly (on multiple browsers). Can you try with this code and start changing into yours to see where it breaks?

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜