WCF在运行时更改端点地址

我有我的第一个WCF例子工作。 我有一个网站上的主机有很多绑定。 因此,我已经添加到我的web.config。

<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 

这是我的默认绑定http://id.web ,它与以下代码一起使用。

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

我正在尝试在运行时设置端点地址。 即使它是上述代码的相同地址。

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

我得到的错误是:

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

请build议我如何在运行时更改端点地址?

另外这里是我的客户端configuration,由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> 

所以你的第一个例子中定义的端点地址是不完整的。 您还必须定义端点身份,如客户端configuration中所示。 在代码中,你可以试试这个:

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

实际工作最终版本由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(); 

这是我用于最近testing的简单例子。 您需要确保您的安全设置在服务器和客户端上是相同的。

 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> 

程序

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

我们将我们的URL存储在数据库中并在运行时加载它们。

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

履行

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