2016-10-24 2 views
0

Also schreibe ich gerade einen neuen WCF-Dienst, der ein Struct zurückgeben soll, wenn eine seiner Funktionen aufgerufen wird. Die Struktur wird in einer gemeinsamen Klasse gehalten, da sie in anderen Bereichen des Programms verwendet wird.WCF-Dienst kann Struktur von einer anderen Klasse nicht zurückgeben?

Die Struktur sieht wie folgt aus (Beachten Sie, es sich in einer VB.Net Klasse ist, ist ein Teil des Projekts in C#):

<DataContract()> 
Public Structure WrapperResults 
    <DataMember()> 
    Dim Success As Boolean 
    <DataMember()> 
    Dim ErrorMessage As String 
End Structure 

nun in der WCF-Dienst Ich eingerichtet haben ich ein einfaches haben Testfunktion, die wie folgt aussieht:

public class TFXEmailProcessor : Wrapper 
    { 
     public MQShared.Functions.WrapperResults CallWrapper(string AppName, string Password, string ConfigXML) 
     { 
      MQShared.Functions.WrapperResults results = new MQShared.Functions.WrapperResults(); 

      results.ErrorMessage = "TFX Test"; 
      results.Success = true; 

      return results; 
     } 
    } 

und in einer anderen Klasse habe ich hinzugefügt einen Verweis auf meine WCF-Dienst und versuchen, nennen es mag:

Dim myBinding As New BasicHttpBinding() 
Dim endpointAddress As New EndpointAddress(WP.MyWrapper(x).WrapperURL) 
Dim SR As New WrapperService.WrapperClient(myBinding, endpointAddress) 

Dim WrapResults As MQShared.Functions.WrapperResults = SR.CallWrapper(AppName, Password, WP.MyWrapper(x).ConfigXML) 

jedoch die SR.CallWrapper Funktion wird durch Intellisense hervorgehoben und ich erhalte die Fehler Value of type 'FunctionsWrapperResults' cannot be converted to 'Functions.WrapperResults' (die fehlende Zeit in FunctionsWrapperResults Hinweis)

Gibt es etwas, was ich bin hier fehlt?

+0

Try StructLayout über den Datacontract zu implementieren. –

+0

@Nagu_R Mit StructLayout.Auto versucht, aber das Problem nicht behoben. –

+0

Ich glaube, Sie hätten 2 Wrapper-Ergebnisklassen erstellt und eine davon gelöscht/umbenannt. Wenn die referenzierten Assemblies dieselbe Assembly-Identität haben, entfernen oder ersetzen Sie einen der Dateireferenzen, sodass nur ein einziger Dateiverweis vorhanden ist. –

Antwort

0

dieses Problem behoben, nur durch den Compiler Arbeit aus dem Rückgabewert zu lassen, anstatt speziell es als

Dim WrapResults As MQShared.Functions.WrapperResults 

erklärt erkläre ich jetzt einfach den Funktionsaufruf als:

Dim WrapResults = SR.CallWrapper(AppName, Password, WP.MyWrapper(x).ConfigXML) 
0

Es gibt zwei Möglichkeiten sind den WCF-Dienst aufrufen Proxy und Kanal.

In Proxy können Sie WCF-Dienst zu Ihrem Projekt hinzufügen mit Service-Referenz hinzufügen ... Auf diese Weise werden Proxy-Klassen automatisch generiert. Sie können Ihre freigegebenen Klassen nicht verwenden. Weil gemeinsam genutzte Klassen erneut als Proxy generiert werden.

Wenn Sie freigegebene Klassen verwenden können, müssen Sie Kanalweg wählen. Fügen Sie im Channel ServiceContact (Schnittstelle) und DataContract zum Client-Projekt hinzu.

Ich verwende C#

var address = new EndpointAddress("..."); // Service address 
    var binding = new BasicHttpBinding(); // Binding type 

    var channel = ChannelFactory<IService>.CreateChannel(binding, address); 

    MQShared.Functions.WrapperResults WrapResults = channel.CallWrapper(string AppName, string Password, string ConfigXML); 
Verwandte Themen