0

WCF serviceあるマシンで実行する方法とsimple comsole application client、別のマシンで実行するユーザーがいます。サーバーは非常に単純なことを行います: クライアントが送信した 2 つの数値の値を返す 1 つのメソッド:

[ServiceContract]
public interface IMySampleWCFService
{
    [OperationContract]
    int Add(int num1, int num2);

    [OperationContract]
    void CreateDirectory(string directory);

    [OperationContract]
    string GetVendorToRun(string path);
}

    public class MySampleWCFService : IMySampleWCFService
    {
        public int Add(int num1, int num2)
        {
            return num1 + num2;
        }
    }

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="WCFServiceHostingInWinService.MySampleWCFService">
        <endpoint
          name="ServiceHttpEndPoint"
          address="" 
          binding="basicHttpBinding"
          contract="WCFServiceHostingInWinService.IMySampleWCFService">
        </endpoint>
        <endpoint
          name="ServiceMexEndPoint"
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://192.0.16.250:8733/MySampleWCFService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the value below to false before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

私がやりたいこと、実装するのが難しいとWCF service思うのは、私が新しい開発者であるため、Discovery を自分の に追加することです。複数のマシンに複数のサービスがインストールされているとします。そして、ディスカバリーから受け取ることができるこのすべてのデータ。私はいくつかの記事を読もうとしていますが、私が言及したように、それを行う方法が理解できなかったので、助けていただければ幸いです。

4

2 に答える 2

0

これを行う最も簡単な方法は、実行時に計算したアドレスにクライアントを接続することだと思います。例えば:

    static void Main(string[] args)
    {
        var addresses = new List<string>
        {
            @"http://192.168.1.1:8730/MySampleWCFService/",
            @"http://localhost:8731/MySampleWCFService/",
            @"http://localhost:8732/MySampleWCFService/",
            @"http://localhost:8733/MySampleWCFService/",
        };
        foreach (var address in addresses)
        {
            var client = new MySampleWCFServiceClient(new BasicHttpBinding(), new EndpointAddress(address));
            try
            {
                client.Open();
                client.Add(0, 1);
                Console.WriteLine("Connected to {0}", address);

            }
            catch (EndpointNotFoundException)
            {
                Console.WriteLine("Service at {0} is unreachable", address);
            }
        }
        Console.ReadLine();
    }

私の場合、住所のリストを作成しますが、あなたの場合は、いくつかの事前定義されたルールで住所を作成できます。たとえば、サービスが名前とポートで http バインディングを使用することがわかっているとします。また、クラスターが 192.0.16.xxx LAN にあることもわかっているので、次の式を使用できます。

アドレス = "http://" + NextLanAddress() + ":" + ポート + "/" + サービス名 + "/";

于 2013-10-23T13:13:51.983 に答える