簡體   English   中英

如何為ASP.NET Web服務配置代理類以靈活地部署到生產環境

[英]How to configure a proxy class for an ASP.NET web service for flexible deployment to production

我在Visual Studio 2003級別繼承了一個Web應用程序,該應用程序將用於訪問SQL Server的所有代碼都放在ASMX Web服務中。 該Web項目具有對該Web服務的Web參考。 我需要將整個內容置於源代碼控制之下,將其升級到Vstudio 2008並進行大量修復和增強。

為此,我看到了Code Magazine的一篇整潔的文章,強調了“匯編分離”的優點 它是為WCF編寫的,但它“啟發了我”以:

  • 從我的主要ASP.NET Web應用程序項目中刪除Web參考
  • 添加一個新項目作為類庫,我稱之為ProxyZipeeeService
  • 在ProxyZipeeeService項目中添加Web引用以指向ZipeeeService項目
  • 在主Web應用程序項目中添加對通過構建同名項目而生成的ProxyZipeeeService.DLL引用

一切正常,我想將這些東西分離出來雖然有一些[性能?]優勢,但是已經描述了我的結構, 我需要解決我的問題/問題

當我將其部署到生產環境中時,我遇到了許多配置問題,這些問題要求我進行相當“笨拙”的更改,並容易使事情搞砸。 這是我對需要更改的內容的猜測,但是我進行了廣泛搜索,無法理解如何做:

帶有Web參考的ProxyZipeeeService項目產生的文件如下:

  • Reference.map.vb,ProxyZipeeeService.disco,ProxyZipeeeService.wsdl和app.config
  • 在我的開發PC上, app.config文件為localhost的URL生成了設置(對我的PC來說應該如此)。 請在以下位置查看此XML條目: http : //pastebin.com/JtQCxT73
  • 當我將Web應用程序項目發布到生產Web服務器時,Web服務的URL被“掩埋”在ProxyZipeeeService的DLL內(由於已被引用,此地址當前在Web應用程序的bin文件夾中)。

  • 因為prod Web服務器被配置為識別“主機頭文件” [某天另一個問題],所以localhost的URL失敗,並顯示HTTP 400 Bad Request 主機標頭配置需要任何與此默認網站相關的內容,才能使用域http://www.zipeee.com/ZipeeeWebService/Zipeee.asmx

  • 因此,要解決此問題,我不得不“撤消”我的ProxyZipeeeService開發項目-完全刪除Web參考,將其添加回去,但這一次使對話框指向生產服務器上的WS(而不是讓它找到WS)在“此解決方案”中,因為這會導致有問題的“本地主機”設置)。

  • 最終,我能夠將引用代理dll的Web項目推送到產品服務器,該代理dll將不會遇到此主機頭問題,並且它可以正常工作而不會引發HTTP 400錯誤。

但是必須有更好的方法!

簡而言之,關鍵代理dll無法使用應該使用我現在設置的方式配置的URL。 我嘗試將app.config中applicationSettings條目放入Web應用程序項目的web.config中。 我也曾嘗試在appSettings部分中對此進行修改。 這些嘗試均失敗。

我希望我很清楚,不要太冗長。 請不要建議像WCF這樣的大手術,因為我現在不能為這個項目而努力。 感謝您的閱讀,並預先感謝您的幫助。

編輯更新:未檢測到Web應用程序的WEB.CONFIG中的URL更改! 問題仍然存在。 這是我所做的:

  • 完全按照您說的去做,將設置從代理的app.config提升到Web應用程序的web.config(建立一個新的配置部分組,該組指向從app.config指向我的設置。
  • 代理中的值以及現在在web.config中的值都讀取為: http://localhost/ZipeeeWebService/Zipeee.asmx ,可以在我的開發PC上進行測試
  • 在將所有這些部署到生產服務器之前,我認為應該進行一些測試。 我的第一個測試是使用上面的設置,我在Web服務項目中設置了一個斷點,並驗證了代理確實作為預期的web.config條目進入了本地主機。
    • 接下來(測試案例2),我將web.config條目從localhost更改為www.zipeee.com,這是面向公眾的Web應用程序使用的生產Web服務的位置。
    • 我在第一個Web服務調用中保留了相同的斷點(希望不會被擊中,因為其意圖是使用web.config中指定的URL)
    • 令我驚訝的是,斷點被擊中,當我通過“即時窗口”檢查URL時,它表明它是本地主機(應按web.config中的說明訪問www.zipeee.com)。

也許我誤解了這種方法應該允許什么? 我有什么想念的嗎? 沒有重建代理 DLL(保留在localhost中),我認為這是整個意圖(即能夠通過對Web應用程序的web.config進行更改以某種“后期綁定”方式控制URL) )。

我仍然很沮喪。 希望您能為我提供更多幫助...謝謝。

編輯更新:10月12日

謝謝-我讀了你的筆記,但我仍然很困惑。 ProxyZipeeeService項目代碼都是從Web參考生成的。 這是reference.vb文件的摘錄( 您是否建議我修改此生成的代碼? ):

Public Sub New()
        MyBase.New
        Me.Url = Global.ProxyZipeeeService.My.MySettings.Default.ProxyZipeeeService_WSZipeee_Zipeee
        If (Me.IsLocalFileSystemWebService(Me.Url) = true) Then
            Me.UseDefaultCredentials = true
            Me.useDefaultCredentialsSetExplicitly = false
        Else
            Me.useDefaultCredentialsSetExplicitly = true
        End If
    End Sub

    Public Shadows Property Url() As String
        Get
            Return MyBase.Url
        End Get
        Set
            If (((Me.IsLocalFileSystemWebService(MyBase.Url) = true)  _
                        AndAlso (Me.useDefaultCredentialsSetExplicitly = false))  _
                        AndAlso (Me.IsLocalFileSystemWebService(value) = false)) Then
                MyBase.UseDefaultCredentials = false
            End If
            MyBase.Url = value
        End Set
    End Property

順便說一句,您能否評論一下Web服務的單獨程序集(代理)的整個想法是否值得呢? 可能會有一些性能上的好處(?),但這些配置問題使我很合適。

編輯更新10月12日 -稍后

從生成的文件reference.vb中最后一次發布代碼后,我發現了問題! 您讓我放置在Web應用程序的web.config文件中的聲明名為:

section name="ProxyZipeeeService.Properties.MySettings"

而reference.vb文件將設置引用為:

Me.Url = Global.ProxyZipeeeService.My.MySettings.Default.ProxyZipeeeService_WSZipeee_Zipeee

更改Web配置名稱改為段名=“ProxyZipeeeService。 .MySettings”啟用了代理發現在Web應用程序的web.config中的設置,現在我能夠“開關”的Web服務,通過配置參數網址。

非常感謝你的幫助。 我現在關閉這個。

ps“專業人員”是否將代理類用作此類Web服務的包裝器?

您應該將配置放置在Web應用程序的web.config中,並創建一個引用回ProxyZipeeeService項目的部分組。 為此,將部分組和實際的applicationSettings從ProxyZipeeeService復制到Web應用程序:

  <configSections>
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <section name="ProxyZipeeeService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
     </sectionGroup>
  </configSections>
  <!--other stuff-->
  <applicationSettings>
     <ProxyZipeeeService.Properties.Settings>
        <!--your original appSettings-->
     </ProxyZipeeeService.Properties.Settings>
  </applicationSettings>

然后,可以在部署應用程序后更改設置。

如果所有其他方法均失敗,則還可以使ProxyZipeeeService庫將URL公開為公共屬性,因此可以在運行時通過Web應用程序對其進行更改。

我希望這可以幫到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM