[英]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編寫的,但它“啟發了我”以:
一切正常,我想將這些東西分離出來雖然有一些[性能?]優勢,但是已經描述了我的結構, 我需要解決我的問題/問題 :
當我將其部署到生產環境中時,我遇到了許多配置問題,這些問題要求我進行相當“笨拙”的更改,並容易使事情搞砸。 這是我對需要更改的內容的猜測,但是我進行了廣泛搜索,無法理解如何做:
帶有Web參考的ProxyZipeeeService項目產生的文件如下:
當我將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更改! 問題仍然存在。 這是我所做的:
也許我誤解了這種方法應該允許什么? 我有什么想念的嗎? 我沒有重建代理 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.