繁体   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