[英]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.