3

我有一個小的共享點項目,它集成到一個更大的共享點項目中。我的項目使用兩個Web服務。我已經使用Web Reference(嵌入在服務參考中)在VS2010中添加了它們。我們有兩套網絡服務 - 一套用於測試,一套用於生產。當我在本地部署應用程序時,Web服務設置將寫入位於本地機器上的C:\inetpub\wwwroot\wss\VirtualDirectories\80\的web.config文件中。該部分看起來像這樣 -在App.Config中更改Web服務URL

<applicationSettings> 
    <XXX.YYY.Properties.Settings> 
     <setting name="XXX_YYY_ZZZ_WS1" serializeAs="String"> 
     <value>http://<TEST_IPAddress>/WebService/WS1.asmx</value> 
     </setting> 
     <setting name="XXX_YYY_ZZZ_WS2" serializeAs="String"> 
     <value>http://<TEST_IPAddress>/WebService/WS2.asmx</value> 
     </setting> 
    </XXX.YYY.Properties.Settings> 
    </applicationSettings> 

測試和生產Web服務之間的區別只是IP地址。當我將IP地址更改爲生產時,該應用程序未使用新值。我必須返回到VS,將Properties對話框中的Web Reference URL更新爲正確的生產URL,然後重新部署該包。這是非常乏味的,因爲我不斷地從測試切換到生產Web服務網址。我希望能夠更改app.config中的IP地址,刷新瀏覽器中的頁面,並且應該選取新的URL。

我做錯了什麼?有沒有另一種方法來做到這一點?

回答

1

我想如果你在代碼中改變web服務的URL,那麼你將不必重複構建過程。你可以這樣

WebServiceObjectName webService = new WebServiceObjectName(); 
webService.Uri = [IPaddress or DNS name] 
+0

我想我可能會讓您感到困惑。我發佈的代碼段代碼是兩個TEST Web服務的URL。它不是一個用於測試,一個用於生產。他們都是測試。我希望能夠更改爲生產IP,並且應用程序應該自動將其提取出來。 – tempid 2012-04-18 17:38:16

+0

然後你可以有4個鍵2用於測試,2個用於生產,一個鍵指向部署類型,即測試活 – Adil 2012-04-18 17:41:52

+0

我理解你的方法,但我不確定如何實現它們。你是否希望我在Production的部分有兩個條目?你能否詳細說明一下?謝謝! – tempid 2012-04-18 17:44:33

0

我們這樣做,這樣修改:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IPublicWS" 
       openTimeout="00:00:05" 
       sendTimeout="00:03:00" 
       receiveTimeout="00:10:00" 
       closeTimeout="00:00:30" 
       allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="262144" maxBufferPoolSize="524288" maxReceivedMessageSize="262144" 
       messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="131072" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="None"> 
       <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
       <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <!-- Production --> 
     <endpoint name="SvLive" address="http://sv.com/PublicWS/PublicWS.svc/PublicWS" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPublicWS" contract="SV.IPublicWS" /> 

     <!-- Test --> 
     <endpoint name="SvTest" address="http://staging.sv.com/PublicWS/PublicWS.svc/PublicWS" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPublicWS" contract="SV.IPublicWS" /> 
    </client> 
</system.serviceModel> 

然後,爲了獲取客戶端引用此WebService:

public static PublicWSClient Client() 
{ 
#if PRODUCTION 
    return new PublicWSClient("SvLive"); 
#else 
    return new PublicWSClient("SvTest"); 
#endif 
} 

被稱爲像這樣:

var sv = PublicWSClient.Client(); 

這可以防止您描述的任何手動步驟,並且允許在單個配置文件中捕獲測試和實況以準備簽入。