51 messaggi dal 16 gennaio 2009
Grazie come sempre Moreno,

il procedimento ho seguito era corretto ma ho fatto un po' di confusione con la sintassi di svcutil e con la classe generata, adesso penso di aver capito.
Ho provato e funziona con un metodo di prova che mi ritorna una stringa.
Però ho problemi sui metodi che devono ritornare un dato composito, cerco di spiegarmi:

Ho creato un metodo nel servizio chiamato GetToolTable che accetta un int e mi ritorna un dato composito. Il contratto è fatto nel modo seguente:
[OperationContract]
ToolTableData GetToolTable(int idNc);

[DataContract]
public class ToolTableData
{
    [DataMember]
    public int IdNc { get; set; }
    [DataMember]
    public int CommandResult { get; set; }
    [DataMember]
    public string CommandError { get; set; }
    [DataMember]
    public DataTable ToolTable { get; set; }
}

mi serve un dato composito perchè devo intercettare eventuali errori a valle del servizio.

Quando cerco di consumarlo mi esce la pagina unhandled exception seguente:
An unhandled exception occurred while processing the request.
SocketException: Connessione in corso interrotta forzatamente dall'host remoto

Unknown location
IOException: Unable to read data from the transport connection: Connessione in corso interrotta forzatamente dall'host remoto.

System.Net.Sockets.Socket+AwaitableSocketAsyncEventArgs.ThrowException(SocketError error)
HttpRequestException: An error occurred while sending the request.

System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
CommunicationException: An error occurred while sending the request.

System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(HttpRequestException requestException, HttpRequestMessage request, HttpAbortReason abortReason)

però in debug nel metodo vedo che la richiesta viene eseguita e mi ritorna i valori corretti.
Nor riesco dalla pagina di exception a capire dove sta il problema.
51 messaggi dal 16 gennaio 2009
Mi autorispondo, forse ho capito.
Quando in un servizio si deve restituire un datatable, come nel mio caso, occorre dargli un nome, altrimenti non può essere serializzato.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, quindi sei riuscito a risolvere il problema?

Enjoy learning and just keep making
51 messaggi dal 16 gennaio 2009
Si Moreno, ti ringrazio per il tuo massiccio supporto.
Avrei ancora alcune domande legate al funzionamento dei servizi WCF forniti come libreria, magari aprirò un'altra discussione. Per adesso vado avanti con il progetto.
Grazie ancora.
51 messaggi dal 16 gennaio 2009
I problemi non sono finiti...
Come già postato, faccio una richiesta che mi deve ritornare un dato composito che vado qui a mostrare di nuovo.
[OperationContract]
ToolTableData GetToolTable(int idNc);

[DataContract]
public class ToolTableData
{
    [DataMember]
    public int IdNc { get; set; }
    [DataMember]
    public int CommandResult { get; set; }
    [DataMember]
    public string CommandError { get; set; }
    [DataMember]
    public DataTable ToolTable { get; set; }
}

Il primo problema è stato che il pacchetto di ritorno era superiore a 65 K quindi ho aumentato il MaxReceivedMessageSize e non mi ha dato più l'errore.
Però non mi ritorna il datatable!
In debug ho visto che lato WCF server il datatable e gli altri membri della risposta vengono valorizzati regolarmente.
Lato client vedo i membri IDNc, CommandResult e CommandError valorizzati correttamente, mentre il membro ToolTable me lo trovo tristemente a null.
Questo è il metodino lato client che richiede il servizio
        public static int ReadToolTable(int idMach, ref DataTable toolTable, ref Exception exc)
        {
            IMachinesService wcfMachines = machChannelFactory.CreateChannel();
            try
            {
                GetToolTableRequest treq = new GetToolTableRequest(idMach);
                GetToolTableResponse tres = wcfMachines.GetToolTable(treq);
                toolTable = tres.GetToolTableResult.ToolTable;
                return 0;
            }
            catch (Exception ex)
            {
                exc = ex;
                return -1;
            }
            finally
            {
                ((IClientChannel)wcfMachines).Close();
            }
        }

Come si vede ho usato ChannelFactory, ma non credo che sia lì il problema.
51 messaggi dal 16 gennaio 2009
Come non detto...
Il problema era dovuto alla solita classe proxy creata con svcutil che non avevo aggiornato, quindi mi è rimasta con il nome del datatable non aggiornato a causa di una lettera del nome maiuscola.
Chiedo scusa per il post inutile

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.