2010-06-22 6 views
1

У меня есть то, что должно быть относительно простой задачей, которая, откровенно говоря, меня озадачила. Я исследовал его, пока мой мозг не обжарился, и теперь я пинаю и прошу вас, ребята, о помощи.Вызов WebMethods с XmlHttpRequest и чистым JavaScript

Вот сценарий:

  • У меня есть страницы ASPX (Q2.aspx), который украшен с WebService, WebServiceBinding и ScriptService атрибуты.
  • Эта страница содержит метод, GetAllContacts, который украшен атрибутом WebMethod и возвращает строку, содержащую данные JSON. (Для чего это стоит, страница сама не содержит других элементов управления и функциональных возможностей.)
  • У меня есть страница HTML, которая содержит JavaScript, который использует XmlHttpRequest объект для вызова GetAllContacts WebMethod на странице ASPX и преобразование данных в формате JSON в таблицу HTML.
  • Я проверил, что мой Web.Config файл содержит соответствующие обработчики протокола для HttpGet и HttpPut в разделе WebServices под System.Web.webServices.
  • Я подтвердил, что мой файл Web.Config содержит запись ScriptModule под заголовком System.webServer.modules и что она соответствует соответствующей документации.

Однако при просмотре страницы HTML в браузере происходит следующее:

  • запрос Веб проходит, но результаты для необработанного HTML со страницы ASPX.
  • Метод GetAllContacts никогда не вызывается, о чем свидетельствует установка точки останова в коде.
  • Вызывается код для вызова веб-службы, и функция обратного вызова JavaScript , которая вызывается при завершении запроса, правильно вызывается.

Оказывается, что код JavaScript в основном настроен правильно, но по какой-то причине, что полностью отводящей меня в этот момент, страница HTML не будет просто выполнить WebMethod на странице ASPX, а просто возвращает страницу как будто это был простой запрос HTML GET. Очевидно, что HTML-документ не может быть оценен функцией JavaScript eval, что приводит меня к моей проблеме. (Также обратите внимание, что данные JSON не отображаются нигде в возвращенном HTML-файле.)

Я, откровенно говоря, озадачен. Я просмотрел десятки статей Microsoft, статей StackOverflow, статей CodeProject и кто знает, что еще. Мой код выглядит, как будто все в порядке. Но я знаю лучше. Мне не хватает чего-то простого, глупого и очевидного. Мне просто нужно, чтобы кто-то указал мне на это.

Ниже вы найдете код страницы ASPX и код HTML, в надежде, что они прольют некоторый свет.

ASPX Код

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Q2.aspx.cs" Inherits="Satuit.Q2" enablesessionstate="False" %> 
<html> 
    <body> 
     <form runat="server" id="frmMain"/> 
    </body> 
</html> 
-- Codebehind 
using System.IO; 
using System.Web; 
using System.Web.Script.Services; 
using System.Web.Services; 
using System.Web.UI; 
using System.Xml; 
using System.Xml.XPath; 
using System.Xml.Xsl; 

namespace Satuit 
{ 
    [WebService(Namespace="http://tempuri.org")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ScriptService] 
    public partial class Q2 : Page 
    { 

     [WebMethod] 
     public static string GetAllContacts() 
     { 
      return LoadJsonData(); 
     } 

     private static string LoadJsonData() 
     { 
      using (var stringWriter = new StringWriter()) 
      { 

       string xmlUri = HttpContext.Current.Server.MapPath("\\XmlData\\Contacts.xml"); 
       string xslUri = HttpContext.Current.Server.MapPath("\\XmlData\\Q2.xsl"); 

       using (var xmlTextReader = new XmlTextReader(xmlUri)) 
       { 
        var xpathDocument = new XPathDocument(xmlTextReader); 
        var xslTransform = new XslCompiledTransform(); 

        xslTransform.Load(xslUri); 
        xslTransform.Transform(xpathDocument, null, stringWriter); 

        return stringWriter.ToString(); 
       } 
      } 
     } 
    } 
} 

HTML код

var objectData; // Receives the objectified results of the JSON request. 

    var xmlhttp; 
    if(window.XMLHttpRequest) { 
     xmlhttp = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 
     xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 

    xmlhttp.open("GET", "/Q2.aspx/GetAllContacts", true); 
    xmlhttp.setRequestHeader("content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.onreadystatechange = function() 
    { 
     if (xmlhttp.readyState == 4) 
     { 
      if (xmlhttp.status == 200) 
      { 
       var jsonResultBuffer = xmlhttp.responseText; 
       objectData = eval(jsonResultBuffer); 
       DisplayTable(); 
      } 
     } 
    }; 
    xmlhttp.send(null); 

    function DisplayTable() 
    {  
     var sHtml = "";  
     sHtml = "<table><tr><th>ID</th><th>First</th><th>Last</th><th>Address</th></tr>";   
     for(i = 0; i < objectData.length; i++) 
     { 
      sHtml += "<tr>"; 
      sHtml += "<td>" + objectData.ID; 
      sHtml += "<td>" + objectData.firstName + "</td>"; 
      sHtml += "<td>" + objectData.lastName + "</td>"; 
      sHtml += "<td>" + objectData.address + "</td>"; 
      sHtml += "</tr>" 
     } 
     sHtml += "</table>"   
     document.getElementById("divTable").innerHTML = sHtml; 
    }  
</script> 

Dev окружающей среды Детали

  • Vista Ultimate SP 2
  • Visual Studio 2008
  • .NET Framework 3.5
  • Решение еще не развернуты, поэтому он работает в «локальной сети сервер " предоставляется Visual Studio. (Заставляет меня задаться вопросом, не следует ли мне просто развернуть IIS под Vista.)
  • Обратите внимание, что страница ASPX, содержащая WebMethod и HTML-страницу, находится в пределах того же решения.
+0

Я не уверен, но я думаю, что веб-сервис asp.net должен вызываться с помощью SOAP. – Fopfong

+0

Нет, Fopfong, это не так. – TheGeekYouNeed

+0

Майк, где вы размещаете свой веб-сервис? Он установлен в виртуальном каталоге или в качестве приложения на сервере? Если страница не обрабатывается, обработка ASP.Net не выполняется. Убедитесь, что ваш IIS настроен правильно. Я бы предположил, что это папка, в которой живет ваш код. – TheGeekYouNeed

ответ

0

Просьба выполнить следующие действия с помощью jquery, чтобы увидеть, что веб-служба доступна или нет.

$.ajax({ 
     type: "POST", 
     url: "Q2.aspx/GetAllContacts", 
     data: "", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(response) { 
      alert("success"); 
     }, 
     error: function(response, aa) { 
      alert("fail"); 
     } 
    }); 

Thurein

+0

(Удалено для глупости плаката.) –

1

Я думаю, нам нужно вызвать веб-метод с запросом POST попытаться изменить эту часть кода

xmlhttp.open("POST", "/Q2.aspx/GetAllContacts", true); 
xmlhttp.setRequestHeader("content-type", "application/json"); 
xmlhttp.setRequestHeader("Accept", "application/json"); 
xmlhttp.onreadystatechange = function() 
{ 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
    { 
      var jsonResultBuffer = JSON.parse(xmlhttp.responseText); 
      objectData = jsonResultBuffer.d; 
      DisplayTable(); 
    } 
}; 

ответ возвращается в формате JSON с «D» в качестве ключа в xmlhttp.responseText

+0

Спасибо, что показали мне, как настроить заголовок для ответа в XMLHttpRequest. –