ClickOnce动态更改WS URL

时间:2018-01-03 06:07:09

标签: c# url clickonce environment

我开发了ClickOnce应用程序(C#Framework 4.5) 它通过Web Service访问数据。 我们有三个环境:dev,test和prod。 每个环境 - 另一个服务器名称。 我想发布一个并使用外部工具将其复制到每个环境。 问题,为每个环境访问Web服务的正确URL。 我需要在每个环境的代码中动态更改url。

我向app.config添加了WS引用

<add key="ws_url_local" value="http://localhost/app/ws.asmx" />
<add key="ws_url_prod" value="http://server_prod/app/ws.asmx" />
<add key="ws_url_test" value="http://server_test/app/ws.asmx" />
<add key="ws_url_dvlp" value="http://server_dvlp/app/ws.asmx" />

我发布到文件夹,然后,另一个系统将文件夹复制到 所有环境。 我如何在代码中按环境动态更改网址?

switch(fromWhereInstaled?){
  case "prod":
    url = ConfigurationManager.AppSettings["ws_url_prod"];
    break;
  case "test":
    ...
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

找到解决方案:

string url = ConfigurationManager.AppSettings["url_ws_local"];
if(ApplicationDeployment.IsNetworkDeployed)
{
  ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
  if(ad.ActivationUri.AbsolutePath.Contains("prodservername"))
  {
    url = ConfigurationManager.AppSettings["url_ws_prod"];
  }
  else if ad.ActivationUri.AbsolutePath.Contains("testservername")
  .....
}
ws.Url = url;

但如果您在没有更新ActivationUri的情况下移动应用程序,请使用此解决方案:

string url = ConfigurationManager.AppSettings["url_ws_local"];
if(AppDomain.CurrentDomain.SetupInformation.ActivationArgument != null && AppDomain.CurrentDomain.SetupInformation.ActivationArgument.ActivationData != null) // Network published
{
  string strParam = AppDomain.CurrentDomain.SetupInformation.ActivationArgument.ActivationData[0];
  if(strParam.Contains("prodservername"))
  {
    url = ConfigurationManager.AppSettings["url_ws_prod"];
  }
  else if ...
}
ws.Url = url;

但不要忘记转到Properties =&gt; Publish&gt; Options =&gt; Manifest,并检查: 允许将URL参数传递给应用程序。 同样通过这种方式,您可以更改检查更新的URL。