как найти адрес сервиса в клиенте WCF - PullRequest
0 голосов
/ 23 октября 2018

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

1 Ответ

0 голосов
/ 24 октября 2018

Служба 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>
...