Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    [4.5] - Lista di una lista per WebService

    Ciao,
    lo so che ci sono molti post relativi al problema in oggetto, ma nessuno di questi ha risolto il mio problema. Quindi provo ad esporlo sperando che qualcuno di voi possa aiutarmi.

    Ho creato una pagina Aspx e Aspx.cs per un WebService, che va a prendere le WebReference da un link https senza alcun problema.

    In testa alla pagina aspx.cs scrivo giustamente:
    codice:
    public partial class testservice : System.Web.UI.Page
    {
        WcfDemo.Service1Client test = new WcfDemo.Service1Client();
    [etc...]
    E così posso richiamare tranquillamente tutti i metodi, che funzionano tutti... tranne uno

    Il metodo in questione
    "ResponseInsertAdempFields = test.ResponseInsertAdempFields(Token, ListInsertAdempResponse);"

    richiede in input una stringa "Token" che do in pasto senza problemi, al contrario invece di "ListInsertAdempResponse" che è una lista dal costrutto un po' complicato.

    Nella pagina "originale" da cui il WebService prende la WebReference, il codice di questa lista è il seguente:

    codice:
    public class ResponseInsertAdempList
        {
            bool Ok = true;
            string MessageResult = "";
    
    
            [DataMember]
            public bool TestOk
            {
                get { return Ok; }
                set { Ok = value; }
            }
    
    
            [DataMember]
            public string TestMessageResult
            {
                get { return MessageResult; }
                set { MessageResult = value; }
            }
        }
    
    
        public class InsertAdempFields
        {
            string NomeCampo = "";
            string ValoreCampo = "";
    
    
    
    
            [DataMember]
            public string TestNomeCampo
            {
                get { return NomeCampo; }
                set { NomeCampo = value; }
            }
    
    
            [DataMember]
            public string TestValoreCampo
            {
                get { return ValoreCampo; }
                set { ValoreCampo = value; }
            }
        }
    
    
        public class InsertAdempList
        {
            List<InsertAdempFields> campi = new List<InsertAdempFields>();
    
    
    
    
            [DataMember]
            public List<InsertAdempFields> Campi
            {
                get { return campi; }
                set { campi = value; }
            }
        }
    Nella pagina aspx.cs quindi creo le istanze necessarie:

    codice:
    //output dell'insert (è OK)
    static public ResponseInsertAdempList ResponseInsertAdempFields = new ResponseInsertAdempList();
    
    //input dell'insert (non è OK... perchè perde il riferimento quando scava dentro nella lista)
    static public InsertAdempList ListInsertAdempResponse = new InsertAdempList();
    E in sintesi dovrei assegnare dei valori a variabili di questo tipo:

    codice:
    ListInsertAdempResponse.Campi[0].TestNomeCampo = "S_CAMPO1";
    ListInsertAdempResponse.Campi[0].TestValoreCampo = Request["campo1"];
    La variabile viene riconosciuta da Visual Studio (senza sottolineature di errore), purtroppo però quando avvio e chiamo il metodo, è come se il puntatore si perdesse dopo Campi in "ListInsertAdempResponse.Campi"

    l'errore mi dice:
    "WcfDemo.InsertAdempList.Campi.get ha restituito null"


    Ho provato di tutto, creando tutte le istanze possibili e immaginabili come:
    codice:
    static public List<InsertAdempFields> Campi = new List<InsertAdempFields>();
    static public InsertAdempFields Fields = new InsertAdempFields();

    Ho provato anche a creare una variabile ad HOC come:
    codice:
    static public InsertAdempList<List<InsertAdempFields>> ListInsertAdempResponse = new InsertAdempList<List<InsertAdempFields>>();
    Con questa non ho problemi nell'assegnazione (riesco ad assegnare i valori) però poi il metodo non me la riconosce come tipo valido in input

    Poi ho provato a guardare la definizione della "InsertAdempList" (la variabile in input) nella pagina del progetto WebService e vedo che il costruttore è leggermente diverso:
    codice:
    public class InsertAdempList : IExtensibleDataObject, INotifyPropertyChanged
        {
            public InsertAdempList();
    
    
            public ExtensionDataObject ExtensionData { get; set; }
            [DataMember]
            public InsertAdempFields[] Campi { get; set; }
    
    
            public event PropertyChangedEventHandler PropertyChanged;
    
    
            protected void RaisePropertyChanged(string propertyName);
        }
    In particolare noto che "public InsertAdempFields[] Campi { get; set; }"
    ha solo dei semplici get e set, mentre invece nel progetto di riferimento il costrutto era più complesso

    Forse è questo il problema? La pagina della definizione però è bloccata, non posso modificarla.

    Io ho finito tutte le idee, spero di essere riuscito a spiegarmi. Per favore aiutatemi :'(

    Vi ringrazio infinitamente già anche solo per la pazienza che mi dedicherete...
    Cordialmente,
    Raimondo
    Ultima modifica di djciko; 17-04-2018 a 10:50

  2. #2
    Posto qui tutto il codice perchè avevo superato il limite di caratteri:
    codice:
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WcfDemo;
     
    public partial class testservice : System.Web.UI.Page
    {
        WcfDemo.Service1Client test = new WcfDemo.Service1Client();
     
        static public ResponseToken TokenResponse;
        static public ResponseLogin LoginResponse;
        static public ResponseFinal FinalResponse;
     
        
        static public List<ResponseAdempFields> listAdempResponse = new List<ResponseAdempFields>();
     
        //output dell'insert (è OK)
        static public ResponseInsertAdempList ResponseInsertAdempFields = new ResponseInsertAdempList();
     
        //input dell'insert (non è OK... perchè??)
        static public InsertAdempList ListInsertAdempResponse = new InsertAdempList();
     
        //static public InsertAdempList<List<InsertAdempFields>> ListInsertAdempResponse = new InsertAdempList<List<InsertAdempFields>>();
        //static public List<List<InsertAdempFields>> ListInsertAdempResponseold = new List<List<InsertAdempFields>>();
        //static public List<InsertAdempFields> Campi = new List<InsertAdempFields>();
        static public InsertAdempFields Fields = new InsertAdempFields();
     
        //static public InsertAdempList<List<InsertAdempFields>> ListInsertAdempResponse1 = new InsertAdempList<List<InsertAdempFields>>();
        //public partial class InsertAdempList<List>
        //{
        //    List<InsertAdempFields> campi = new List<InsertAdempFields>();
     
        //    public List<InsertAdempFields> Campi
        //    {
        //        get { return campi; }
        //        set { campi = value; }
        //    }
        //}
     
        static public ResponseAllAdempList ResponseAllAdempFields;
     
        static public ResponseAdempList ResponseAdempFields = new ResponseAdempList();
        static public WcfDemo.ResponseAdempFields[] ListAdempResponse = new WcfDemo.ResponseAdempFields[20];
        static public ResponseAdempFields fieldsAdempResponse = new ResponseAdempFields();
     
     
        static public string[] ListCaratteri3 = new string[0];
        static public string[] ListDettagli3 = new string[0];
        static public string[] ListLabel3 = new string[0];
        static public string[] ListNomeCampo3 = new string[0];
        static public string[] ListNullo3 = new string[0];
        static public string[] ListNum3 = new string[0];
        static public string[] ListTabRif3 = new string[0];
        static public string[] ListTipo3 = new string[0];
        static public string[] ListValore3 = new string[0];
        static public string[] ListVisualizza3 = new string[0];
        
        static public bool TestResponse = false;
        static public string DbResponse = "";
        static public string MessageResult = "";
        static public string MethodSelect = "";
        static public int IdResponse = 0;
     
        static public int Lenght3 = 0;
        static public int Lenght4 = 0;
        static public int Lenght6sup = 0;
        static public int Lenght6inf = 0;
        
        static public string Token = "";
        static public string Login = "";
        static public string Password = "";
        static public string NAdempimento = "";
        static public string NScheda = "";
     
        static public string Campo1 = "";
        static public string Campo2 = "";
        static public string Campo3 = "";
        static public string Campo11 = "";
        static public string Campo12 = "";
        static public string Campo13 = "";
        static public string Campo14 = "";
        static public string Campo15 = "";
        static public string Campo21 = "";
        static public string Campo22 = "";
        static public string Campo23 = "";
        static public string Note1 = "";
        static public string Note2 = "";
        static public string Note3 = "";
        static public string Note4 = "";
        static public string Data = "";
     
        protected void Page_Load(object sender, EventArgs e)
        {
            
        }
     
        public void clickFunction(object sender, EventArgs e)
        {
            MethodSelect = Request["methodSelect"];
            Token = Request["token"];
            Login = Request["login"];
            Password = Request["password"];
            NAdempimento = Request["nAdempimento"];
            NScheda = Request["nscheda"];
            
     
     
     
            if (MethodSelect == "-")
            {
                MessageResult = "Seleziona un metodo";
            }
     
            if (MethodSelect == "checkToken")
            {
                TokenResponse = test.CheckToken(Token);
     
                TestResponse = TokenResponse.TestOk;
                DbResponse = TokenResponse.TestDatabaseLogin;
                MessageResult = TokenResponse.TestMessageResult;
            }
     
            if (MethodSelect == "checkLogin")
            {
                LoginResponse = test.CheckLogin(Token,Login,Password);
     
                TestResponse = LoginResponse.TestOk;
                IdResponse = LoginResponse.TestIDAccesso;
                MessageResult = LoginResponse.TestMessageResult;
            }
     
            if (MethodSelect == "responseField")
            {
                FinalResponse = test.ResponseFields(Token);
     
                Lenght3 = FinalResponse.TestListResponse.Length;
                TestResponse = FinalResponse.TestOk;
                MessageResult = FinalResponse.TestMessageResult;
     
                for (int i = 0; i < FinalResponse.TestListResponse.Length; i++)
                {
                    Array.Resize(ref ListCaratteri3, i + 1);
                    ListCaratteri3[i] = FinalResponse.TestListResponse[i].TestCaratteri;
     
                    Array.Resize(ref ListDettagli3, i + 1);
                    ListDettagli3[i] = FinalResponse.TestListResponse[i].TestDettagli;
     
                    Array.Resize(ref ListLabel3, i + 1);
                    ListLabel3[i] = FinalResponse.TestListResponse[i].TestLabel;
     
                    Array.Resize(ref ListNomeCampo3, i + 1);
                    ListNomeCampo3[i] = FinalResponse.TestListResponse[i].TestNomeCampo;
     
                    Array.Resize(ref ListNullo3, i + 1);
                    ListNullo3[i] = FinalResponse.TestListResponse[i].TestNullo;
     
                    Array.Resize(ref ListNum3, i + 1);
                    ListNum3[i] = FinalResponse.TestListResponse[i].TestNum;
     
                    Array.Resize(ref ListTabRif3, i + 1);
                    ListTabRif3[i] = FinalResponse.TestListResponse[i].TestTabRif;
     
                    Array.Resize(ref ListTipo3, i + 1);
                    ListTipo3[i] = FinalResponse.TestListResponse[i].TestTipo;
     
                    Array.Resize(ref ListValore3, i + 1);
                    ListValore3[i] = FinalResponse.TestListResponse[i].TestValore;
     
                    Array.Resize(ref ListVisualizza3, i + 1);
                    ListVisualizza3[i] = FinalResponse.TestListResponse[i].TestVisualizza;
                }
            }
     
            if (MethodSelect == "responseAdempFields")
            {
                ResponseAdempFields = test.ResponseAdempFields(Token, NAdempimento, NScheda);
     
                Lenght4 = ResponseAdempFields.TestListAdempResponse.Length;
                TestResponse = ResponseAdempFields.TestOk;
                MessageResult = ResponseAdempFields.TestMessageResult;
            }
     
            if (MethodSelect == "responseInsertAdempFields")
            {
                Fields.TestNomeCampo = "S_CAMPO1";
                Fields.TestValoreCampo = Request["campo1"];
     
                ListInsertAdempResponse.Campi[0].TestNomeCampo = "S_CAMPO1";
                ListInsertAdempResponse.Campi[0].TestValoreCampo = Request["campo1"];
     
                ListInsertAdempResponse.Campi[1].TestNomeCampo = "S_CAMPO2";
                ListInsertAdempResponse.Campi[1].TestValoreCampo = Request["campo2"];
     
                ListInsertAdempResponse.Campi[2].TestNomeCampo = "S_CAMPO3";
                ListInsertAdempResponse.Campi[2].TestValoreCampo = Request["campo3"];
     
                ListInsertAdempResponse.Campi[3].TestNomeCampo = "S_CAMPO11";
                ListInsertAdempResponse.Campi[3].TestValoreCampo = Request["campo11"];
     
                ListInsertAdempResponse.Campi[4].TestNomeCampo = "S_CAMPO12";
                ListInsertAdempResponse.Campi[4].TestValoreCampo = Request["campo12"];
     
                ListInsertAdempResponse.Campi[5].TestNomeCampo = "S_CAMPO13";
                ListInsertAdempResponse.Campi[5].TestValoreCampo = Request["campo13"];
     
                ListInsertAdempResponse.Campi[6].TestNomeCampo = "S_CAMPO14";
                ListInsertAdempResponse.Campi[6].TestValoreCampo = Request["campo14"];
     
                ListInsertAdempResponse.Campi[7].TestNomeCampo = "S_CAMPO15";
                ListInsertAdempResponse.Campi[7].TestValoreCampo = Request["campo15"];
     
                ListInsertAdempResponse.Campi[8].TestNomeCampo = "S_CAMPO21";
                ListInsertAdempResponse.Campi[8].TestValoreCampo = Request["campo21"];
     
                ListInsertAdempResponse.Campi[9].TestNomeCampo = "S_CAMPO22";
                ListInsertAdempResponse.Campi[9].TestValoreCampo = Request["campo22"];
     
                ListInsertAdempResponse.Campi[10].TestNomeCampo = "S_CAMPO23";
                ListInsertAdempResponse.Campi[10].TestValoreCampo = Request["campo23"];
     
                ListInsertAdempResponse.Campi[11].TestNomeCampo = "S_NOTE1";
                ListInsertAdempResponse.Campi[11].TestValoreCampo = Request["note1"];
     
                ListInsertAdempResponse.Campi[12].TestNomeCampo = "S_NOTE2";
                ListInsertAdempResponse.Campi[12].TestValoreCampo = Request["note2"];
     
                ListInsertAdempResponse.Campi[13].TestNomeCampo = "S_NOTE3";
                ListInsertAdempResponse.Campi[13].TestValoreCampo = Request["note3"];
     
                ListInsertAdempResponse.Campi[14].TestNomeCampo = "S_NOTE4";
                ListInsertAdempResponse.Campi[14].TestValoreCampo = Request["note4"];
     
                ListInsertAdempResponse.Campi[15].TestNomeCampo = "D_DATA";
                ListInsertAdempResponse.Campi[15].TestValoreCampo = Request["data"];
     
                ResponseInsertAdempFields = test.ResponseInsertAdempFields(Token, ListInsertAdempResponse);
     
                TestResponse = ResponseInsertAdempFields.TestOk;
                MessageResult = ResponseInsertAdempFields.TestMessageResult;
            }
     
            if (MethodSelect == "responseAllAdempFields")
            {
                ResponseAllAdempFields = test.ResponseAllAdempFields(Token,Login,Password);
     
                Lenght6sup = ResponseAllAdempFields.TestAllListAdempResponse.Length;
                Lenght6inf = ResponseAllAdempFields.TestAllListAdempResponse[1].TestListAdempResponse.Length;
                TestResponse = ResponseAllAdempFields.TestOk;
                MessageResult = ResponseAllAdempFields.TestMessageResult;
     
            }
        }

  3. #3
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    potresti indicare soltanto il punto dove non funziona ?

    intanto ho provato con una classe ed una paginetta in cui c'e' una label "lb", che viene correttamente valorizzata con "nome - mario // cognome - rossi", vedi se trovi qualche spunto (non ho capito perche' le proprieta' sono static) :

    codice:
    public class InsertAdempFields
        {
            string _NomeCampo = string.Empty;
            string _ValoreCampo = string.Empty;
    
    
            public string TestNomeCampo
            {
                get { return _NomeCampo; }
                set { _NomeCampo = value; }
            }
    
    
            public string TestValoreCampo
            {
                get { return _ValoreCampo; }
                set { _ValoreCampo = value; }
            }
        }
    
    
    
    
        public class InsertAdempList
        {
            List<InsertAdempFields> _Campi = new List<InsertAdempFields>();
    
    
            public List<InsertAdempFields> Campi
            {
                get { return _Campi; }
                set { _Campi = value; }
            }
        }
    
    
    
    
        public partial class PAGINA_PROVA: System.Web.UI.Page
        {
            InsertAdempList listaCampiInsert = new InsertAdempList();
    
    
            protected void Page_Load(object sender, EventArgs e)
            {
                listaCampiInsert.Campi.Add(new InsertAdempFields { TestNomeCampo = "Nome", TestValoreCampo = "Mario" });
                listaCampiInsert.Campi.Add(new InsertAdempFields { TestNomeCampo = "Cognome", TestValoreCampo = "Rossi" });
    
    
                foreach (InsertAdempFields item in listaCampiInsert.Campi)
                {
                    lb.Text += item.TestNomeCampo + " - " + item.TestValoreCampo;
                    lb.Text += "<hr>";
                }
            }
        }

    e vedo correttamente valorizzata la label con i nomi dei campi ed i loro valori..

    Ora, venendo alla definizione nel WebService, un get ed un set bastano, l'importante e' la decorazione e la corretta definizione della classe che riguarda la proprieta'...

    Dovresti postare la parte del WS con la definizione precisa (vedo le classi duplicate nella pagina, non ho capito neanche questo punto)
    Ultima modifica di djciko; 17-04-2018 a 12:09

  4. #4
    Quote Originariamente inviata da djciko Visualizza il messaggio
    potresti indicare soltanto il punto dove non funziona ?
    Certo, il punto che non funziona è questo:

    codice:
    ListInsertAdempResponse.Campi[0].TestNomeCampo = "S_CAMPO1";
    Nello specifico succede che il puntatore si perde dopo "Campi" -> ListInsertAdempResponse.Campi
    e mi da l'errore:

    codice:
    System.NullReferenceException: 'Riferimento a un oggetto non impostato su un'istanza di oggetto.'
    
    
    WcfDemo.InsertAdempList.Campi.get ha restituito null.
    Ho visto che hai fatto una cosa bellissima aggiungendo il .add dopo Campi e volevo fare così anche io, ma purtroppo Visual Studio non me consente, dicendomi:
    codice:
    InsertAdempFields[]' non contiene una definizione di 'Add' e non è stato trovato alcun metodo di estensione 'Add' che accetta un primo argomento di tipo 'InsertAdempFields[]'. Probabilmente manca una direttiva using o un riferimento all'assembly.
    Se aggiungo il codice di costruzione come il tuo, in fondo alla pagina, il .add mi viene consentito, però la variabile "ListInsertAdempResponse" perde la compatibilità di tipo quando vado a richiamare il metodo:

    codice:
    ResponseInsertAdempFields = test.ResponseInsertAdempFields(Token, ListInsertAdempResponse);
    mi da l'errore:
    codice:
    Argomento 2: non è possibile convertire da 'testservice.InsertAdempList' a 'WcfDemo.InsertAdempList'    
    
    La corrispondenza migliore del metodo di overload per 'WcfDemo.Service1Client.ResponseInsertAdempFields(string, WcfDemo.InsertAdempList)' presenta alcuni argomenti non validi

    Quote Originariamente inviata da djciko Visualizza il messaggio
    intanto ho provato con una classe ed una paginetta in cui c'e' una label "lb", che viene correttamente valorizzata con "nome - mario // cognome - rossi", vedi se trovi qualche spunto (non ho capito perche' le proprieta' sono static) :
    Ho tolto lo static, effettivamente non serviva...


    Quote Originariamente inviata da djciko Visualizza il messaggio
    e vedo correttamente valorizzata la label con i nomi dei campi ed i loro valori..

    Ora, venendo alla definizione nel WebService, un get ed un set bastano, l'importante e' la decorazione e la corretta definizione della classe che riguarda la proprieta'...

    Dovresti postare la parte del WS con la definizione precisa (vedo le classi duplicate nella pagina, non ho capito neanche questo punto)
    Probabilmente hai ragione, è un problema di "decorazione" delle proprietà che non riesco a capire...

    La definizione precisa che si trova nel riferimento web è questa:

    codice:
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Text;
    using ComunicaCrypto;
    
    
    namespace WcfDemo
    {
        [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            ResponseInsertAdempList ResponseInsertAdempFields(string Token, InsertAdempList ListAdempResponse);
        }
    
    [DataContract]
    public class ResponseInsertAdempList
        {
            bool Ok = true;
            string MessageResult = "";
    
    
            [DataMember]
            public bool TestOk
            {
                get { return Ok; }
                set { Ok = value; }
            }
    
    
            [DataMember]
            public string TestMessageResult
            {
                get { return MessageResult; }
                set { MessageResult = value; }
            }
        }
    
    
        public class InsertAdempFields
        {
            string NomeCampo = "";
            string ValoreCampo = "";
    
    
    
    
            [DataMember]
            public string TestNomeCampo
            {
                get { return NomeCampo; }
                set { NomeCampo = value; }
            }
    
    
            [DataMember]
            public string TestValoreCampo
            {
                get { return ValoreCampo; }
                set { ValoreCampo = value; }
            }
        }
    
    
        public class InsertAdempList
        {
            List<InsertAdempFields> campi = new List<InsertAdempFields>();
            
            [DataMember]
            public List<InsertAdempFields> Campi
            {
                get { return campi; }
                set { campi = value; }
            }
        }
    }
    Nel file di configurazione del WebService (che si è creato in automatico dopo aver aggiunto il web reference) invece ho

    La funzione che richiamo:
    codice:
    public ResponseInsertAdempList ResponseInsertAdempFields(string Token, InsertAdempList ListAdempResponse);
    e le proprietà della "InsertAdempList":
    codice:
    namespace WcfDemo
    {
        [DataContract(Name = "InsertAdempList", Namespace = "http://schemas.datacontract.org/2004/07/WcfDemo")]
        [DebuggerStepThrough]
        [GeneratedCode("System.Runtime.Serialization", "4.0.0.0")]
        public class InsertAdempList : IExtensibleDataObject, INotifyPropertyChanged
        {
            public InsertAdempList();
    
    
            public ExtensionDataObject ExtensionData { get; set; }
            [DataMember]
            public InsertAdempFields[] Campi { get; set; }
    
    
            public event PropertyChangedEventHandler PropertyChanged;
    
    
            protected void RaisePropertyChanged(string propertyName);
        }
    }
    Per le classi duplicate non ho capito bene, forse intendi tutte quelle istanze che avevo creato e poi commentato?
    C'era un po' di confusione in effetti... adesso riposto la pagina del codice con solo le informazioni strettamente necessarie

    Grazie mille per il tuo aiuto!
    Raimondo
    Ultima modifica di RayanHawkins; 17-04-2018 a 15:21

  5. #5
    codice:
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WcfDemo;
    
    
    public partial class testservice : System.Web.UI.Page
    {
        WcfDemo.Service1Client test = new WcfDemo.Service1Client();
    
    //output del metodo ResponseInsertAdempFields (è OK)
        public ResponseInsertAdempList ResponseInsertAdempFields = new ResponseInsertAdempList();
    
    
    //input del metodo ResponseInsertAdempFields (non è OK... perchè??)
        public InsertAdempList ListInsertAdempResponse = new InsertAdempList();
    
    public string MethodSelect = "";
    public bool TestResponse = false;
    public string MessageResult = "";
    public string Token = "";
    
    public void clickFunction(object sender, EventArgs e)
        {
            MethodSelect = Request["methodSelect"];
            Token = Request["token"];
    
    if (MethodSelect == "responseInsertAdempFields")
            {
                ListInsertAdempResponse.Campi[0].TestNomeCampo = "S_CAMPO1";
                ListInsertAdempResponse.Campi[0].TestValoreCampo = Request["campo1"];
    
    
                ListInsertAdempResponse.Campi[1].TestNomeCampo = "S_CAMPO2";
                ListInsertAdempResponse.Campi[1].TestValoreCampo = Request["campo2"];
    
    //[Campi[2], Campi[3], ETC...]
                [...]
    
    
                ResponseInsertAdempFields = test.ResponseInsertAdempFields(Token, ListInsertAdempResponse);
    
    
                TestResponse = ResponseInsertAdempFields.TestOk;
                MessageResult = ResponseInsertAdempFields.TestMessageResult;
            }
        }
    }
    Ultima modifica di RayanHawkins; 17-04-2018 a 15:14

  6. #6
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    C'e' molta confusione e molto codice in piu' su una cosa abbastanza semplice...

    Innanzitutto, il cast non è possibile convertire da 'testservice.InsertAdempList' a 'WcfDemo.InsertAdempList'
    ti da' questo errore perche' le due classi sono sotto due Namespace diversi (un namespace e' WcfDemo, l'altro è testservice).

    Fidati di me, parti d'accapo con la paginetta, (cancella anche il reference al WS e rifallo) dando dei nomi --piu' facili-- alle variabili, senno' non ne esci....mi sa che ti stai incartando perche' stai scambiando una classe con un'altra, a causa della confusione del codice...

    --------------------------------------
    ci hai fatto caso che queste due (la prima non ho capito neanche cosa e')

    public class InsertAdempList : IExtensibleDataObject, INotifyPropertyChanged


    ha lo stesso nome di


    public class InsertAdempList

    {
    List<InsertAdempFields> campi = new List<InsertAdempFields>();


    ?

    ... probabilmente è per questo che si confonde







  7. #7
    Quote Originariamente inviata da djciko Visualizza il messaggio
    C'e' molta confusione e molto codice in piu' su una cosa abbastanza semplice...

    Innanzitutto, il cast non è possibile convertire da 'testservice.InsertAdempList' a 'WcfDemo.InsertAdempList'
    ti da' questo errore perche' le due classi sono sotto due Namespace diversi (un namespace e' WcfDemo, l'altro è testservice).

    Fidati di me, parti d'accapo con la paginetta, (cancella anche il reference al WS e rifallo) dando dei nomi --piu' facili-- alle variabili, senno' non ne esci....mi sa che ti stai incartando perche' stai scambiando una classe con un'altra, a causa della confusione del codice...
    Si hai ragione... sarebbe bello poter andare in una parte di codice col name space "WcfDemo", aggiungergli il costruttore e -fregare- Visual studio.
    Comunque le stringhe in input le prende, anche se hanno namespace diverso... quindi il problema deve essere che gli oggetti 'testservice.InsertAdempList' e 'WcfDemo.InsertAdempList' sono proprio diversi.. e forse ho capito il perchè.

    Nel progetto "back-end" il codice:
    codice:
    public class ResponseInsertAdempList
        {
            bool Ok = true;
            string MessageResult = "";
    
    
            [DataMember]
            public bool TestOk
            {
                get { return Ok; }
                set { Ok = value; }
            }
    
    
            [DataMember]
            public string TestMessageResult
            {
                get { return MessageResult; }
                set { MessageResult = value; }
            }
        }
    
    
        public class InsertAdempFields
        {
            string NomeCampo = "";
            string ValoreCampo = "";
    
    
    
    
            [DataMember]
            public string TestNomeCampo
            {
                get { return NomeCampo; }
                set { NomeCampo = value; }
            }
    
    
            [DataMember]
            public string TestValoreCampo
            {
                get { return ValoreCampo; }
                set { ValoreCampo = value; }
            }
        }
    
    
        public class InsertAdempList
        {
            List<InsertAdempFields> campi = new List<InsertAdempFields>();
    
    
    
    
            [DataMember]
            public List<InsertAdempFields> Campi
            {
                get { return campi; }
                set { campi = value; }
            }
        }
    Viene costruita una variabile di tipo "InsertAdempList.Campi[i].NomeCampo"

    Mentre nel codice del WebService, dopo aver aggiunto i riferimenti, Visualstudio mi cambia di sua iniziativa il costrutto, che diventa:
    codice:
        [DataContract(Name = "InsertAdempList", Namespace = "http://schemas.datacontract.org/2004/07/WcfDemo")]
        [DebuggerStepThrough]
        [GeneratedCode("System.Runtime.Serialization", "4.0.0.0")]
        public class InsertAdempList : IExtensibleDataObject, INotifyPropertyChanged
        {
            public InsertAdempList();
    
    
            public ExtensionDataObject ExtensionData { get; set; }
            [DataMember]
            public InsertAdempFields[] Campi { get; set; }
    
    
            public event PropertyChangedEventHandler PropertyChanged;
    
    
            protected void RaisePropertyChanged(string propertyName);
        }
    In particolare noto la riga
    codice:
    "public InsertAdempFields[] Campi { get; set; }"
    che mi sta dicendo che il "Campi" non è più una lista come prima
    codice:
    public List<InsertAdempFields> Campi        {
                get { return campi; }
                set { campi = value; }
            }
    ma è solo un semplice vettore e quindi si aspetta una variabile di tipo "InsertAdempList.Campi[i]"
    che infatti è proprio il punto dove si perde il puntatore nell'errore

    codice:
    System.NullReferenceException: 'Riferimento a un oggetto non impostato su un'istanza di oggetto.'
    
    
    WcfDemo.InsertAdempList.Campi.get ha restituito null.
    --------------------------------------
    Quote Originariamente inviata da djciko Visualizza il messaggio
    ci hai fatto caso che queste due (la prima non ho capito neanche cosa e')

    public class InsertAdempList : IExtensibleDataObject, INotifyPropertyChanged


    ha lo stesso nome di


    public class InsertAdempList

    {
    List<InsertAdempFields> campi = new List<InsertAdempFields>();


    ?

    ... probabilmente è per questo che si confonde
    La prima è nel codice che si è creato in automatico quando ho aggiunto le Web Reference al "Progetto WebService"

    La seconda invece è nel codice che ho costruito nel "Progetto Back-End"

    Sono due progetti differenti.

    --------------------------------------

    Comunque sia ti ringrazio infinitamente per la disponibilità e l'aiuto, ho sicuramente capito meglio il problema che c'è dietro, anche se non ho ancora la soluzione.

    A mali estremi potrei andare a modificare il costrutto nel "Progetto Back-End" così da avere una variabile più semplice in input e che non mi venga sminchiata da VisualStudio.
    Vi farò sapere

    Cordialmente,
    Raimondo
    Ultima modifica di RayanHawkins; 18-04-2018 a 10:58

  8. #8
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    ah ok. e' la classe Proxy generata dalla scoperta del WS. Ti consiglio di non toccarla, ignorala

  9. #9
    Quote Originariamente inviata da djciko Visualizza il messaggio
    ah ok. e' la classe Proxy generata dalla scoperta del WS. Ti consiglio di non toccarla, ignorala
    Eh ma è proprio lì il problema, solo che la pagina viene da metadati e ha il lucchetto e non si può modificare.

    Se almeno potessi modificarla potrei cancellare la costruzione del vettore e mettere la lista per risolvere il problema, penso @_@

  10. #10
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    quelle classi non devi toccarle, non e' li' il problema, quello e' un automatismo.

    fidati, rifai tutto d'accapo un pezzettino alla volta, vedrai che e' qualche sciocchezza. Ho il sospetto che tu ti stia confondendo con i nomi delle classi, c'e' troppa confusione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.