3 Stimmen

WCF ohne app.config verbrauchen

Ich brauche, um einen WCF-Dienst von einer DLL zu konsumieren, daher habe ich keine Konfigurationsdatei zum Lesen von Bindungen Konfigurationen aus.

Ich habe wirklich Schwierigkeiten, es zum Laufen zu bringen. Am Ende, als eine sehr einfache Lösung, füge ich einen Verweis auf die WCF und instanziieren es wie folgt:

        WSHttpBinding binding = new WSHttpBinding();
        EndpointAddress address = new EndpointAddress("http://myhost.net/Service.svc");

        ServiceReference.ServiceClient client = new ServiceReference.ServiceClient(binding, address);
        var result = client.Method1();

Auf localhost funktioniert dies einfach. Wenn ich es von einem anderen Rechner aus versuche, bekomme ich diesen Fehler:

The request for security token could not be satisfied because authentication failed.

Im Host ist IIS auf "Anonymous" eingestellt, also sollte es wohl einfach funktionieren.

Gibt es Hilfe?

EDIT: Dienstkonfigurationsdatei

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="Mai.MyPlanner.Service">
        <endpoint address="" binding="wsHttpBinding" contract="Mai.MyPlanner.IService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://MY_SERVICE"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>

          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

<connectionStrings>
  <!-- PROD -->

  <!-- TEST -->
</connectionStrings>

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

4voto

Ladislav Mrnka Punkte 355028

Verwenden Sie diesen Code:

WSHttpBinding binding = new WSHttpBinding();
EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("localhost");
EndpointAddress address = new EndpointAddress("http://myhost.net/Service.svc", identity);

ServiceReference.ServiceClient client = new ServiceReference.ServiceClient(binding, address);
var result = client.Method1();

Sie müssen dennoch den Dns-Identitätswert und die Adresse in Ihre Methode übernehmen, die diesen Code aufruft. Außerdem funktioniert diese Art der Konfiguration nur im Intranet (dieselbe Windows-Domäne), da sie standardmäßig Nachrichtensicherheit und Windows-Authentifizierung verwendet.

2voto

Shiraz Bhaiji Punkte 62129

Verwenden Sie stattdessen die einfache http-Bindung, wenn Sie keine Sicherheit benötigen.

0voto

John Punkte 51

Was wäre, wenn Sie einen ServiceHost hätten, der einen ServiceEndpoint wie unten nehmen würde:

// Schritt 3 Fügen Sie einen Dienst-Endpunkt hinzu. selfHost.AddServiceEndpoint(typeof(ICalculator), binding, "CalculatorService");

Wie würden Sie dennoch programmatisch App.config-Elemente wie z. B.:

<services>
  <service name="GettingStartedLib.CalculatorService">
    <host>
      <baseAddresses>
        <add baseAddress = "http://localhost:8000/GettingStarted/CalculatorService" />
      </baseAddresses>
    </host>
    <!-- Service Endpoints -->
    <!-- Unless fully qualified, address is relative to base address supplied above -->
    <endpoint address="" binding="wsHttpBinding" contract="GettingStartedLib.ICalculator">
      <!-- 
          Upon deployment, the following identity element should be removed or replaced to reflect the 
          identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
          automatically.
      -->
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <!-- Metadata Endpoints -->
    <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
    <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X