Pubblicazione WebService WCF

giovedì 30 gennaio 2014 - 14.58
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows Server 2008 R2  |  Visual Studio 2010  |  SQL Server 2008 R2

iif Profilo | Expert

Ciao,
ho pubblicato un WCF e quando lo avvio mi ritorna questo errore:

Impossibile caricare il file o l'assembly 'Wcf_xxx' o una delle relative dipendenze. L'assembly non può essere caricato perché è stato creato da un runtime più recente di quello attualmente caricato.

Da cosa può dipendere?

Grazie.

0v3rCl0ck Profilo | Guru

ciao, se lo hai pubblicato su un iis, probabilmente la pool su cui gira è settato per girare con la versione 2.0 di .net, invece che 4.0, prova a controllare... stessa cosa se l'hai pubblicato su un host come aruba, devi controllare che il sito sia configurato per girare con la versione del framework a cui ai compilato il progetto.. se non hai la possibilità di cambiare la versione del framework, l'unica cosa che ti rimane da fare è di compilare il progetto con una versione precedente, ogni visual studio ti permette di compilare indietro fino al 2.0, ma lo sconsiglio fortemente, specialmente per applicazioni server-side.


ciao,
Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Ok, fatto, ho settato iis su FW4.
Cosa devo fare per renderlo pubblico?
Grazie.

0v3rCl0ck Profilo | Guru

Ce l'hai installato in locale sulla tua macchina?


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Sul mio pc gira regolarmente.
L'ho installato su IIS

0v3rCl0ck Profilo | Guru

ok ora se lo vuoi esporre verso l'esterno dal tuo pc locale, ci sono diversi passi che devi fare:

1 - aprire la porta 80 sul firewall di windows
2 - aprire la porta 80 sul router verso il tuo pc interno
3 - avere un ip pubblico raggiungibile dall'esterno, ogni provider te ne assegna uno (a parte forse la fibra di fastweb, in quanto gira su rete privata)

se il tuo ip è dinamico, dovrai conoscere il tuo ip (www.whatismyip.com) tutte le volte che cambia, per potere accedere da internet al sito, altrimenti puoi utilizzare uno dei tanti servizi di dynamic dns come noip.com e dyn.com, che ti permettono di avere un domain name di terzo livello tipo "mysupersite.noip.com" e con un programmino installabile su pc o ancora meglio direttamente dal router (ormai tutti hanno la funzione integrata di dynamic dns), al cambiare del tuo ip pubblico viene aggiornato il record dns.

per accedere solo con ip, il tuo sito deve essere configurato come default su iis, senza impostare un nome di dominio.

altrimenti che ne dici di pubblicarlo direttamente su windows azure a gratis?

http://www.windowsazure.com/en-us/documentation/articles/web-sites-dotnet-get-started/

http://www.asp.net/mvc/tutorials/deployment/cse-curated-view-deploy-to-waws


ciao,
Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Il problema è che non riesco a vederlo neanche dal client all'interno della rete

0v3rCl0ck Profilo | Guru

Hai controllato il firewall di Windows? Hai altri anti virus o firewall installati?


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Se metto una pagina.html nel sito la vedo

0v3rCl0ck Profilo | Guru

E in locale funziona?

Che wcf binding hai utilizzato? È hostato su un sito asp.net su pagine .svc?


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Si, in locale funziona, è un wcf con estensione svc

Questo l'errore:
Errore HTTP 500.21 - Internal Server Error

Nell'elenco moduli del gestore "svc-Integrated" è presente un modulo "ManagedPipelineHandler" non valido

0v3rCl0ck Profilo | Guru

sembra che non siano installati correttamente i prerequisiti asp.net 4:

http://blogs.msdn.com/b/keithmg/archive/2010/11/08/wcf-error-500-21-handler-quot-svc-integrated-quot-has-a-bad-module-quot-managedpipelinehandler-quot-in-its-module-list-quot.aspx?Redirected=true

provate questi step:

Apri il Visual Studio Command Prompt

esegui il comando:

aspnet_regiis.exe -i

prova di nuovo il servizio


se questo non aiuta, che tipo servizio hai implementato, per caso un servizio REST?


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Da cosa si capisce?

0v3rCl0ck Profilo | Guru

>Da cosa si capisce?

cosa? se è un servizio rest?

comunque hai provato ad eseguire quel comando?


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

fatto, ora torna questo errore
La pagina richiesta non può essere servita a causa delle impostazioni dell'elenco di restrizioni ISAPI e CGI nel server Web.

0v3rCl0ck Profilo | Guru

ok sono riuscito ad avere lo stesso problema, da quando ho disinstallato visual studio 2012 a favore del 2013, ricevendo lo stesso errore.

Ho risolto aggiungendo ".NET Extensibility 4.5" e "ASP.NET 4.5" dal pannello "Turn Windows Features on or off":


939x717 54Kb


prova anche tu e fammi sapere


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Ho Windows Server 2008


1364x768 43Kb

iif Profilo | Expert

Allora,
la macchina non era configurata come server application.
Ho abilitato tale funzione con tanto di supporto web, che tra l'altro prevede il WCF.
Ho ricompilato il wcf e l'ho installato sul web.
All'avvio è comparso questo messaggio

Impossibile trovare 'IMetadataExchange' nell'elenco dei contratti implementati dal servizio Servizio. Aggiungere un ServiceMetadataBehavior al file di configurazione o direttamente a ServiceHost per abilitare il supporto per il contratto.

0v3rCl0ck Profilo | Guru

>Allora,
>la macchina non era configurata come server application.
>Ho abilitato tale funzione con tanto di supporto web, che tra
>l'altro prevede il WCF.
>Ho ricompilato il wcf e l'ho installato sul web.
>All'avvio è comparso questo messaggio

in che target framework è compilata la tua applicatione? fx 4.5? Se si, controlla che sul server sia installato il .net framework 4.5, se non era installato, installalo e poi prova ancora con il comando "aspnet_regiis.exe -i", l'installazione del framework su iis come ti ho spiegato prima funziona solo da ii8, tu devi farlo con il comando aspnet_regiis

>
>Impossibile trovare 'IMetadataExchange' nell'elenco dei contratti
>implementati dal servizio Servizio. Aggiungere un ServiceMetadataBehavior
>al file di configurazione o direttamente a ServiceHost per abilitare
>il supporto per il contratto.

controlla di avere inserito correttamente questo binding:

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

stai attento perchè è case sensitive, il contratto deve essere scritto esattamente "IMetadataExchange".


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Ti posto il web.config

<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="ConnessioneSMS" connectionString="Data Source=localhost;Initial Catalog=ABC;Persist Security Info=True;User ID=xxxxx;Password=xxxxxx" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<compilation debug="true"/>
</system.web>
<!-- Quando si distribuisce il progetto della libreria di servizi, è necessario aggiungere il contenuto del file di configurazione al file
app.config dell'host. System.Configuration non supporta i file di configurazione delle librerie. -->
<system.serviceModel>
<services>
<service name="Wcf_SMS.Servizio">
<endpoint address="" binding="wsHttpBinding" contract="Wcf_SMS.IServizio">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/Wcf_SMS/Service1/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

0v3rCl0ck Profilo | Guru

specifica un nome al behavior:

<behavior name="DefaultBehavior"> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False"/> </behavior>

e imposta il behavior al service:

<service name="Wcf_SMS.Servizio" behaviorConfiguration="DefaultBehavior">

ecco il tuo config completo modificato:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

la prossima volta però rispondi a tutte le domande che ti faccio per favore, serve per velocizzare l'aiuto che ti posso dare, capisco che hai un problema impellente, ma è anche vero che io non sono un servizio di supporto a pagamento

dimmi se così funziona, altrimenti se ancora non va, rispondimi alle domande della risposta precedente (target framework, ecc...)



Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Ti ringrazio, stavo per scriverti, ti posto il web.config funzionante, sono diventato scemo, non che non lo sia comunque.
Ora riesco ad individuarlo, ma quando chiamo il metodo ( il servizio è configurato con l'ip ) mi risponde con il nome macchina.

<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="ConnessioneSMS" connectionString="Data Source=localhost;Initial Catalog=SMS;Persist Security Info=True;User ID=sa;Password=@sa" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<compilation debug="true"/>
</system.web>
<!-- Quando si distribuisce il progetto della libreria di servizi, è necessario aggiungere il contenuto del file di configurazione al file
app.config dell'host. System.Configuration non supporta i file di configurazione delle librerie. -->
<system.serviceModel>
<services>
<service name="Wcf_SMS.Servizio" behaviorConfiguration="metadataSupport">

<endpoint address=""
binding="wsHttpBinding"
contract="Wcf_SMS.IServizio">
<identity>
<dns value="localhost" />
</identity>
</endpoint>

<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />

<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/Wcf_SMS/Service1/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<!-- Per evitare di diffondere informazioni sui metadati,
impostare il valore riportato sotto su false e rimuovere l'endpoint dei metadati riportato sopra prima della distribuzione -->
<serviceMetadata httpGetEnabled="True"/>
<!-- Per ricevere i dettagli sull'eccezione per scopi di debug in caso di guasti,
impostare il valore riportato sotto su true. Impostarlo su false prima della distribuzione
per evitare di diffondere informazioni sull'eccezione -->
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

0v3rCl0ck Profilo | Guru

quando alleghi codice per favore racchiudilo in un tag di code... [ code ] qui il codice [ /code ] (senza spazi), così rimane formattato, grazie

>Ti ringrazio, stavo per scriverti, ti posto il web.config funzionante,
>sono diventato scemo, non che non lo sia comunque.
>Ora riesco ad individuarlo, ma quando chiamo il metodo ( il servizio
>è configurato con l'ip ) mi risponde con il nome macchina.

cosa vuol dire che risponde con il nome macchina? postami un esempio



Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

iif Profilo | Expert

Ok, ti posto il codice di errore:
Nessun endpoint in ascolto su http://srvprod-4:81/Wcf_SMS.Servizio.svc in grado di accettare il messaggio.

Va modificato l'ip dentro IIS e tutto funziona.
Lanciato e testato, tutto ok.
Grazie ancora per la pazienza.

Ciao.

0v3rCl0ck Profilo | Guru

ok bene alla prossima


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5