web-dev-qa-db-fra.com

WCF change l'adresse du point de terminaison au moment de l'exécution

J'ai mon premier exemple WCF qui fonctionne. J'ai l'hôte sur un site Web qui a de nombreuses liaisons. Pour cette raison, j'ai ajouté ceci à mon web.config.

<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>

C'est ma liaison par défaut http: //id.web , qui fonctionne avec le code suivant.

EchoServiceClient client = new EchoServiceClient();
litResponse.Text = client.SendEcho("Hello World");
client.Close();

J'essaie maintenant de définir l'adresse du point de terminaison lors de l'exécution. Même s'il s'agit de la même adresse que le code ci-dessus.

EchoServiceClient client = new EchoServiceClient();
client.Endpoint.Address = new EndpointAddress("http://id.web/Services/EchoService.svc"); 

litResponse.Text = client.SendEcho("Hello World");
client.Close();

L'erreur que j'obtiens est:

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

Veuillez suggérer comment je peux changer l'adresse du point de terminaison lors de l'exécution?

Voici ma configuration client supplémentaire, demandée par Ladislav Mrnka

 <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IEchoService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="None" />
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://id.web/Services/EchoService.svc" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IEchoService" contract="IEchoService"
                name="WSHttpBinding_IEchoService">
                <identity>
                    <servicePrincipalName value="Host/mikev-ws" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
37
Valamas

Votre adresse de point de terminaison définie dans votre premier exemple est donc incomplète. Vous devez également définir l'identité du point de terminaison comme indiqué dans la configuration du client. Dans le code, vous pouvez essayer ceci:

EndpointIdentity spn = EndpointIdentity.CreateSpnIdentity("Host/mikev-ws");
var address = new EndpointAddress("http://id.web/Services/EchoService.svc", spn);   
var client = new EchoServiceClient(address); 
litResponse.Text = client.SendEcho("Hello World"); 
client.Close();

Version finale de travail réelle par valamas

EndpointIdentity spn = EndpointIdentity.CreateSpnIdentity("Host/mikev-ws");
Uri uri = new Uri("http://id.web/Services/EchoService.svc");
var address = new EndpointAddress(uri, spn);
var client = new EchoServiceClient("WSHttpBinding_IEchoService", address);
client.SendEcho("Hello World");
client.Close(); 
29
Ladislav Mrnka

Ceci est un exemple simple de ce que j'ai utilisé pour un test récent. Vous devez vous assurer que vos paramètres de sécurité sont les mêmes sur le serveur et le client.

var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.None;
var myEndpointAddress = new EndpointAddress("http://servername:8732/TestService/");
client = new ClientTest(myBinding, myEndpointAddress);
client.someCall();
22
John Petrak

app.config

<client>
    <endpoint address="" binding="basicHttpBinding" 
    bindingConfiguration="LisansSoap" 
    contract="Lisans.LisansSoap" 
    name="LisansSoap" />
</client>

programme

 Lisans.LisansSoapClient test = new LisansSoapClient("LisansSoap",
                         "http://webservis.uzmanevi.com/Lisans/Lisans.asmx");

 MessageBox.Show(test.LisansKontrol("","",""));
15
Abdusselam

Nous stockons nos URL dans une base de données et les chargeons lors de l'exécution.

public class ServiceClientFactory<TChannel> : ClientBase<TChannel> where TChannel : class
{
    public TChannel Create(string url)
    {
        this.Endpoint.Address = new EndpointAddress(new Uri(url));
        return this.Channel;
    }
}

La mise en oeuvre

var client = new ServiceClientFactory<yourServiceChannelInterface>().Create(newUrl);
7
LawMan