servicemodel remoteaddress example endpointconfigurationname endpointaddress address c# wcf wcf-binding wcf-client

c# - remoteaddress - WCF cambia la dirección del punto final en el tiempo de ejecución



wcf address (4)

Almacenamos nuestras URL en una base de datos y las cargamos en tiempo de ejecución.

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; } }

Implementación

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

Tengo mi primer ejemplo de WCF funcionando. Tengo el host en un sitio web que tiene muchas ataduras. Debido a esto, he agregado esto a mi web.config.

<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>

Este es mi enlace predeterminado http: //id.web , que funciona con el siguiente código.

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

Ahora estoy tratando de establecer la dirección del punto final en tiempo de ejecución. Aunque es la misma dirección del código anterior.

EchoServiceClient client = new EchoServiceClient(); client.Endpoint.Address = new EndpointAddress("http://id.web/Services/EchoService.svc"); litResponse.Text = client.SendEcho("Hello World"); client.Close();

El error que recibo es:

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

¿Sugiere cómo puedo cambiar la dirección del punto final en tiempo de ejecución?

Adicional aquí está la configuración de mi cliente, solicitada por 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>


Este es un ejemplo simple de lo que utilicé para una prueba reciente. Debe asegurarse de que su configuración de seguridad sea la misma en el servidor y el cliente.

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


Por lo tanto, su dirección de punto final definida en su primer ejemplo está incompleta. También debe definir la identidad del punto final como se muestra en la configuración del cliente. En el código puedes probar esto:

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

Versión final real de trabajo por 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();


app.config

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

programa

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