2010-02-11 10 views
6

Sto creando una DLL con un riferimento a servizi web (non ho la possibilità di farlo) ma devo aggiungere riferimenti di servizi Web per il progetto che utilizza la DLL per farlo funzionare.Come aggiungere un riferimento al servizio Web in una DLL

Esempio, ho la DLL chiamata API.DLL che chiama un servizio Web chiamato WebService.svc che voglio usare in un progetto chiamato WinForm. Innanzitutto, devo aggiungere un "riferimento di servizio" a WebService.svc in API.DLL. Quindi, aggiungo un riferimento API.DLL a WinForm ma non funziona a meno che non aggiungo anche un riferimento al servizio WebService.svc in WinForm.

Cosa posso fare per evitare l'ultimo passaggio?

+1

Non dovrebbe essere necessario aggiungere il riferimento al servizio alla WinForm ... che cosa è l'errore che state vedendo? –

+0

System.InvalidOperationException My .NET è in francese (... sigh ...) ma dice qualcosa come "Impossibile trovare il riferimento del servizio". – dsimard

risposta

6

Il tuo primo passo è dimostrare a te stesso che ciò è possibile e quindi adattare il tuo progetto.

è possibile scaricare la soluzione eseguibile here.

Ho appena seguito i passaggi e ho elencato le mie azioni per produrre i risultati desiderati.

 
    Create a web app project (an thus a solution) named 'ReferencedWebService' 
    Add a web service, just leave the default name and implementation 
    Add a class library named 'ReferencedWebserviceAPI' 
     Add Service Reference 
      >Advanced 
       >Add Web Reference>Web services in this solution 
        >WebService1 
         >Add reference leaving name as 'localhost' 
    Add a console application project named 'ReferencedWebserviceClient'  
    To ReferencedWebserviceClient: 
     Add Reference 
      >Projects 
       >ReferencedWebserviceAPI 
     Add Reference 
      >.Net 
       >System.Web.Services 

    In Program.cs replace Main: 

    static void Main(string[] args) 
    { 
     var svc = new ReferencedWebserviceAPI.localhost.WebService1(); 
     var result = svc.HelloWorld(); 
     Console.WriteLine(result); 
     Console.ReadLine(); 
    } 


    Set ReferencedWebserviceClient as startup project and run. 

    Ok, this is simplest scenario. One issue you will have to deal with is that the default Service URL is hardcoded in the .dll, 
    and it is set to a ported address on your dev machine. 

    You will want to add a configuration parameter to your client project. The simplest and most portable way is to use an appSetting. 

    To ReferencedWebserviceClient: 
     Add Item 
      >Application Configuration File 

    Replace contents of App.Config with this, of course replace the value with the appropriate value on your machine. 

    
    
     
     
     
    


     Add Reference 
      >.Net 
       >System.Configuration 

    Now replace Main with this: 

    static void Main(string[] args) 
    { 
     var svc = new ReferencedWebserviceAPI.localhost.WebService1 
         { 
          Url = ConfigurationManager.AppSettings["serviceUrl"] 
         }; 
     var result = svc.HelloWorld(); 
     Console.WriteLine(result); 
     Console.ReadLine(); 
    } 

Questa è la linea di base per l'incorporamento di servizi in un file dll ridistribuibile.

Prova ad applicare questo modello al tuo progetto attuale e vedere come funziona per te.

Se hai ancora problemi, hai sicuramente un problema di riferimento e dovresti iniziare a guardarlo da quella prospettiva.

Spero che questo aiuti

1

è che perché è necessario il riferimento al servizio in modo che l'applicazione WinForm può fare riferimento ai tipi restituiti dal vostro servizio?

In questo caso, è possibile trasformare la DLL API in un wrapper per il servizio e racchiudere tutti i metodi disponibili nel servizio in API e fare lo stesso per gli oggetti (presupponendo che si tratti di clases che si hanno creato). Ovviamente, dovrai convertire tutti gli oggetti che il servizio restituisce negli oggetti nell'API. Ma una volta fatto, non è necessario fare riferimento al servizio in WinForm. (Stranamente, sono nel mezzo di fare qualcosa di simile anch'io!).

+0

In effetti, my API.dll non restituisce alcun tipo dal servizio web direttamente per evitare tale errore. È come se la DLL utilizzasse riferimenti di servizio dal progetto host e non da se stessa. – dsimard

+0

Bene, allora sono confuso! Cosa succede se si crea un nuovo progetto e si fa riferimento al file API.dll? Hai lo stesso errore? –

+0

Sì, ho questo errore se non aggiungo i riferimenti al servizio web. Penso che sia perché tutte le classi generate automaticamente non seguono la DLL. – dsimard

5

Si può utilizzare tipi esposti dal servizio web, o può essere che si stanno avendo per aggiungere il riferimento web in modo che si aggiunge le informazioni di connessione appropriata per il file di configurazione. Un'applicazione winform non erediterà o userà il file di configurazione di una DLL in alcun modo, a meno che non si debba creare un meccanismo di caricamento di fantasia per questo. In altre parole, nella DLL quando si aggiunge un riferimento Web, il file di configurazione ottiene informazioni su come connettersi al servizio Web, ma quando si utilizza la DLL in un'applicazione, l'applicazione richiede tali informazioni nel proprio file di configurazione, quindi è necessario aggiungere un riferimento Web in modo che le informazioni vengano generate.

Per quanto riguarda utilizzando un tipo esposto con il riferimento web, non sono sicuro se questo potrebbe essere un problema si è verificato. Ho incontrato questo tipo di cose nelle DLL. Ad esempio, SharpMap.dll dichiara una classe SharpMapData, e WrapperOfSharpMap.dll ha un metodo chiamato ProcessData(SharpMapData blah)

Se scrivo un'applicazione WinForm e aggiungere un riferimento a WrapperOfSharpMap.dll, devo anche aggiungere un riferimento a SharpMap.dll perché per chiamare ProcessData devo creare un'istanza SharpMapData da passare alla funzione. In altre parole, sto usando un tipo dichiarato in SharpMap.dll, quindi ho bisogno di un riferimento ad esso.

Per risolvere questo problema, il creatore di WrapperOfSharpMap.dll deve creare una classe WrapperSharpMapData in questo modo:

class WrapperSharpMapData 
{ 
    private SharpMapData hiddenSharpMapData; 

    //create proprerties to access data elements using standard CLR types or other wrapper types 
} 
+0

Penso che il problema sia proprio perché devo fare riferimento al servizio web nel WinForm ma non voglio quel passo. Desidero che lo sviluppatore faccia riferimento a .DLL e che il servizio Web venga automaticamente referenziato. Come lo posso fare? – dsimard

+0

@ Dan, no non lo fai. Qualcos'altro è sbagliato. –

+0

@dan In che modo WinForm ottiene le informazioni di configurazione per la connessione al servizio Web senza aggiungere un riferimento al servizio Web? Guarda cosa succede al tuo file di configurazione quando aggiungi un riferimento web. Le impostazioni di configurazione dalle DLL non influiscono in alcun modo sugli EXE. – AaronLS

1

Si potrebbe provare a guardare in svcutil.exe, che permette di generare il codice proxy lato client per il vostro servizio tramite la riga di comando. Dovresti essere in grado di prendere il file di codice che produce e semplicemente aggiungerlo al progetto DLL. Ciò ti consente di bypassare completamente Visual Studio.

Problemi correlati