Как найти адрес сервиса в клиенте WCF

Я создал службу WCF и клиента на одной машине, адрес службы записан в коде клиента, поэтому я могу легко найти службу и создать соединение с ней.
Затем я пытаюсь развернуть их во внутренней сети. Первая проблема: как клиент может найти адрес сервера. В реальных условиях клиенты могут установить службу на любом компьютере в интрасети. Можно ли как-нибудь разрешить клиенту найти адрес сервера?

1 ответ

Решение

Служба WCF может предоставить конкретную конечную точку в качестве конечной точки обнаружения всем клиентам, чтобы клиент мог найти, где находится служба. Вы даже можете использовать многоадресную передачу UDP, чтобы клиент мог обнаружить службу.

Вы можете проверить официальный документ.

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-discovery

Я сделал демо, желаю, чтобы это было полезно для вас.

Сервер.

class Program
{
    static void Main(string[] args)
    {
        using (ServiceHost sh=new ServiceHost(typeof(MyService)))
        {
            sh.Open();
            Console.WriteLine("serivce is ready...");

            Console.ReadLine();
            sh.Close();
        }
    }
}
[ServiceContract]
public interface IService
{
    [OperationContract]
    string SayHello();
}
public class MyService : IService
{
    public string SayHello()
    {
        return "Hello, I am a Clown";
    }

}

Сервер app.config

<system.serviceModel>
<services>
  <service name="DiscoveryEndpoint20181024.MyService" behaviorConfiguration="mybehavior">
    <endpoint address="http://10.157.18.188:4800" binding="wsHttpBinding" contract="DiscoveryEndpoint20181024.IService"></endpoint>
    <endpoint kind="discoveryEndpoint" address="http://localhost:9999" binding="wsHttpBinding"></endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="mybehavior">
      <serviceMetadata />
      <serviceDiscovery />
    </behavior>
  </serviceBehaviors>
</behaviors>

Клиент.

class Program
{
    static void Main(string[] args)
    {
        DiscoveryClient client = new DiscoveryClient("my_client");
        client.ClientCredentials.Windows.ClientCredential.UserName = "administrator";
        client.ClientCredentials.Windows.ClientCredential.Password = "abcd1234!";
        FindCriteria crit = new FindCriteria(typeof(IService));
        FindResponse resp = client.Find(crit);

        if (resp != null && resp.Endpoints.Count > 0)
        {
            EndpointDiscoveryMetadata epaddrMtd = resp.Endpoints[0];
            ChannelFactory<IService> factory = new ChannelFactory<IService>(new WSHttpBinding(), epaddrMtd.Address);
            factory.Credentials.Windows.ClientCredential.UserName = "administrator";
            factory.Credentials.Windows.ClientCredential.Password = "abcd1234!";
            IService service = factory.CreateChannel();
            var result=service.SayHello();
            Console.WriteLine(result);
            Console.ReadLine();
        }

    }
}
[ServiceContract]
public interface IService
{
    [OperationContract]
    string SayHello();
}

class DemoService : IService
{
    public string SayHello()
    {
        OperationContext context = OperationContext.Current;
        return $"the address:{OperationContext.Current.Channel.LocalAddress.Uri}";
    }

}

Client.config

<system.serviceModel>
    <client>
      <endpoint name="my_client" kind="discoveryEndpoint" address="http://10.157.18.188:9999" binding="wsHttpBinding"></endpoint>
    </client>
  </system.serviceModel>
Другие вопросы по тегам