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>
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();
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();
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("","",""));
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);