1 messaggio dal 15 giugno 2011
Buongiorno a tutti. Sto cominciando a studiare i servizi WCF per riuscire a svolgere determinate operazioni.
Ho creato il mio servizio il quale funziona bene fino ad un certo punto.
Il servizio in realtà si collega ad un database MySql e mi restituisce attraverso una funzione una list di un dato complesso. Il codice che utilizzo è il seguente
Questa è l'iterface:
<ServiceContract()>
Public Interface IMyPimmService

    <OperationContract()>
    Function GetCommesse() As List(Of MyCommessa)

End Interface

<DataContract()>
Public Class MyCommessa

    <DataMember()>
    Public Property Commessa_Id As String

    <DataMember()>
    Public Property Descrizione As String

    <DataMember()>
    Public Property ListaSchede As List(Of MyScheda)

End Class

<DataContract()>
Public Class MyScheda

    <DataMember()>
    Public Property CodiceScheda As String

    <DataMember()>
    Public Property DescrizioneScheda As String

End Class


Questo il codice del Servizio
Public Class MyPimmService
    Implements IMyPimmService

    Private PimmContext As PimmEntities

    Public Sub New()
    End Sub

    Public Function GetCommesse() As List(Of MyCommessa) Implements IMyPimmService.GetCommesse
        PimmContext = New PimmEntities

        Dim Query = From c In PimmContext.commesses Where c.stato_commessa_id.StartsWith("A") Select c

        Dim listaCommesse As New List(Of MyCommessa)

        For Each q In Query.ToList
            Dim lisScheda As New List(Of MyScheda)

            For Each s In q.schedas.ToList
                lisScheda.Add(New MyScheda With {.CodiceScheda = s.codskcl, .DescrizioneScheda = s.descrizione})
            Next

            listaCommesse.Add(New MyCommessa With {.Commessa_Id = q.commessa_id, .Descrizione = q.descrizione, .ListaSchede = lisScheda})
        Next

        'Codice che funziona correttamente
        'Dim listasc As New List(Of MyScheda)
        'listasc.Add(New MyScheda With {.CodiceScheda = "SA-Test1", .DescrizioneScheda = "Scheda1 di Test"})
        'listasc.Add(New MyScheda With {.CodiceScheda = "SA-Test2", .DescrizioneScheda = "Scheda2 di Test"})
        'listasc.Add(New MyScheda With {.CodiceScheda = "SA-Test3", .DescrizioneScheda = "Scheda3 di Test"})

        'listaCommesse.Add(New MyCommessa With {.Commessa_Id = "CA-Test", .Descrizione = "Commessa di test", .ListaSchede = listasc})

        Return listaCommesse
    End Function

End Class


L'errore che mi viene restituito quando richiamo la funzione GetCommesse è che ho superato il limite massimo del maxreceivedmessagesize perciò ho provato a modificarlo nel file web.config ma l'errore rimane sempre. Fatto strano è che ho impostato il parametro uguale a 655360 ma nell'errore mi dice che ho superato i 65536.
Dato che sono all'inizio penso di sbagliare qualcosa nel file di configurazione.
Questo è il file di configurazione
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.6.2" />
    <httpRuntime targetFramework="4.6.2" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding closeTimeout="01:00:00" openTimeout="01:00:00" receiveTimeout="01:00:00"
          sendTimeout="01:00:00" maxReceivedMessageSize="655360" />
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
          <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="true" />
  </system.webServer>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="PimmEntities" connectionString="metadata=res://*/PimmModel.csdl|res://*/PimmModel.ssdl|res://*/PimmModel.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;user id=pimm;password=MyPassword;database=Mydb;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>



Da quello che ho capito facendo alcune ricerche è quello di impostare correttamente l'endpoint e collegarlo alla configurazione basicHttpBindig ma essendo alle prime armi non ho capito bene come funziona e cosa fare.
Potreste darmi un aiuto.
Dove posso trovare una guida per capire come configurare correttamente il file Web.config?
Vi ringrazio tutti per il vostro aiuto.
10.246 messaggi dal 09 febbraio 2002
Contributi
Ciao Francesco,
il codice VB.NET che hai postato è quello del servizio ma il problema va risolto lato client, ovvero nell'applicazione che sta invocando l'operazione GetCommesse del tuo servizio.

Che tipo di applicazione hai lato client? E' anch'essa un'applicazione web? O è un'applicazione per Windows, tipo Winforms, WPF o console? E' nel suo file .config che dovrai impostare il valore di maxReceivedMessageSize.

Ammesso che il client si anch'esso un'applicazione .NET.

Se non ti trovi bene con la configurazione XML sul file .config, sappi che puoi anche farla da codice VB.NET/C#. Ecco per esempio come impostare il MaxReceivedMessageSize usando codice C#

var endpointAddress = new EndpointAddress("http://indirizzo.del.servizio.wcf/percorso");
var binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = 100 * 1024 * 1024; //100MB

using (var client = new MiaClasseClient(binding, endpointAddress))
{
   var commesse = client.GetCommesse();
   //fai qualcosa con commesse
}



Dato che sono all'inizio penso di sbagliare qualcosa nel file di configurazione.

Non ti preoccupare, faccio fatica anch'io. Configurare WCF non è la cosa più semplice del mondo.

ciao,
Moreno

Enjoy learning and just keep making

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.