C# Привязки клиента NetTcpBinding из другого файла конфигурации - PullRequest
0 голосов
/ 27 марта 2020

У меня есть клиент, который является windows приложением, которое называется Windows .exe. У меня есть C# библиотека классов с именем ServiceFacade.dll, и у нее есть файл конфигурации с именем ServiceFacade.dll.config. В ServiceFacade.dll.config у меня есть привязки на стороне клиента, как показано ниже

<system.serviceModel>
    <client>
      <endpoint address="net.tcp://localhost:5000/MyService" 
                binding="netTcpBinding" 
                contract="IMyService"
                name="NetTcpBinding_MyService"/>
    </client>
  </system.serviceModel>

В ServiceFacade.dll у меня есть код, подобный приведенному ниже, для создания прокси

NetTcpBinding binding = new NetTcpBinding("NetTcpBinding_MyService");
ChannelFactory<IMyService> chn = new ChannelFactory<IMyService>(binding);
IMyService service = chn.CreateChannel();

Windows .exe вызывает ServiceFacade.dll для выполнения сервисных вызовов.

Но ниже строки ищет NetTcpBinding_MyService в Windows .exe.config вместо ServiceFacade.dll.config

Как сделать ниже строку, чтобы увидеть NetTcpBinding_MyService в ServiceFacade.dll. конфигурация, но не Windows .exe.config?

Привязка NetTcpBinding = новая привязка NetTcpBinding ("NetTcpBinding_MyService");

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Вы определенно можете скопировать конфигурацию в ServiceFacade.dll.config из Windows.exe.config. Я предпочел бы создать конечную точку службы вручную, чем копировать конфигурацию, когда я вызываю службу с помощью ChannelFactory.
На стороне клиента.

class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("https://vabqia969vm:21011/");
            NetTcpBinding binding = new NetTcpBinding();
            binding.OpenTimeout = new TimeSpan(0, 10, 0);
            binding.MaxReceivedMessageSize = 2147483647;
            binding.ReaderQuotas.MaxStringContentLength = 2147483647;
            ChannelFactory<ITestService> factory = new ChannelFactory<ITestService>(binding, new EndpointAddress(uri));
            ITestService service = factory.CreateChannel();
            var result1 = service.GetData(34);
            Console.WriteLine(result1);
        }

    }
    //The service contract is shared between the client-side and the server-side.
    [ServiceContract]
    public interface ITestService
    {
        [OperationContract]
        string GetData(int id);
    }

Wi sh это полезно для вас.

0 голосов
/ 28 марта 2020

Я сделал, как показано ниже.

Я добавил ниже в ServiceFacade.dll.config

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpBindingConfiguration"
                 closeTimeout="00:10:00"
                 openTimeout="00:10:00"
                 receiveTimeout="00:10:00"
                 sendTimeout="00:10:00"
                  maxBufferSize="2147483647"
                 maxBufferPoolSize="2147483647"
                 maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                         maxArrayLength="2147483647" maxBytesPerRead="2147483647"
                         maxNameTableCharCount="2147483647" />
        </binding>
      </netTcpBinding>
    </bindings>

    <client>
      <endpoint address="net.tcp://localhost:5000/MyService" 
                binding="netTcpBinding" 
                contract="IMyService"
                name="NetTcpBinding_MYService"                
                bindingConfiguration="netTcpBindingConfiguration" />
    </client>
  </system.serviceModel>

В ServiceFacade.dll у меня есть код, подобный приведенному ниже, для создания прокси

string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
Configuration config = ConfigurationManager.OpenExeConfiguration(path);
ConfigurationChannelFactory<IMyService> chn =
    new ConfigurationChannelFactory<IMyService>(
        "NetTcpBinding_MyService",
        config,
        new EndpointAddress("net.tcp://localhost:5000/MyService"));
IMyService iMyService = chn.CreateChannel();
...