locked
Pubblicazione IIS RRS feed

  • Domanda

  • Buona giornata

    Ho 2 applicazioni silvelight, una utilizza i RiaServices l'altra i Web Services.
    La prima funziona sia nella root che in altre sottocartelle di IIS, la seconda solo nella root.
    Il problema, mi sembra, è dovuto all'assegnazione dell'URI del servizio.

    RiaServices uso:
    Dim myUri As New System.Uri(Application.Current.Host.Source.ToString & "/SA1-Web-Service1.svc", UriKind.RelativeOrAbsolute)
    Dim ds1 As New DomainService1(myUri)

    WebServices uso:
    Dim myAddress As New System.ServiceModel.EndpointAddress(New Uri(Application.Current.Host.Source, "/AthleteService.asmx"))
    Dim ds1 As 
    New AthleteManager.AthleteService.AthleteServiceSoapClient("AthleteServiceSoap", myAddress)

    Nel secondo cerca il servizio sempre nella root.

    Grazie

    mercoledì 27 gennaio 2010 12:13

Risposte

  • La domanda mi sembrava implicita, mi scuso per la poca chiarezza.
    Provo ad esplicutarla così :
    Come mai sono costretto a pubblicare la soluzione "WebService" nella root di IIS perchè funzioni, in quanto se la pubblico in una sottocartelle il servizio viene comunque cercato nella root ?
    La stessa cosa non succede con la "RiaService" in quanto la variabile myUri assume il valore "http://localhost/nomeservizio" se publlicata nella root, "http://localhost/sottocartella/nomeservizio" se pubblicato nella sottocartella.
    La variabile myAddress di "WebService" assume comunque il valore "http://localhost/nomeservizio", a meno che come ho appena provato non specifichi in maniera esplicita la sottocartella ( ....... New Uri(Application.Current.Host.Source, "/Sottocartella/AthleteService.asmx"))
    A qesto punto la seconda domanda: è sbagliato il mio approccio opure è una caratteristica (piccolo bug) del metodo Application.Current.Host.Source ?
    Sei sempre troppo paziente e disponibile.
    Grazie

    Ok, ora ho capito la domanda e di conseguenza ho guardato meglio il tuo sorgente:

    Tieni presente che Application.Current.Host.Source è una variabile che punta sempre all'Uri del file XAP sorgente dell'applicazione, ad esempio

    http://localhost:1237/ClientBin/SilverlightApplication5.xap

    Quindi non ha senso concatenare il suo valore con il nome del servizio. La cosa suppongo funzioni con i WCF Ria Services per via del fatto che la ricerca dell'handler non tiene conto del path, ma solo del nome del servizio perciò anche un path di questo tipo dovrebbe funzionare:

    http://localhost:1237/ClientBin/SilverlightApplication5.xap/riaservice.svc

    Il web service invece deve avere un path ben specifico e quindi devi esplicitare anche la cartella in cui si trova. Ammesso che il path del servizio sia ~/services/myservice.svc il modo migliore per referenziarlo è il seguente:

    var svc = new Uri(Application.Current.Host.Source, "/services/myservice.svc");

    Questo metodo desume il nome dell'host dalla proprietà DnsSafeHost e rende assoluto il path relativo che gli dai come secondo parametro. Questo pattern in realtà vale anche per il WCF Ria Service anche se in questo caso il path non è significativo.

    HTH
    Andrea Boschin
    Most Valuable Professional - Silverlight
    web: http://www.silverlightplayground.org
    blog: http://blog.boschin.it
    twitter: http://twitter.com/aboschin
    • Contrassegnato come risposta Duemilanove giovedì 28 gennaio 2010 09:01
    giovedì 28 gennaio 2010 08:22

Tutte le risposte

  • Buona giornata

    Ho 2 applicazioni silvelight, una utilizza i RiaServices l'altra i Web Services.
    La prima funziona sia nella root che in altre sottocartelle di IIS, la seconda solo nella root.
    Il problema, mi sembra, è dovuto all'assegnazione dell'URI del servizio.

    RiaServices uso:
    Dim myUri As New System.Uri(Application.Current.Host.Source.ToString & "/SA1-Web-Service1.svc", UriKind.RelativeOrAbsolute)
    Dim ds1 As New DomainService1(myUri)

    WebServices uso:
    Dim myAddress As New System.ServiceModel.EndpointAddress(New Uri(Application.Current.Host.Source, "/AthleteService.asmx"))
    Dim ds1 As 
    New AthleteManager.AthleteService.AthleteServiceSoapClient("AthleteServiceSoap", myAddress)

    Nel secondo cerca il servizio sempre nella root.

    Grazie


    Mi sfugge quale sia la domanda.

    Comunque nel secondo caso il webservice si deve trovare in una specifica posizione (dove si trova il file asmx). Se non sbaglio (vado a memoria) nel caso di Ria Services la comunicazione è gestita da un HttpModule (o HttpHandler) che risponde a qualsiasi path che termini con il nome specifico del servizio (SA1-Web-Service1.svc).

    HTH
    Andrea Boschin
    Most Valuable Professional - Silverlight
    web: http://www.silverlightplayground.org
    blog: http://blog.boschin.it
    twitter: http://twitter.com/aboschin
    mercoledì 27 gennaio 2010 14:45
  • La domanda mi sembrava implicita, mi scuso per la poca chiarezza.
    Provo ad esplicutarla così :
    Come mai sono costretto a pubblicare la soluzione "WebService" nella root di IIS perchè funzioni, in quanto se la pubblico in una sottocartelle il servizio viene comunque cercato nella root ?
    La stessa cosa non succede con la "RiaService" in quanto la variabile myUri assume il valore "http://localhost/nomeservizio" se publlicata nella root, "http://localhost/sottocartella/nomeservizio" se pubblicato nella sottocartella.
    La variabile myAddress di "WebService" assume comunque il valore "http://localhost/nomeservizio", a meno che come ho appena provato non specifichi in maniera esplicita la sottocartella ( ....... New Uri(Application.Current.Host.Source, "/Sottocartella/AthleteService.asmx"))
    A qesto punto la seconda domanda: è sbagliato il mio approccio opure è una caratteristica (piccolo bug) del metodo Application.Current.Host.Source ?
    Sei sempre troppo paziente e disponibile.
    Grazie
    giovedì 28 gennaio 2010 08:01
  • La domanda mi sembrava implicita, mi scuso per la poca chiarezza.
    Provo ad esplicutarla così :
    Come mai sono costretto a pubblicare la soluzione "WebService" nella root di IIS perchè funzioni, in quanto se la pubblico in una sottocartelle il servizio viene comunque cercato nella root ?
    La stessa cosa non succede con la "RiaService" in quanto la variabile myUri assume il valore "http://localhost/nomeservizio" se publlicata nella root, "http://localhost/sottocartella/nomeservizio" se pubblicato nella sottocartella.
    La variabile myAddress di "WebService" assume comunque il valore "http://localhost/nomeservizio", a meno che come ho appena provato non specifichi in maniera esplicita la sottocartella ( ....... New Uri(Application.Current.Host.Source, "/Sottocartella/AthleteService.asmx"))
    A qesto punto la seconda domanda: è sbagliato il mio approccio opure è una caratteristica (piccolo bug) del metodo Application.Current.Host.Source ?
    Sei sempre troppo paziente e disponibile.
    Grazie

    Ok, ora ho capito la domanda e di conseguenza ho guardato meglio il tuo sorgente:

    Tieni presente che Application.Current.Host.Source è una variabile che punta sempre all'Uri del file XAP sorgente dell'applicazione, ad esempio

    http://localhost:1237/ClientBin/SilverlightApplication5.xap

    Quindi non ha senso concatenare il suo valore con il nome del servizio. La cosa suppongo funzioni con i WCF Ria Services per via del fatto che la ricerca dell'handler non tiene conto del path, ma solo del nome del servizio perciò anche un path di questo tipo dovrebbe funzionare:

    http://localhost:1237/ClientBin/SilverlightApplication5.xap/riaservice.svc

    Il web service invece deve avere un path ben specifico e quindi devi esplicitare anche la cartella in cui si trova. Ammesso che il path del servizio sia ~/services/myservice.svc il modo migliore per referenziarlo è il seguente:

    var svc = new Uri(Application.Current.Host.Source, "/services/myservice.svc");

    Questo metodo desume il nome dell'host dalla proprietà DnsSafeHost e rende assoluto il path relativo che gli dai come secondo parametro. Questo pattern in realtà vale anche per il WCF Ria Service anche se in questo caso il path non è significativo.

    HTH
    Andrea Boschin
    Most Valuable Professional - Silverlight
    web: http://www.silverlightplayground.org
    blog: http://blog.boschin.it
    twitter: http://twitter.com/aboschin
    • Contrassegnato come risposta Duemilanove giovedì 28 gennaio 2010 09:01
    giovedì 28 gennaio 2010 08:22