none
WCF, jQuery Ajax POST & 400 Bad Request RRS feed

  • Question

  • Bonjour,

    Dans le but de correspondre avec mon site aspnet MVC, j'ai crée un service WCF pour récupérée des données de façons dynamique par jQuery.

    Niveau site aucun soucis, par contre côté service WCF j'ai un gros problème.

    Je peu interroger mon webservice :

    - Avec POSTMAN (extension chrome)

    - Avec jQuery si ma page est dans le même répertoire que celui de mon WCF

    Je ne peu pas interroger mon webservice :

    - Depuis WAMP avec une jQuery

    - Depuis une autre instance IIS avec jQuery

    Au début, j'ai pensé à un problème de cross domain, j'ai donc ajouter les directives suivantes :

    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Methods" value="*"/>
          <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization, Accept"/>
        </customHeaders>
      </httpProtocol>
    </system.webServer>

    J'ai aussi tenter avec la méthode :

    Enable Cors

    Quand je tente donc de communiquer avec mon WebService j'ai l'erreur suivante :

    Le serveur a rencontré une erreur lors du traitement de la demande. Consultez la page d'aide du service pour obtenir des informations sur la construction de demandes valides pour ce service. Le message d'exception est 'Le message entrant a un format inattendu 'Raw'. Les formats de message attendus pour l'opération sont 'Xml'; 'Json'. Un WebContentTypeMapper n'a peut-être pas été configuré sur la liaison. Pour plus d'informations, consultez la documentation relative à WebContentTypeMapper.'. Pour plus de détails, consultez les journaux du serveur. La trace de la pile d'exception est :
    
    Ã  System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters) Ã  System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) Ã  System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) Ã  System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) Ã  System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

    Voici aussi ma requête jQuery :

    $(document).ready(function(){
        $.ajax({
        url: 'http://localhost:8082/Service.svc/Data/Column',
        type: 'POST',
        contentType: 'application/json',
        dataType: 'json',
        data: { id: '74EA75BD-135E-4841-9CD3-6AB01D06BE83' },
            success: function (result) {
                console.log(result);
            }
        });
    });

    J'ai essayer plusieurs déclinaisons avec :

    contentType: 'application/json; charset=utf-8'
    
    dataType: 'jsonp'
    

    Même soucis ...

    Merci d'avance, Hantse

    mardi 21 janvier 2014 18:21

Réponses

  • Bonjour,

    Utilisez la fonction "JSON.stringify()" pour convertir votre objet Javascript en string JSON :

    $(document).ready(function(){
        $.ajax({
        url: 'http://localhost:8082/Service.svc/Data/Column',
        type: 'POST',
        contentType: 'application/json',
        dataType: 'json',
        data: JSON.stringify({ id: '74EA75BD-135E-4841-9CD3-6AB01D06BE83' },
            success: function (result) {
                console.log(result);
            })
        });
    });

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse Hantse jeudi 23 janvier 2014 10:02
    mercredi 22 janvier 2014 00:22
    Modérateur
  • Bonjour

    Essayez d’ajouter dans Global.asacx le traitement de l’Application_BeginRequest :

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
        }
    }
    Essayez aussi de utilizer dataType: 'text' dans l'appel Ajax.

    Cordialement,

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse Hantse jeudi 23 janvier 2014 10:02
    jeudi 23 janvier 2014 08:34

Toutes les réponses

  • Je rajoute des précisions :

    Quand je lance une requête vide, ça passe.

    $(document).ready(function(){
        $.ajax({
        url: 'http://localhost:8082/Service.svc/Data/Column',
        type: 'POST',
        contentType: 'application/json',
        dataType: 'json',
            success: function (result) {
                console.log(result);
            }
        });
    });

    Voici le prototype de ma fonction côté WCF :

            [OperationContract]
            [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Data/Column")]
            [return: MessageParameter(Name = "Data")]
            List<ColumnData> GetColumnData(DataAuth data);

    mardi 21 janvier 2014 19:35
  • Bonjour,

    Utilisez la fonction "JSON.stringify()" pour convertir votre objet Javascript en string JSON :

    $(document).ready(function(){
        $.ajax({
        url: 'http://localhost:8082/Service.svc/Data/Column',
        type: 'POST',
        contentType: 'application/json',
        dataType: 'json',
        data: JSON.stringify({ id: '74EA75BD-135E-4841-9CD3-6AB01D06BE83' },
            success: function (result) {
                console.log(result);
            })
        });
    });

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse Hantse jeudi 23 janvier 2014 10:02
    mercredi 22 janvier 2014 00:22
    Modérateur
  • Bonjour, merci pour votre réponse. C'est malheureusement l'une des déclinaison que j'ai aussi essayé et même erreur...

    mercredi 22 janvier 2014 06:52
  • Bonjour

    Essayez d’ajouter dans Global.asacx le traitement de l’Application_BeginRequest :

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
        }
    }
    Essayez aussi de utilizer dataType: 'text' dans l'appel Ajax.

    Cordialement,

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse Hantse jeudi 23 janvier 2014 10:02
    jeudi 23 janvier 2014 08:34
  • Bonjour,

    Et bien que dire de plus hormis un énorme merci. L'ajout du fichier avec les directives fonctionne, je peux même passer du JSON ou du TEXT en jQuery.

    Un grand merci à vous deux.

    Cordialement, Hantse

    jeudi 23 janvier 2014 10:02