wake-up-neo.com

Wie wird der WCF-Webdienst über die URL zur Laufzeit verwendet?

Ich möchte über die URL auf alle im Dienst bereitgestellten Methoden zugreifen. Angenommen, die URL lautet:

http://localhost/MyService/MyService.svc

Wie kann ich auf Methoden zugreifen:

  1. angenommen, ich habe eine ServiceReference
  2. und was soll ich tun, wenn ich keine Servicereferenz habe?.
15
Ashish Ashu

Um einen WCF-Dienst verwenden zu können, müssen Sie einen WCF-Client-Proxy erstellen.

In Visual Studio klicken Sie mit der rechten Maustaste auf das Projekt und wählen im Kontextmenü die Option "Dienstverweis hinzufügen" aus. Geben Sie die URL ein, zu der Sie eine Verbindung herstellen möchten. Wenn dieser Dienst ausgeführt wird, sollten Sie eine Client-Proxy-Datei für Sie generieren lassen.

Diese Datei enthält normalerweise eine Klasse namens MyService Client - Sie können diese Klasse instanziieren, und Sie sollten alle verfügbaren Methoden dieser Client-Klasse sehen.

Wenn Sie in Visual Studio keine Servicereferenz hinzufügen möchten, können Sie dasselbe Ergebnis erzielen, indem Sie das Befehlszeilenprogramm svcutil.exe ausführen. Dadurch werden auch alle erforderlichen Dateien für Ihre Client-Proxy-Klasse generiert.

Marc

UPDATE:
Wenn Sie einen Client-Proxy zur Laufzeit initialisieren möchten, können Sie dies auf jeden Fall tun. Sie müssen entscheiden, welche Bindung (Transportprotokoll) und welche Adresse verwendet werden soll, und dann können Sie Folgendes tun:

BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://localhost:8888/MyService");

MyServiceClient serviceClient = new MyServiceClient(binding, address);

Aber selbst in diesem Fall müssen Sie zuerst den Proxy-Client mithilfe der Tools "Dienstreferenz hinzufügen" oder "svcutil.exe" importiert und erstellt haben.

20
marc_s

Um zu antworten, wie es geht, ohne eine Servicereferenz zu haben. Schauen Sie hier (Option #a):

Schreibe deinen ersten WCF-Client

Sie benötigen noch eine Referenz (nämlich eine Referenz auf eine Assembly, die den Vertrag/die Schnittstelle enthält), aber Sie geben keine Servicereferenz an.

EDIT: Obwohl dies möglich ist, würde ich es nicht empfehlen. Die Leistung ist nicht gerade großartig, wenn Sie die Proxys so generieren müssen. Normalerweise verwende ich svcutil.exe und erstelle eine Assembly mit meinen Kunden und einen Verweis auf diese Assembly. Auf diese Weise haben Sie mehr Möglichkeiten, um zu steuern, wie die Proxys aussehen.

8
Stefan Egli

Sie können auch die Klasse WebClient verwenden, um den WCF-Dienst aufzurufen, ohne einen Service-Proxy zu benötigen. Sie können effektiv Strings- und Binärdaten senden und empfangen sowie POSTs simulieren.

Ich verwende es ausgiebig für wiederverwendbare Komponenten, bei denen der Entwickler möglicherweise niemals die erforderlichen Proxy-Methoden erstellt. Ein guter Vergleich der Möglichkeiten, POST auszuführen, ist verfügbar hier .

2
BinaryMisfit

Sie rufen es mit einem/functionname auf, zB:

http: //localhost/MyService/MyService.svc/GetVersionNumber

 enter image description here

Bearbeiten:

Wie konfigurieren Sie Ihre Methode im WCF-Dienst, damit Sie sie direkt vom Browser aus aufrufen können?

Ich habe eine Schnittstelle:

[ServiceContract]
public interface IWebServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "GetVersionNumber")]
    string GetVersionNumber();

Und eine Klasse, um die GetVersionNumber-Methode im Interface zu implementieren:

public class WebServiceImpl
{
    public string GetVersionNumber()
    {
            return "1.0.0.0"; //In real life this isn't hard-coded
    }
}

Schließlich ist hier die Konfiguration von Web.config:

<system.serviceModel>        
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="false" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" maxMessagesToLog="3000" maxSizeOfMessageToLog="2000"/>
    </diagnostics>        
    <bindings>
      <webHttpBinding>
        <binding name="webBinding">
          <security mode="Transport"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="ServiceBehaviour" name="YOURWebServiceNameSpace.WebServiceImpl">            
        <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" contract="YOURWebServiceNameSpace.IWebServiceImpl"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
1
Jeremy Thompson

Sie können nur die Wsdl Ihres Dienstes bereitstellen: http: //localhost/MyService/MyService.svc? Wsdl .

Mit wsdl können Sie Proxy-Klassen generieren und auf dem Client verwenden.

0
sandyiit