2011-10-14 19 views
5

estoy haciendo un servicio web WCF que devolverá un objeto JSON, pero sigo recibiendo un error 400 Bad Request cuando intento hacer una llamada AJAX:400 Solicitud incorrecta cuando se trata de ponerse en contacto con el servicio WCF utilizando XHR

OPTIONS http://localhost:55658/WebServiceWrapper.svc/GetData?_=1318567254842&value=97   HTTP/1.1 
Host: localhost:55658 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 
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 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
DNT: 1 
Connection: keep-alive 
Origin: http://localhost:3000 
Access-Control-Request-Method: GET 
Access-Control-Request-Headers: content-type 

HTTP/1.1 400 Bad Request 
Server: ASP.NET Development Server/10.0.0.0 
Date: Fri, 14 Oct 2011 04:40:55 GMT 
X-AspNet-Version: 4.0.30319 
Cache-Control: private 
Content-Length: 0 
Connection: Close 

Aquí es mi llamada AJAX:

$.ajax({ 
    contentType: 'application/json', 
    url: 'http://localhost:55658/WebServiceWrapper.svc/GetData', 
    dataType: 'json', 
    data: { 
    value: 97 
    }, 
    success: function (data) { 
    alert('success' + data); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    alert('failure' + errorThrown); 
    } 
}); 

Aquí es mi definición de servicio WCF:

public class WebServiceWrapper : IWebServiceWrapper 
{ 
    public object GetData(int value) 
    { 
     return new 
     { 
      ReturnValue = string.Format("You entered: {0}", value) 
     }; 
    } 
} 

Y es interfaz:

[ServiceContract] 
public interface IWebServiceWrapper 
{ 
    [OperationContract] 
    object GetData(int value); 
} 

Sé que he resuelto este problema antes, pero no recuerdo lo que había hecho antes. Cualquier ayuda sería muy apreciada ya que el agujero que pongo en la pared es cada vez más grande.

+1

¿Estás seguro del número de puerto que utilizas en la llamada ajax (55658)? El origen se informa como 3000. –

Respuesta

1

Hay un par de cosas puede que tenga que hacer (o comprobar si lo han hecho):

Su GetData OperationContract necesita ser decorado con [WebGet] atributo.


    [WebGet] 
    [OperationContract] 
    object GetData(int value); 

Su clase WebServiceWrapper necesita ser decorado con [AspNetCompatibilityRequirements] atributo (Añadir una referencia a System.ServiceModel.Web para que esto sea disponible)


    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class WebServiceWrapper : IWebServiceWrapper 

El valor de retorno de la operación GetData necesitará ser envuelto. Una forma fácil es usar un JavaScriptSerializer para serializar el objeto de JSON


    var serializer = new JavaScriptSerializer(); 
    return serializer.Serialize(new 
           { 
            ReturnValue = string.Format("You entered: {0}", value) 
           }); 

Usted necesita asegurarse de que está utilizando un [webHttpBinding] en sus puntos finales (cliente y servicios)

<endpoint ... binding="webHttpBinding" ... /> 

yo no saber si este siguiente paso es obligatorio, pero es posible que tenga un comportamiento de punto final que permite secuencias de comandos web

<endpointBehaviors> 
    <behavior name="[endpointBehaviorName]"> 
     <enableWebScript/> 
    </behavior> 
</endpointBehaviors> 

es obvio que tendrá que hacer referencia a esta configuración comportamiento en su punto final (s)

<endpoint ... behaviorConfiguration="[endpointBehaviorName]" ... /> 
0

En cuanto a su solicitud para presentar una solicitud de opciones en lugar de un GET, que creo que jQuery hace automáticamente si se intenta hacer una solicitud XHR entre sitios, consulte esta pregunta:

Why am I getting an OPTIONS request instead of a GET request?

Ni siquiera estoy seguro de que su servidor admita el método OPTIONS, de ahí su error 400.

Incluso los diferentes números de puerto se consideran solicitudes entre sitios, por lo que es mejor hacer una página proxy en el sitio web real que realiza la solicitud HTTP a su Servicio WCF.

0

Parece que está violando el same origin policy restriction. No puede enviar solicitudes AJAX de dominio cruzado. Su aplicación está alojada en http://localhost:3000 y está intentando enviar una solicitud AJAX al http://localhost:55658. Eso es imposible. Puede enviar solicitudes AJAX solo al http://localhost:3000.Puede usar JSONP para eludir esta restricción. Y aquí está another article en MSDN.

Cuestiones relacionadas