У меня есть служба WCF с конечной точкой JavaScript, которая работает только в IE - PullRequest
1 голос
/ 29 июня 2011

У меня есть удаленный сервер с привязкой webhttp, к которому я хотел бы получить доступ, используя 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 результат равен нулю.

Кто-нибудь знает, что я могу сделатьчтобы это работало во всех современных браузерах?

ОБНОВЛЕНИЕ: Chrome результатов Fiddler:

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 голосов
/ 29 июня 2011

Одна из возможных (вероятных) проблем заключается в том, что вы передаете тело запроса в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...