IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Erreur de communication WCF et Json


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut Erreur de communication WCF et Json
    Bonjour,

    J'essai de mettre en place un webservice, hors je rencontre des difficultés pour communiquer avec en JSON, si je fais une web_references dans un projet en VB (winform/web) cela fonctionne, mais pas avec json.

    Merci de votre aide

    http://mydomain1.com/Service.svc
    Nom : http-service.svc.jpg
Affichages : 557
Taille : 118,9 Ko

    http://mydomain1.com/Service.svc?wsdl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    This XML file does not appear to have any style information associated with it. The document tree is shown below.
    <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://tempuri.org/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" name="Service" targetNamespace="http://tempuri.org/">
    <wsdl:types>
    <xsd:schema targetNamespace="http://tempuri.org/Imports">
    <xsd:import schemaLocation="http://mydomain1.com/Service.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
    <xsd:import schemaLocation="http://mydomain1.com/Service.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
    <xsd:import schemaLocation="http://mydomain1.com/Service.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/"/>
    </xsd:schema>
    </wsdl:types>
    <wsdl:message name="IService_GetData_InputMessage">
    <wsdl:part name="parameters" element="tns:GetData"/>
    </wsdl:message>
    <wsdl:message name="IService_GetData_OutputMessage">
    <wsdl:part name="parameters" element="tns:GetDataResponse"/>
    </wsdl:message>
    <wsdl:message name="IService_GetDataUsingDataContract_InputMessage">
    <wsdl:part name="parameters" element="tns:GetDataUsingDataContract"/>
    </wsdl:message>
    <wsdl:message name="IService_GetDataUsingDataContract_OutputMessage">
    <wsdl:part name="parameters" element="tns:GetDataUsingDataContractResponse"/>
    </wsdl:message>
    <wsdl:message name="IService_AddToNumber_InputMessage">
    <wsdl:part name="parameters" element="tns:AddToNumber"/>
    </wsdl:message>
    <wsdl:message name="IService_AddToNumber_OutputMessage">
    <wsdl:part name="parameters" element="tns:AddToNumberResponse"/>
    </wsdl:message>
    <wsdl:message name="IService_GetJsonTest1_InputMessage">
    <wsdl:part name="parameters" element="tns:GetJsonTest1"/>
    </wsdl:message>
    <wsdl:message name="IService_GetJsonTest1_OutputMessage">
    <wsdl:part name="parameters" element="tns:GetJsonTest1Response"/>
    </wsdl:message>
    <wsdl:message name="IService_GetJsonTest2_InputMessage">
    <wsdl:part name="parameters" element="tns:GetJsonTest2"/>
    </wsdl:message>
    <wsdl:message name="IService_GetJsonTest2_OutputMessage">
    <wsdl:part name="parameters" element="tns:GetJsonTest2Response"/>
    </wsdl:message>
    <wsdl:portType name="IService">
    <wsdl:operation name="GetData">
    <wsdl:input wsaw:Action="http://tempuri.org/IService/GetData" message="tns:IService_GetData_InputMessage"/>
    <wsdl:output wsaw:Action="http://tempuri.org/IService/GetDataResponse" message="tns:IService_GetData_OutputMessage"/>
    </wsdl:operation>
    <wsdl:operation name="GetDataUsingDataContract">
    <wsdl:input wsaw:Action="http://tempuri.org/IService/GetDataUsingDataContract" message="tns:IService_GetDataUsingDataContract_InputMessage"/>
    <wsdl:output wsaw:Action="http://tempuri.org/IService/GetDataUsingDataContractResponse" message="tns:IService_GetDataUsingDataContract_OutputMessage"/>
    </wsdl:operation>
    <wsdl:operation name="AddToNumber">
    <wsdl:input wsaw:Action="http://tempuri.org/IService/AddToNumber" message="tns:IService_AddToNumber_InputMessage"/>
    <wsdl:output wsaw:Action="http://tempuri.org/IService/AddToNumberResponse" message="tns:IService_AddToNumber_OutputMessage"/>
    </wsdl:operation>
    <wsdl:operation name="GetJsonTest1">
    <wsdl:input wsaw:Action="http://tempuri.org/IService/GetJsonTest1" message="tns:IService_GetJsonTest1_InputMessage"/>
    <wsdl:output wsaw:Action="http://tempuri.org/IService/GetJsonTest1Response" message="tns:IService_GetJsonTest1_OutputMessage"/>
    </wsdl:operation>
    <wsdl:operation name="GetJsonTest2">
    <wsdl:input wsaw:Action="http://tempuri.org/IService/GetJsonTest2" message="tns:IService_GetJsonTest2_InputMessage"/>
    <wsdl:output wsaw:Action="http://tempuri.org/IService/GetJsonTest2Response" message="tns:IService_GetJsonTest2_OutputMessage"/>
    </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="BasicHttpBinding_IService" type="tns:IService">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="GetData">
    <soap:operation soapAction="http://tempuri.org/IService/GetData" style="document"/>
    <wsdl:input>
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetDataUsingDataContract">
    <soap:operation soapAction="http://tempuri.org/IService/GetDataUsingDataContract" style="document"/>
    <wsdl:input>
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="AddToNumber">
    <soap:operation soapAction="http://tempuri.org/IService/AddToNumber" style="document"/>
    <wsdl:input>
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetJsonTest1">
    <soap:operation soapAction="http://tempuri.org/IService/GetJsonTest1" style="document"/>
    <wsdl:input>
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetJsonTest2">
    <soap:operation soapAction="http://tempuri.org/IService/GetJsonTest2" style="document"/>
    <wsdl:input>
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="Service">
    <wsdl:port name="BasicHttpBinding_IService" binding="tns:BasicHttpBinding_IService">
    <soap:address location="http://mydomain1.com/Service.svc"/>
    </wsdl:port>
    </wsdl:service>
    </wsdl:definitions>
    Webservice
    IService.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <ServiceContract()>
    Public Interface IService
     
        <OperationContract()>
        Function GetData(ByVal value As Integer) As String
     
        <OperationContract()>
        Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType
     
        ' TODO: ajoutez vos opérations de service ici
     
        <OperationContract()>
        Function AddToNumber(num1 As Integer, num2 As Integer) As Integer
     
        <OperationContract()>
        Function GetJsonTest1(value As String) As String
     
        <OperationContract()>
        <WebInvoke(UriTemplate:="/GetJsonTest2/{value}", Method:="POST", ResponseFormat:=WebMessageFormat.Json)>
        Function GetJsonTest2(value As String) As String
     
    End Interface
     
    <DataContract()>
    Public Class CompositeType
     
        <DataMember()>
        Public Property BoolValue() As Boolean
        <DataMember()>
        Public Property StringValue() As String
     
    End Class

    Service.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Imports System.Web.Script.Serialization
     
    Public Class Service
        Implements IService
     
        Public Sub New()
        End Sub
     
        Public Function GetData(ByVal value As Integer) As String Implements IService.GetData
            Return String.Format("You entered: {0}", value)
        End Function
     
        Public Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType Implements IService.GetDataUsingDataContract
            If composite Is Nothing Then
                Throw New ArgumentNullException("composite")
            End If
            If composite.BoolValue Then
                composite.StringValue &= "Suffix"
            End If
            Return composite
        End Function
     
        Public Function AddToNumber(num1 As Integer, num2 As Integer) As Integer Implements IService.AddToNumber
            Dim output As Integer = 0
            output = num1 + num2
            Return output
        End Function
     
        Public Function GetJsonTest1(value As String) As String Implements IService.GetJsonTest1
            If Trim(value & "") = "" Then
                value = "No Value"
            End If
     
            Dim output As String = "[{" & Chr(34) & "return" & Chr(34) & ": " & Chr(34) & value & Chr(34) & "}]"
     
            Return output
        End Function
     
        Public Function GetJsonTest2(value As String) As String Implements IService.GetJsonTest2
            Dim output As New List(Of Object)()
            output.Add(New With {Key .Id = "key", Key .Name = value})
            Return (New JavaScriptSerializer().Serialize(output))
        End Function
    End Class
    web.config
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
     
      <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
      </appSettings>
      <system.web>
        <customErrors mode="Off"/>
        <compilation debug="false" strict="false" explicit="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5"/>
        <pages>
          <namespaces>
            <add namespace="System.Runtime.Serialization" />
            <add namespace="System.ServiceModel" />
            <add namespace="System.ServiceModel.Web" />
          </namespaces>
        </pages>
      </system.web>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <!-- Pour éviter la divulgation d'informations de métadonnées, définissez les valeurs ci-dessous sur false avant le déploiement -->
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <!-- Pour recevoir les détails de l'exception dans les erreurs à des fins de débogage, définissez la valeur ci-dessous sur true.  Pour éviter la divulgation d'informations d'exception, définissez-la sur false avant le déploiement -->
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <protocolMapping>
            <add binding="basicHttpsBinding" scheme="https" />
        </protocolMapping>    
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <!--
            Pour parcourir le répertoire racine de l'application Web lors du débogage, définissez la valeur ci-dessous sur true.
            Définissez-la sur false avant le déploiement pour ne pas divulguer d'informations du dossier de l'application Web.
          -->
        <directoryBrowse enabled="true"/>
        <handlers>
          <add name="svc-integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler" resourceType="File" preCondition="integratedMode" />
        </handlers>
      </system.webServer>
     
    </configuration>
    http://mydomain2.com/test.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>myApp</title>
        <script src="/js/jquery-3.2.1.min.js"></script>
    </head>
     
    <body>
     
    	 <div id="jQueryRslt"></div>
     
        <script>
            $(document).ready(function () {
                WCFJSON();
            });
     
            function WCFJSON() {
                var myVar = "jquerie-value";
                Type = "POST";
                Url = "http://mydomain1.com/Service.svc/GetJsonTest2";
                //UrlResponse = "http://mydomain1.com/Service.svc/GetJsonTest2Response";
                Data = JSON.stringify(myVar);
                ContentType = "application/json; charset=utf-8";
                DataType = "json";
                VarProcessData = false;
                CallService();
            }
     
            function CallService() {
                    $.ajax({
                        type: Type,
                        url: Url,
                        data: Data,
                        contentType: ContentType,
                        //headers: {SOAPAction: UrlResponse},
                        dataType: DataType,
                        processdata: VarProcessData,
                        success: function (result) { ServiceSucceeded(result); },
                        error : ServiceFailed
                    });
                }
     
     
            function ServiceFailed(xhr) {
                var debug = 'Service call failed: ' + xhr.status;
                    if (xhr.responseText) {
                        var err = xhr.responseText;
                        if (err)
                            debug += err;
                        else
                            debug += ' Message: "Unknown server error."';
                    }
                    jQueryRslt.innerHTML = debug;
            }
     
            function ServiceSucceeded(result) {
                jQueryRslt.innerHTML = result;
            }
     
     
        </script>
    </body>
    </html>

    Erreur JSON
    Nom : json-error.jpg
Affichages : 198
Taille : 34,1 Ko

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Comme tu utilises un domaine different pour le client et pour le serveur, il faut que tu actives CORS (Cross-Origins Requests). Pour ce faire, il faut injecter 4 headers HTTP :
    - Access-Control-Allow-Origin- Access-Control-Allow-Methods- Access-Control-Allow-Headers- Access-Control-Max-AgePour Access-Control-Allow-Origin, tu peux mettre une * comme valeur, mais ca peut etre dangereux, il vaut mieux nommer explicitement les domaines autorises. Voici ce qu'il faut ajouter dans le global.asax :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost");  // Ici tu peux mettre une etoile a la place de "http://localhost", mais ca n'est pas recommande pour de la prod...
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");  // Ici il faut lister les methods autorisees
     
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
        }
    }
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut
    Bon j'ai réussis à transformer les tempuri.org en mydomain1.com

    La simple manipulation dans le global.asax que tu as proposé ne suffisait pas, j'ai du aussi modifier le "ServiceContract" dans IService.vb, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <ServiceContract([namespace]:=http://mydomain1.com)>
    Public Interface IService
    '[...]
    Cependant j'ai toujours une erreur 404 sur http://mydomain1.com/IService/GetJsonTest2.

    De plus, ce que je comprends pas c'est que si l'intégration en tant que WebRéférence dans un projet WPF ou winform fonctionne parfaitement

Discussions similaires

  1. [Débutant] [WCF] Communication entre système Android et WCF via JSON
    Par onizuka_metal dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 29/05/2013, 17h15
  2. Erreur de communication port série
    Par Kartoon67 dans le forum LabVIEW
    Réponses: 3
    Dernier message: 06/05/2009, 09h57
  3. Réponses: 1
    Dernier message: 30/04/2009, 18h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo