none
Service WCF avec IList inexploitable dans Winform et WPF RRS feed

  • Question

  • Bonjour

    J'ai voulu tenter de créer une application de browser WPF.

    Pour la partie données (comme à mon habitude, j'utilise un service WCF.

    J'essaie d'exécuter une méthode de mon service WCF (GetUser) et j'ai une erreur : "La clé de Registre spécifiée n'existe pas."

        Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
            Try
                acc = New WCFDataClient
                Dim Lst As IList(Of I_User) = acc.GetUser("Login", "", True)
                gr.ItemsSource = Lst
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

    A savoir, mon service WCF fonctionne très bien avec un projet ASP.Net.


    FB



    lundi 29 juillet 2013 14:13

Réponses

Toutes les réponses

  • Voici le web.config du service WCF :

    <?xml version="1.0"?>
    <configuration>
      <!--
        Pour obtenir une description des modifications de web.config pour .NET 4.5, voir http://go.microsoft.com/fwlink/?LinkId=235367.
        Les attributs suivants peuvent être définis dans la balise <httpRuntime>.
          <system.Web>
            <httpRuntime targetFramework="4.5" />
          </system.Web>
      -->
      <system.web>
        <compilation debug="true" strict="false" explicit="true" targetFramework="4.5"/>
        <authentication mode="Windows"/>
        <pages controlRenderingCompatibilityVersion="4.0"/>
      </system.web>
      <system.serviceModel>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
        <services>
          <service behaviorConfiguration="WcfGrangeReport.WCFDataBehavior" name="WcfGrangeReport.WCFData">
            <endpoint address="" binding="basicHttpBinding" contract="WcfGrangeReport.IWCFData"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="WcfGrangeReport.WCFDataBehavior">
              <!-- Pour éviter la divulgation des informations sur les métadonnées, définissez la valeur ci-dessous sur false et supprimez le point de terminaison des métadonnées ci-dessus avant le déploiement -->
              <serviceMetadata httpGetEnabled="true"/>
              <!-- Pour recevoir les détails d'exception des erreurs à des fins de débogage, définissez la valeur ci-dessous sur true.  Définissez-la sur false avant le déploiement pour éviter la divulgation des informations d'exception -->
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>


    FB

    lundi 29 juillet 2013 14:43
  • Voici l'App.Config du projet WPF (consommateur du service WCF) :

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.diagnostics>
            <sources>
                <!-- Cette section définit la configuration de l'enregistrement dans le fichier journal de My.Application.Log -->
                <source name="DefaultSource" switchName="DefaultSwitch">
                    <listeners>
                        <add name="FileLog"/>
                        <!-- Supprimez les marques de commentaire dans la section suivante pour écrire dans le journal des événements de l'application -->
                        <!--<add name="EventLog"/>-->
                    </listeners>
                </source>
            </sources>
            <switches>
                <add name="DefaultSwitch" value="Information" />
            </switches>
            <sharedListeners>
                <add name="FileLog"
                     type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                     initializeData="FileLogWriter"/>
                <!-- Supprimez les marques de commentaire dans la section suivante et remplacez APPLICATION_NAME par le nom de votre application à écrire dans le journal des événements de l'application -->
                <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
            </sharedListeners>
        </system.diagnostics>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IWCFData" />
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:52237/WcfGrangeReport/WCFData.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWCFData"
                    contract="ReportWCF.IWCFData" name="BasicHttpBinding_IWCFData" />
            </client>
        </system.serviceModel>
    </configuration>


    FB

    lundi 29 juillet 2013 14:47
  • Rien à faire, je suis bloqué...

    Dernières informations, coté WCF :

    Interface

    <OperationContract()>
        Function GetUser(ORDER As String, WHERE As String, NewVide As Boolean) As IList(Of I_User)
    <DataContract()> _
    Public Class I_User
        <DataMember()> _
        Public idUser As Long
        <DataMember()> _
        Public Nom As String
        <DataMember()> _
        Public Prenom As String
        <DataMember()> _
        Public Login As String
        <DataMember()> _
        Public Email As String
    End Class

    Méthode :

        Function GetUser(ORDER As String, WHERE As String, NewVide As Boolean) As IList(Of I_User) Implements IWCFData.GetUser
            Dim strSQL As String
            strSQL = "SELECT * FROM Vtbl_RP_User"
            strSQL = strSQL & " WHERE 1=1 "
            If WHERE <> "" Then
                strSQL = strSQL & " AND " & WHERE
            End If
            If ORDER <> "" Then
                strSQL = strSQL & " ORDER BY " & ORDER
            Else
                strSQL = strSQL & " ORDER BY Login"
            End If
            Dim ILs As IList(Of I_User) = New List(Of I_User)
            Try
                Dim IL As I_User
                Dim ds As DataSet = acc.GetDataSet(strSQL, "User")
                If Not ds Is Nothing Then
                    Dim dr As DataTableReader = ds.CreateDataReader
                    If dr.HasRows Then
                        Dim fis() As FieldInfo = New I_User().GetType.GetFields
                        Dim fi As FieldInfo
                        While dr.Read
                            IL = New I_User
                            For Each fi In fis
                                If Not IsDBNull(dr(fi.Name)) Then
                                    fi.SetValue(IL, dr(fi.Name))
                                End If
                            Next
                            ILs.Add(IL)
                        End While
                    Else
                        If NewVide Then
                            IL = New I_User
                            ILs.Add(IL)
                        End If
                    End If
                End If
            Catch ex As Exception
                RaiseEvent Erreur("GetUser", "", ex)
            End Try
            Return ILs
        End Function


    FB

    lundi 29 juillet 2013 15:25
  • Je pense avoir compris l'origine du problème, mais je ne trouve pas de solution...

    Ce qui m'a mis sur la piste, c'est la fenêtre "Sources de données" qui devrait m'afficher l'ensemble des OperationContract et des  DataContract de mon service WCF.

    Dans mon cas tout, toutes méthodes retournant des ILIST(OF ...) n'apparaissent pas, par exemple :

        <OperationContract()>
        Function GetUser(ORDER As String, WHERE As String, NewVide As Boolean) As IList(Of I_User)

    Ce que je ne comprends pas, c'est que tout fonctionne dans mon projet Web ASP.Net.

    Après des tests, ni les appli windows, ni les appli WCF fonctionnent.

    IList est il approprié?

    Sinon, que dois je utilisé pour avoir une compatibilité (Web, WinForm, WPF, ...)?


    FB

    mardi 30 juillet 2013 06:55
  • Puis je espérer de l'aide?

    Merci


    FB

    mardi 30 juillet 2013 12:26
  • Je ne comprends toujours pas...

    Je viens de m'apercevoir que le plantage suivant ne se déclenche pas lors du 2ème appelle

    Public Class frmUtilisateurs
        Private Sub frmUtilisateurs_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Try
                Dim a As New WCFDataClient
                a.Open()
                a.Authentifier("xxx", "eee")
                Dim ius As IList(Of I_User) = a.GetUser("", "", True)
                gr.DataSource = ius
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
    End Class

    Il va planter sur : a.Authentifier("xxx", "eee")

    Mais si (en debug), je retourne dessus, ça passe (même si a est réinstancié...)

    L'erreur est la suivante:


    FB

    mardi 30 juillet 2013 14:29
  • Bon... J'ai copié le répertoire dans un autre environnement de développement et ça marche...

    Bizarre. 


    FB

    mercredi 31 juillet 2013 07:41