Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Веб-Сервис ASP.NET 2.0


Автор: JaguarSmith 26.6.2006, 20:03
 smile Здравствуйте!

Я собственно задал вопрос сначала http://forum.vingrad.ru/index.php?showtopic=101532, но похоже, что никто в ASP.NET не сталкивался с этой проблемой...  smile 

Задача простая есть веб-сервис - http://www.jaguarsmith.ru/GuestBook/JGuestBook.asmx  и надо получить результат функции GetBooksSize("granpik") из javasript`а... На локальном сервере всё просто делается через POST - http://localhost/jaguarsmith/GuestBook/JGuestBook.asmx/GetBooksSize?BookName=granpik но вот на сервере такой вариант отказывается работать категорически!  smile 

 smile Никто не сталкивался с веб-сервисами на ASP.NET?

Зы. Я использую код из книги AJAX в действии:
Код

// моя функция:
    var service ="http://localhost/MySite/GuestBook/JGuestBook.asmx"      // если сделать так то всё работает
 // var service ="http://www.jaguarsmith.ru/GuestBook/JGuestBook.asmx"   // а так - совсем не работает!

function CheckBookUpdated()
{
 var url = service + "/GetBooksSize";
 var params = "BookName=" + GuestBook ;
 var httpMetod = "POST";
 BookSizeReq = new ajax.ContentLoader(url,BookUpdated,null,httpMetod,params,null);
}
function BookUpdated()
{
....
}

// код взят из книги AJAX в действии...
var ajax=new Object();

ajax.READY_STATE_UNINITIALIZED=0;
ajax.READY_STATE_LOADING=1;
ajax.READY_STATE_LOADED=2;
ajax.READY_STATE_INTERACTIVE=3;
ajax.READY_STATE_COMPLETE=4;


/*--- content loader object for cross-browser requests ---*/
ajax.ContentLoader=function(url,onload,onerror,method,params,contentType){
  this.req=null;
  this.onload=onload;
  this.onerror=(onerror) ? onerror : this.defaultError;
  this.loadXMLDoc(url,method,params,contentType);
  this.resp = null
}

ajax.ContentLoader.prototype.loadXMLDoc=function(url,method,params,contentType){
  if (!method){
    method="GET";
  }
  if (!contentType && method=="POST"){
    contentType='application/x-www-form-urlencoded';
  }
  if (window.XMLHttpRequest){
    this.req=new XMLHttpRequest();
  } else if (window.ActiveXObject){
    this.req=new ActiveXObject("Microsoft.XMLHTTP");
  }
  if (this.req){
    try{
      var loader=this;
      this.req.onreadystatechange=function(){
        ajax.ContentLoader.onReadyState.call(loader);
      }
      this.req.open(method,url,true);
      if (contentType){
        this.req.setRequestHeader('Content-Type', contentType);
      }
      this.req.send(params);
    }catch (err){
      this.onerror.call(this);
    }
  }
}

ajax.ContentLoader.onReadyState=function(){
  var req=this.req;
  var ready=req.readyState;
  if (ready==ajax.READY_STATE_COMPLETE){
    var httpStatus=req.status;
    if (httpStatus==200 || httpStatus==0){
      this.resp = req.responseText;
      this.onload.call(this);
    }else{
      this.resp = dataload_error
      this.onerror.call(this);
    }
  }
}

ajax.ContentLoader.prototype.defaultError=function(){
  
  tmp.innerText = "error fetching data!"
                + "\n\nreadyState:"+this.req.readyState
                + "\nstatus: "+this.req.status
                + "\nheaders: "+this.req.getAllResponseHeaders()
                + "\nResponse: "+this.req.responseText; 
  return true;
}
  

Автор: Sardar 26.6.2006, 23:08
JaguarSmith, необходимо что бы твоя страница, что аяксом книгу дёргает, лежала тоже в домене www.jaguarsmith.ru. Иначе никак, политика безопасности. ИЕ ещё позволял другие домены опрашивать, но после SP2 по моему уже нет.  

Автор: JaguarSmith 26.6.2006, 23:58
Нее!!!

Во-первых она и лежит: http://www.jaguarsmith.ru/guestbook/default.aspx (собственно вебсервис сообщает клиенту что введены новые записи и надо обновить страницу)

Во-вторых тут непонятен сам механизьм обращения к сервису... Я щас пытаюсь вычитать в ATLAS - реализация аякса для платформы .NET - но я, мягко говоря,  не очень силён в javascript поэтому дело идёт со скрипом еле-еле smile 
 

Автор: Sardar 27.6.2006, 00:38
Цитата(JaguarSmith @  26.6.2006,  22:58 Найти цитируемый пост)
реализация аякса для платформы .NET 

А без разницы smile
Кстати страница у тебя в UTF-8, а скрипты в левой кодировке, будут кракозябры.

Цитата(JaguarSmith @  26.6.2006,  22:58 Найти цитируемый пост)
Во-вторых тут непонятен сам механизьм обращения к сервису... 

А что не ясно? XMLHttpRequest может делать обычные запросы и подгружать XML. Другими словами можно сделать полноценный запрос к вебсервису (SOAP), правда это редко кто делает, все грузят что придёт и обычно текстом, а не XML smile

У тебя заметил функцию ajax_XML2Text, ты глянь на неё и подумай зачем тебе строить XML если ты только текст берёшь? Или в ASP.Net вебсервисе по дефолту всегда XML отдаёться (кто тогда словарь задаёт?).

Весело твой сервер советы даёт: http://www.jaguarsmith.ru/GuestBook/JGuestBook.asmx?op=GetBooksSize smile
 

Автор: JaguarSmith 27.6.2006, 01:43
Цитата

Кстати страница у тебя в UTF-8, а скрипты в левой кодировке, будут кракозябры

Кракозябров не буит! smile  там все функции выдают ответ в цифрах и это всё как-раз решено локально... функция ajax_XML2Text какраз этим и занимается правда я не уверен что я реализовал её лучшим образом:
Код

function ajax_XML2Text(inXML)
{
    var tmpDiv = document.createElement('div');
    tmpDiv.innerHTML = inXML;
    var outText = tmpDiv.innerText;
    var bdy = tmpDiv.parentNode;
    bdy.removeChild(tmpDiv);
    return    outText;
}

тем неменее работает! smile 

Ответ всегда выдается ввиде XML например вот так:
Код

<?xml version="1.0" encoding="utf-8" ?> 
  <string xmlns="http://tempuri.org/">9</string> 


Кстати ответ об ашипке тоже выдается в XML...

Цитата

А что не ясно? XMLHttpRequest может делать обычные запросы и подгружать XML. Другими словами можно сделать полноценный запрос к вебсервису (SOAP), правда это редко кто делает, все грузят что придёт и обычно текстом, а не XML

  smile Вот как-раз не ясно как сделать [B]полноценный[/B] запрос к вебсерверу чтобы он дал ответ!  smile  

Автор: Sardar 28.6.2006, 01:37
Цитата(JaguarSmith @  27.6.2006,  00:43 Найти цитируемый пост)
тем неменее работает! 

Посоветовал бы XPath, но он зараза под мозиллу больно долгую прелюдию хочет (много кода), а элегантный http://www.raleigh.ru/XML/w3schools/xpath/examples.php только в ИЕ есть. В инете гуляет http://sarissa.sourceforge.net/doc/overview-summary-sarissa_ieemu_xpath.js.html прикручивающих selectNode к мозилле и вообще всем W3C compatible браузерам. Попробуй, удобно из ответа инфу вытаскивать, а не этим топорным методом как у тебя сейчас smile

Цитата(JaguarSmith @  27.6.2006,  00:43 Найти цитируемый пост)
как сделать полноценный запрос к вебсерверу чтобы он дал ответ!

Для этото разбираемся что есть http://ru.wikipedia.org/wiki/SOAP, примеры запросов твой сервак сразу же и показывает (HTTP запрос как есть): 
Код
POST /GuestBook/JGuestBook.asmx HTTP/1.1
Host: www.jaguarsmith.ru
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetBooksSize xmlns="http://tempuri.org/">
      <BookName>имя твоей книги</BookName>
    </GetBooksSize>
  </soap12:Body>
</soap12:Envelope>


Советую на время сесть только под ИЕ, поплясать немного, а затем уже либо писать самому, либо брать строронюю либу оборачивающую XMLHttpRequest кроссплатформено. На время забей на ошибки сети (в релизе отлавливай ошибки! не уподобляся половине либ, что виснут при ошибках smile ).

Вкуриваем http://msdn.microsoft.com/library/en-us/xmlsdk/html/7924f6be-c035-411f-acd2-79de7a711b38.asp?frame=true
Теперь врубаемся что open нужно вызывать с POST что бы выполнить POST запрос, а в send указать SOAP вызов (тот XML что в примере). В ответ придёт это (HTTP ответ как есть):

Код
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: длина в байтах

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetBooksSizeResponse xmlns="http://tempuri.org/">
      <GetBooksSizeResult>что у тебя там возвратить должен</GetBooksSizeResult>
    </GetBooksSizeResponse>
  </soap12:Body>
</soap12:Envelope>


Ты этого всего не видишь, XMLHttpRequest делает всё за тебя сам, ты получаешь responseXML у которого .selectNodes("//GetBooksSizeResult/text()")  и получаешь содержимое. В этом и есть его мощь, возможность делать HTTP запросы удобным способом, потому и пользуеться повсеместно и в простых прогах. Естественно можно пойти дальше и написать стили XSLT (transformNode, опять же элегантная ИЕ фича, у других масса кода), что бы генерить контент по ответу сразу, без скриптов как это делают люди не знающие smile

В итоге: XMLHttpRequest компонент позволаяет делать HTTP запросы и получать ответы. Тело запроса можно указать самому, тело ответа можно получить как текстом, так и распарсеным DOM деревом. Отсюда получаеться что посредством XMLHttpRequest можно опросить что угодно что понимает HTTP запросы, конечно с ограничением по домену. В теле запроса могут быть просто пары, как это кодирует форма со странички посылая POST запрос, либо XML для всебсервиса, либо вообще url-encoded файл если сумеешь его прочитать/сгенерить smile
Для общего развития: http://msdn.microsoft.com/library/en-us/dnsoap/html/soap_faq.asp?frame=true     

Автор: JaguarSmith 29.6.2006, 11:07
Баальшое спасибо!
Пашел вкуривать!
Надеюсь торкнет!  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)