2016-08-08 47 views
0

Die Screenshots werden wirklich eine Menge Dinge klären. Im Grunde habe ich diesen Service und benutze den WCF Test Client Ich kann einen String zurückbekommen. Die clientseitige Referenz, die ich mit Visual Studio erstellt habe, besagt jedoch, dass meine Methode als void zurückgibt.WCF .svc Datei hat Rückgabetypen, Clientcode sieht alle void

Das ServerConnection-Objekt in meiner Test() - Methode referenziert meine Service-Referenzvariable, die von Visual Studio erstellt wird.

Root.svc.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace chatService_SignalRService.Services 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Root" in code, svc and config file together. 
    // NOTE: In order to launch WCF Test Client for testing this service, please select Root.svc or Root.svc.cs at the Solution Explorer and start debugging. 
    public class Root : IRoot 
    { 
     public String DoWork() 
     { 
      return "Hello Bailey!"; 
     } 
    } 
} 

IRoot.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace chatService_SignalRService.Services 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IRoot" in both code and config file together. 
    [ServiceContract] 
    public interface IRoot 
    { 
     [OperationContract] 
     String DoWork(); 
    } 
} 

ich eine Portable Klassenbibliothek verwenden. Ich wähle diese Klassenbibliothek aus, füge Dienstreferenz hinzu, zeige die Adresse auf meinen Webserver und nenne sie ServerCT.

Dann in meinem Profile.cs, die unter der Portable Class Library ist, erstelle ich ein Objekt und eine Methode.

using Microsoft.AspNet.SignalR.Client; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Classes 
{ 
    public class Profile : User 
    { 

     public static ServerCT.RootClient ServerConnection = new ServerCT.RootClient(); 


     public void Test() 
     { 
      ServerConnection.DoWorkAsync(); 
     } 
    } 
} 

Screenshots: enter image description here

enter image description here

+0

Geben Sie Ihren vollständigen Code hier ein, anstatt Screenshots zu posten. Niemand möchte Ihren Code aus Ihrem Screenshot erneut eingeben, um Ihnen eine Antwort zu geben. –

+0

Ich werde den Code veröffentlichen, es gibt vielleicht 5 Zeilen Code über ein paar verschiedene Dateien. –

Antwort

1

generiert Async Methoden sind immer leer, da sie kein Ergebnis asynchron und zurück sind. Stattdessen sollten Sie Completed Ereignis verwenden, für die Handhabung des Ergebnis:

ServerConnection.DoWorkCompleted += (sender, args) => 
{ 
    Console.WriteLine($"DoWork result: {args.Result}"); 
}; 
ServerConnection.DoWorkAsync(); // void, the result is provided through event handler 

Wenn Sie einen synchronen Aufruf machen wollen und das Ergebnis synchron erwerben, dann sollten Sie die synchrone Methode DoWork wie folgt aufrufen:

ServerConnection.DoWork(); // returns string 

Beachten Sie, dass für einige Arten von Projekten und Konfigurationen keine synchronen Operationen generiert werden. Zum Beispiel für Silverlight-Anwendungen.

+0

Visual Studio bietet mir nicht die Option, DoWork(), nur DoWorkAsync() aufzurufen. –

+0

Wahrscheinlich hängt es irgendwie mit der Implementierung oder Konfiguration zusammen. Können Sie Ihre Service-Implementierung zeigen? –

+0

Ich habe eine portable Klassenbibliothek, diese Klassenbibliothek verfügt über eine Servicereferenz. Ich erstelle ein Objekt dieser Service-Referenz und mache den DoWorkAsync() -Aufruf. Auf der Clientseite ist keine DoWork() -Methode angegeben. –