WCF change endpoint address at runtime

怎甘沉沦 提交于 2019-11-26 08:04:49

问题


I have my first WCF example working. I have the host on a website which have many bindings. Because of this, I have added this to my web.config.

<serviceHostingEnvironment multipleSiteBindingsEnabled=\"true\"/>

This is my default binding http://id.web, which works with the following code.

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

I am now trying to set the endpoint address at runtime. Even though it is the same address of the above code.

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

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

The error I get is:

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

Please suggest how I may change the endpoint address at runtime?

Additional here is my client config, requested by 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>

回答1:


So your endpoint address defined in your first example is incomplete. You must also define endpoint identity as shown in client configuration. In code you can try this:

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

Actual working final version by 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(); 



回答2:


This is a simple example of what I used for a recent test. You need to make sure that your security settings are the same on the server and 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();



回答3:


app.config

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

program

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

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



回答4:


We store our URLs in a database and load them at runtime.

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

Implementation

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


来源:https://stackoverflow.com/questions/5151077/wcf-change-endpoint-address-at-runtime

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!