2009-05-18 13 views
17

Estoy tratando de llamar a un método ASMX de jQuery sin éxito. Lo siguiente es mi código, y no entiendo lo que me estoy perdiendo.Llamando ASMX desde jQuery

Something.js de archivos,

function setQuestion() { 
    $.ajax({ 
     type: "POST", 
     data: "{}", 
     dataType: "json", 
     url: "http: //localhost/BoATransformation/Survey.asmx/GetSurvey", 
     contentType: "application/json; charset=utf-8", 
     success: onSuccess 
    }); 
} 

function onSuccess(msg) { 
    $("#questionCxt").append(msg); 
} 

SomethingElse.cs de archivos,

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class Survey : System.Web.Services.WebService { 

    public Survey() { 
    } 

    [WebMethod] 
    [ScriptMethod(UseHttpGet = true)] 
    public string GetSurvey() { 
     return "Question: Who is Snoopy?"; 
    } 
} 
+3

¿Qué error obtuvieron? –

Respuesta

25

Una cosa que llama la atención es que tiene UseHttpGet=true pero en su código jQuery está utilizando POST.

También aquí es una página de prueba que creé llamar a una página de ASMX.

[WebMethod] 
public Catalog[] GetCatalog() 
{ 
    Catalog[] catalog = new Catalog[1]; 
    Catalog cat = new Catalog(); 
    cat.Author = "Jim"; 
    cat.BookName ="His Book"; 
    catalog.SetValue(cat, 0); 
    return catalog; 
} 

<script type="text/javascript"> 
    $(document).ready(function() { 
    $.ajax({ 
      type: "POST", 
      url: "default.asmx/GetCatalog", 
      cache: false, 
      contentType: "application/json; charset=utf-8", 
      data: "{}", 
      dataType: "json", 
      success: handleHtml, 
      error: ajaxFailed 
     }); 
    }); 

    function handleHtml(data, status) { 
     for (var count in data.d) { 
      alert(data.d[count].Author); 
      alert(data.d[count].BookName); 
     } 
    } 

    function ajaxFailed(xmlRequest) { 
     alert(xmlRequest.status + ' \n\r ' + 
       xmlRequest.statusText + '\n\r' + 
       xmlRequest.responseText); 
    } 
</script> 
+0

En la medida en que entiendo esto, estoy tratando de hacer algo similar yo mismo. ¿Puede decirme que, dado que el atributo '[WebMethod]' parece ser compatible con los archivos ASPX regulares, ¿por qué es necesario un archivo ASMX? Gracias. –

+0

Jonathan, si está creando un método que solo se utilizará para la página específica desde la que está llamando al método web, puede agregarlo definitivamente a la página directamente. Sin embargo, si desea utilizarlo desde varias páginas, probablemente sea mejor crear un asmx dedicado para que pueda ser reutilizado y no tenga una relación directa con alguna página. –

+0

Así que alojé el ASMX en IIS en un servidor, ASMX tiene una función 'DoTest' en la que puedo hacer clic y me lleva a otra página donde puedo hacer clic en el botón" Invocar "y se muestra el XML. Sin embargo, cuando intenté lo anterior con la llamada de JQuery, recibí un '0 y un error' como el error' ajaxFailed'. Alguna idea/ – Si8

1

Aquí hay un ejemplo de una llamada jQuery a un método de página en un aspx, pero sería similar a una página de asmx.

$.ajax(
    { 
     type: "POST", 
     url: "NDQA.aspx/ValidateRoleName", 
     data: '{"roleName":"' + $('[id$=RoleNameTextBox]').val() + '"}', 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: ValidateSuccess, 
     error: ValidateError 

    }); 
1

También recomendaría la eliminación de UseHttpGet como Jim Scott sugirió.

Puedes añadir lo siguiente a sus opciones y comprobar el objXMLHttpRequest ver una respuesta de error más detallado.

error: function(objXMLHttpRequest, textStatus, errorThrown) { 
debugger;    
} 
6

Usted tiene que asegurarse de que especifica JSON como formato de respuesta si eso es lo que quiere y deshacerse de UseHttpGet debido a security features:

[WebMethod] 
[ScriptMethod(ResponseFormat=ResponseFormat.Json)] 
public string GetSurvey() { 
    return "Question: Who is Snoopy?"; 
} 
1

Usted tiene que asegurarse de que se especifique Json como el formato de respuesta si eso es lo que quiere y deshacerse de UseHttpGet debido a las características de seguridad:

Si lee ese artículo, entonces vería que es seguro usar UseHttpGet ya que ASP.NET tiene características para bloquear el vector de ataque de scripts cruzados.

Existen muchas razones válidas para usar GET.

Se puede eliminar el parámetro de datos y cambiar POST para llegar a hacer el trabajo llamada. Suponiendo que desea una respuesta JSON, se le solicitará que agregue ResponseFormat = ResponseFormat.Json también.

2

Me encontré con esta pregunta y tuve el mismo problema. Lo resuelto añadiendo:

[WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)] 

A continuación el atributo del método web, si desea utilizar la POST. es decir:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class Survey : System.Web.Services.WebService { 

    public Survey() { 
    } 

    [WebMethod] 
    [WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)] 
    [ScriptMethod(UseHttpGet = true)] 
    public string GetSurvey() { 
     return "Question: Who is Snoopy?"; 
    } 
} 
0

Si intenta navegador Chrome, trate Internet Explorer funcionó para mí y también se trata de cromo navegador debe agregar la extensión a las obras en cromo pero no sé el nombre de la extensión

1

El Los pasos siguientes resuelven mi problema, espero que ayude a alguien,

  1. para permitir este servicio web que se llama desde el guión, utilizando ASP.NET AJAX, incluye la siguiente línea por encima de la clase de servicio asmx por ejemplo

    [System.Web.Script.Services.ScriptService] clase pública GetData: System.Web.Services.WebService {

  2. Añadir protocolos bajo system.web en web.config, por favor haga clic en el enlace si usted no es capaz de ver la configuración

https://pastebin.com/CbhjsXZj

<system.web> 
<webServices> 
    <protocols> 
    <add name="HttpGet"/> 
    <add name="HttpPost"/> 
    </protocols> 
</webServices>