438 messaggi dal 08 aprile 2009
Ho un metodo web che restituisce una List tipizzata.
Questo è l'esempio:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebServiceList
{
    /// <summary>
    /// Descrizione di riepilogo per Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // Per consentire la chiamata di questo servizio Web dallo script utilizzando ASP.NET AJAX, rimuovere il commento dalla riga seguente. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {



       
        [WebMethod]
        public List<Dati.struttura> GetDati()
        {
            return Dati.getDati();
        }


    }
}


Mettiamo che la classe che definisce il dato (in questo caso Dati.cs) è incorporata sia nel servizio sia nel Win Form che richiama il servizio.
Nel win form richiamo il metodo GetDati()
  ServiceWebdati.Service1 service = new WindowsFormsAppList.ServiceWebdati.Service1();
            var list = service.GetDati();

ora se list la vorrei convertire in una List<Dati.struttura> come faccio??? Mi dice cast non valido...
ho provato così:
 List<Dati.struttura> listStruct = list.Cast<Dati.struttura>().ToList();


Ma in fase di esecuzione mi va in eccezione di Cast non valido..
5.610 messaggi dal 09 febbraio 2002
Contributi
ciao, non è necessario aggiungere il file Dati.cs anche al progetto winforms perché nel momento in cui aggiungi un riferimento al servizio, Visual studio crea per te una classe proxy idonea.


var list = service.GetDati();


poggia il mouse sul metodo .GetDati(), cosa ti dice il tooltip, qual è il tipo restituito? Dovrebbe già essere un array di tipo Struttura, non c'è bisogno di fare casting.

Se anziché un array volessi ottenere una List<Struttura>, allora puoi procedere in due modi:
  • Banalmente, invochi il .ToList() sul risultato di service.GetDati();
  • Oppure, se preferisci che tutte le collezioni restituite dal webservice siano delle liste, allora puoi configurare il riferimento al servizio in modo che sia così. Dal progetto winforms, cerca nel Solution explorer di Visual Studio il file del servizio e poi fai tasto destro -> Configura referenza al servizio. Come tipo delle collezioni seleziona System.Collections.Generic.List. Mi sembra però che questa cosa non si possa fare se hai una delle versioni Express di visual studio.


ciao

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
438 messaggi dal 08 aprile 2009
Ciao e grazie per la risposta.
Lo so che per un uso comune non è necessario avere la classe Dati anche nel progetto WinForm ma qui la necessità è progettuale per i fini dell'applicazione.

Stiamo sviluppando un applicazione il cui core è gestito tutto da una classe: quindi sia procedure di caricamento dati, ricerche, controlli e salvataggio dei dati.
è un'applicazione che è destinata su dispositivi mobile e poichè molti utenti la utilizzano in zone in cui non c'è copertura di rete la prima versione che è uscita ha i dati direttamente in locale. All'apertura dell'applicazione i dati vengono caricati in delle liste e da quel momento in poi in tutte le procedure che vengono utilizzate si punta a queste liste con strutture tipizzate.

La versione successiva è destinata a coloro che hanno sempre copertura di rete e vogliono i dati sempre aggiornati con il gestionale di base. Quindi si intende sviluppare dei servizi web con dei metodi che restituiscono i dati e implementano le liste che tutte le procedure di controllo e salvataggio dati utilizzano.

Per questo motivo in questo piccolo esempio ho la stessa classe dati sia nel servizio che nel winform ed è per questo che la lista di risultati del servizio deve andare a finire nella lista locale. Questo è possibile farlo con una foreach o con una select lamba dal risultato della lista ma volevo trovare una Cast immediata per avere lo stesso risultato.
5.610 messaggi dal 09 febbraio 2002
Contributi
laurar181 ha scritto:

Per questo motivo in questo piccolo esempio ho la stessa classe dati sia nel servizio che nel winform ed è per questo che la lista di risultati del servizio deve andare a finire nella lista locale.


Ok, hai spiegato molto bene la situazione.
In questo caso potresti aggiungere un nuovo progetto di tipo "class library" alla tua soluzione server e inserire in esso solo le classi che vuoi condividere con il client (cioè il tuo Dati.Struttura ed eventuali altre). Compila il progetto, poi referenzia la dll dalla tua soluzione client. Trovi delle informazioni su questo approccio cercando "WCF shared assembly" in internet. Ad esempio, leggi questo articolo, spiega passo passo come realizzare la cosa:

http://blog.walteralmeida.com/2010/08/wcf-tips-and-tricks-share-types-between-server-and-client.html

L'articolo, inoltre, ti mostra come far utilizzare a Visual Studio i tipi già presenti nell'assembly anziché fargli generare delle nuove classi proxy.

ciao,
Modificato da BrightSoul il 01 dicembre 2011 21.00 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
438 messaggi dal 08 aprile 2009
Perfetto! Provato e funziona alla grande!!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC