2014-05-20 109 views
1

我正在開發一個應用程序,該應用程序將根據用戶的位置連接到各種Web服務。在運行時更改Web服務URL

例如:

如果用戶在城市「A」,應用程序將連接到Web服務:「192.168.1.1:8010」,如果他去到城市「B」,將連接到「192.168.1.1:8020」,在城市「C」將是「192.168.1.1:8030」,依此類推。

IP地址始終相同,端口號發生了什麼變化。

簡單的事情吧?是的,但我找不到在運行時使其工作的方法!

當我在運行時更改Web服務的「URL」參數(myWS.Url)(「URL Behaivor == Dynamic」)時,服務器只返回null,將參數更改爲原始值,通信是恢復。

如果在編譯之前進行編譯,編譯到城市「A」,僅在城市「A」中編譯到城市「B」,僅在城市「B」中運行,那麼它也是同樣的事情。

該應用程序最初是爲使用VS2008和CF3.5的Windows CE 5.0開發的,但即使在VS2013中也是如此。 NET框架4.0和Windows 7的「問題」仍然發生。

有沒有人遇到過這個?

按照要求,這裏是我的代碼的一小部分:

WSR.WSR myWS = new WSR.WSR(); 

//WSR added as a Web Reference 

if (City_A) 
{ 
    myWS.Url = "http://192.168.1.1:8010/WSR.apw"; 
} 
else 
{ 
    myWS.Url = "http://192.168.1.1:8020/WSR.apw"; 
} 

這個話題(What should be modified to change the URL of a web service in C#?)對我來說,因爲我說不行,當我改變了「URL中旨意的解決方案行爲「屬性沒有入口點是在我的app.config文件中創建的。

下面是app.config文件:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="TrocaWebService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <startup> 

    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup> 
    <system.serviceModel> 
     <bindings /> 
     <client /> 
    </system.serviceModel> 
    <userSettings> 
     <TrocaWebService.Properties.Settings> 
      <setting name="TrocaWebService_WSR_WSR" serializeAs="String"> 
       <value>http://192.168.1.1:8010/WSR.apw</value> 
      </setting> 
     </TrocaWebService.Properties.Settings> 
    </userSettings> 
</configuration> 
+1

你們是不是要命中80端口爲不同的端口重定向用戶基於什麼? – Guvante

+0

端口是否動態? –

+0

你有一些代碼可以幫助你發現問題嗎? – RobbieE

回答

0

我使用WCF綁定(Visual Studio中 - >添加服務引用)來對一個WSDL創建代理類。然後在運行時我將創建一個ClientBase(其中有一個端點(即網址))使用此代碼:

public static class ServiceClientFactory 
{ 
    public static HttpBindingBase BuildBinding(string endpointUrl) 
    { 
     if (endpointUrl.ToLower().StartsWith("https")) 
     { 
      var binding = new BasicHttpsBinding(BasicHttpsSecurityMode.Transport); 
      binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm; 
      binding.MaxReceivedMessageSize = int.MaxValue - 1; 
      return binding; 
     } 

     else 
     { 
      var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly); 
      binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm; 
      binding.MaxReceivedMessageSize = int.MaxValue - 1; 
      return binding; 
     } 
    } 

    public static TClient CreateClient<TClient, TChannel>(string endpoint, string username, string password) 
     where TClient : ClientBase<TChannel> 
     where TChannel : class 
    { 
     var client = (TClient) 
      Activator.CreateInstance(
       typeof (TClient), 
       BuildBinding(endpoint), 
       new EndpointAddress(endpoint)); 

     if (null == client.ClientCredentials) 
      throw new Exception(
       string.Format("Error initializing [{0}] client. Client Credentials object was null", 
        typeof(TClient).Name)); 


     //This is for setting Basic Auth 
     client.ClientCredentials.Windows.ClientCredential = 
      new NetworkCredential(
       username, 
       password); 

     client.ClientCredentials.Windows.AllowedImpersonationLevel = 
      TokenImpersonationLevel.Delegation; 

     return client; 
    } 
} 

}