在C#中,如何引用app.exe.config中配置的端口号?

时间:2011-09-22 14:48:23

标签: c# .net remoting .net-remoting

在我们的服务器中,我们在app.config中配置端口,如下所示:

<configuration>
   <system.runtime.remoting>
      <application>
         <channels>
            <channel ref="tcp" port="1234" />
         </channels>
      </application>
   </system.runtime.remoting>
</configuration>

然后我们继续使用以下C#代码配置服务器:

RemotingConfiguration.Configure(string.Format("{0}{1}", appFolder, "app.exe.config"), false);

配置完成后,如何配置端口号,而不是手动解析文件?

3 个答案:

答案 0 :(得分:3)

毕竟看起来有可能。在调用RemotingConfiguration.Configure(string,bool)之后,我运行以下方法:

private string GetPortAsString()
          {
             // Parsing
             System.Runtime.Remoting.Channels.IChannel[] channels = System.Runtime.Remoting.Channels.ChannelServices.RegisteredChannels;
             foreach (System.Runtime.Remoting.Channels.IChannel c in channels)
             {
                System.Runtime.Remoting.Channels.Tcp.TcpChannel tcp = c as System.Runtime.Remoting.Channels.Tcp.TcpChannel;
                if (tcp != null)
                {
                   System.Runtime.Remoting.Channels.ChannelDataStore store = tcp.ChannelData as System.Runtime.Remoting.Channels.ChannelDataStore;
                   if (store != null)
                   {
                      foreach (string s in store.ChannelUris)
                      {
                         Uri uri = new Uri(s);
                         return uri.Port.ToString(); // There should only be one, and regardless the port should be the same even if there are others in this list.
                      }
                   }
                }
             }

             return string.Empty;
          }

这为我提供了我需要的TcpChannel信息,这使我可以获取ChannelUri并获取端口。

GRAIT SUCCESS!

答案 1 :(得分:0)

您只能通过代码或配置进行配置,不能同时执行这两项操作。这意味着您无法通过代码访问配置的详细信息(不自行传递xml文件)。

答案 2 :(得分:0)

我刚看了一下ConfigurationManager来帮助获取你需要的值...不幸的是,它看起来没有为system.runtime.remoting设置sectionGroup:即,此调用失败:< / p>

var cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var sectionGroup = cfg.GetSectionGroup("system.runtime.remoting");

enter image description here

因此,在我看来,您可以使用框架中存在的任何内容来很好地提取它。我不确定为什么这个sectionGroup在代码中不存在。