2010-10-14 2 views
1

Мне нужно сделать SOAP-вызовы из javascript между разными доменами. На стороне сервера есть список разрешенных доменов, методов и заголовков, которые включены в ответ фильтром. Он работает хорошо (даже между разными доменами), когда код ответа равен 200, но когда на серверной стороне выбрано исключение, объект xhr имеет статус 0 вместо 500, а responseText пуст. При использовании в одном домене статус и responseText в порядке.jquery - Empty responseText в объекте XMLHttpRequest при возврате сервера 500

Соответствующий код выглядит следующим образом:

function onError(xhr, status, thrownError) { 
    alert(xhr.status); 
    alert(xhr.responseText); 
} 

$.ajax({ 
    type: "POST", 
    url: SOAPClient.Proxy, 
    dataType: "xml", 
    processData: false, 
    data: content, 
    context: context, 
    contentType : SOAPClient.ContentType + "; " + SOAPClient.CharSet, 
    error: onError, 
    success: onSuccess, 
    complete: onComplete, 
    beforeSend: function(req) { 
     req.setRequestHeader("Method", "POST"); 
     req.setRequestHeader("Content-Length", SOAPClient.ContentLength); 
     req.setRequestHeader("SOAPServer", SOAPClient.SOAPServer); 
     req.setRequestHeader("SOAPAction", soapReq.Action); 
    } 
}); 

Я использую JQuery-1.4.2. Разрешенными заголовками являются «SOAPServer», «SOAPAction» и «Method». Я пробовал его в FF 3.6.10 и Google Chrome 7.0.517.36

ответ

0

FF 3.6.8 возвращает xhr.status === 0, когда сервер отвечает HTTP-кодом, если 301. Для исправления требуется изменить функцию httpSuccess $. ajax

Чтобы исправить это, я изменил httpSuccess jQuery 1.4.2.

оригинал:

httpSuccess: function(xhr) { 
    try { 
     // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 
     return !xhr.status && location.protocol === "file:" || 
      // Opera returns 0 when status is 304 
      (xhr.status >= 200 && xhr.status < 300) || 
      xhr.status === 304 || xhr.status === 1223 || xhr.status === 0; 
    } catch(e) {} 

    return false; 
}, 

модифицирована:

httpSuccess: function(xhr) { 
    try { 
     // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 
     return !xhr.status && location.protocol === "file:" || 
      // Opera returns 0 when status is 304 
      (xhr.status >= 200 && xhr.status < 300) || 
      xhr.status === 304 || xhr.status === 1223 || 
      (xhr.status === 0 && xhr.statusText.toUpperCase() === 'OK');    
    } catch(e) {} 

    return false; 
}, 
+0

Спасибо за ваш ответ, но я боюсь, что это не будет работать (я пробовал). Из журналов видно, что сервер отвечает 500, и я также вижу это в firebug. Это просто, что фактический ответ (т. Е. Исключение) где-то теряется. Тем временем я построил простой javascript с собственными вызовами (без участия jquery) и получил те же результаты. Похоже, что в случае совместного использования ресурсов перекрестного браузера браузер не перенаправляет ответ, если статус отличается от 200. Я нашел статью об этой проблеме, когда клиент реализован в flex. – Tibor

+0

http://blog.widget-labs.com/2007/02/15/handling-web-service-exception-in-flex-code/ – Tibor

+0

Я знаю, что это не тот же язык/случай, но, возможно, корень проблема такая же. – Tibor

Смежные вопросы