gpt4 book ai didi

asp.net - 在.NET中管理多个服务引用的最佳方法

转载 作者:行者123 更新时间:2023-12-02 10:14:51 26 4
gpt4 key购买 nike

我有一个带有15个WCF / ASMX服务参考的C#ASP.NET项目。每个服务都部署到三台不同的服务器上。 teststaginglive

通常,我们需要将这些服务引用的URL更改为不同的服务器,以便能够使用具有正确实现和数据的正确服务进行调试。

在管理这些服务引用时,我很难保持URL同步。创建服务引用FooService时,它将URL存储在三个单独的文件中:


FooService.disco
configuration.svcinfo
Reference.svcmap


以及使用endpoint中的URL创建Web.config节点。

如果我在Web.config中更改端点URL并重建项目,则它不会更新其他文件中的URL,因此它不同步。因此,当我右键单击FooService并单击Update Service Reference时,它不使用存储在Web.config中的URL,而是使用其他文件中的URL。

因此,唯一的方法是右键单击FooService,然后单击Configure Service Reference,然后输入新的URL。但这并不总是可行的,因为有时它会在Web.config中创建一个名为FooService1的新节点,因此在运行我的应用程序时出现错误,提示有两个端点相同的实例。

因此,通常我需要浏览Web.config并删除端点的重复项,这非常令人沮丧。

经常更改服务的URL时,管理多个WCF服务引用的最佳方法是什么?

最佳答案

首先概述
我处理它的方法是不通过Visual Studio添加服务引用。我所拥有的是每个服务在解决方案中都有它自己的Proxy项目,使用简单的单行批处理文件创建代理。然后,将每一个都包含在网站中作为“原始”参考。在Web配置中手动配置了终点。我有三个部署选项:调试(本地),登台和发布。在web.config级别,不同地址由web.config transformations处理。配置代理项目文件,以便根据解决方案配置使用正确的端点地址。但是,请务必注意,web.config转换仅适用于发布解决方案。
在VS2010之前的版本中,我有3种不同的web.config文件,它们会覆盖活动的web.config。但是以这种方式覆盖web.config总是让我感到“烦恼”。在这种情况下,我认为仍然可以使用转换进行发布,但是在实际的web.config文件中,有一些连接块,可以在调试调试或开发服务器时在这些位置上进行注释。
我只有2个服务,因此我的设置非常简单,只有15个设置会涉及很多工作,但从长远来看,它可以节省您的工作量。
实作
首先备份一切!
另外,请保留现有web.config的副本,以帮助稍后配置端点。
另请注意,如果您的解决方案位于名称中带有空格的路径中,则批处理文件将无效。 VS将项目放置在默认位置。我所有的项目都采用以下结构C:\Source\vs2008\C:\Source\vs2010\等。我将看看是否可以找到更好的解决方案。
0以管理员身份运行VisualStudio
从开始菜单中右键单击Visual Studio,然后选择“以管理员身份运行”。我们需要这样做,因为VS将要写入文件。
1删除现有服务参考
您不需要为此提供任何帮助。
2添加代理项目
现在这样做意味着您只需配置一次测试解决方案即可。
从“文件”菜单中选择“添加”,然后选择“新建项目”,然后从非可视化的“ Visual C#”中选择“类库”,并为其命名。在此示例中,我将使用FooService.proxy。重命名类文件,在此示例中,我将使用FooService_proxy.cs
将以下引用添加到项目中:

系统运行时序列化
System.ServiceModel

为每个服务添加一个项目。我们将回来并稍后更新这些项目。
3配置解决方案以处理测试|阶段|实时
我假设您在本地计算机上开发asp.net网站时使用test
在“构建配置”下拉菜单中选择“配置管理器”,以打开它。
在“活动解决方案配置”下拉列表中,选择“新建”
对于“名称”,我建议“暂存”,然后选中“创建新的项目配置”复选框。
在解决方案资源管理器中,右键单击Web.Config,然后选择“添加配置转换”。这将为暂存web.config转换添加一个新文件。单击扩展器箭头,您将看到三个子文件:Web.Debug.Config,Web.Release.Config,Web.Staging Config。
4设置代理
通过在解决方案资源管理器中单击项目,然后选择“添加>新建项目”,将批处理文件添加到每个代理项目中。使用文本文件并将其命名为“ CreateProxy.bat。
将以下内容插入新文件并保存:

:: ============================================================================================
:: Create the proxy file from the service wsdl
:: Input parameters
:: SDK Path The location of svcutil.exe
:: WSDL File Arg1 (%1)
:: Output Proxy .CS file Arg2 (%2)
::
:: Called by the build process of the BeforeBuild target to re-gen the proxy code.
:: Make sure to change FooService.proxy
:: ============================================================================================

svcutil %1 /ct:System.Collections.Generic.List`1 /serializer:DataContractSerializer /tcv:Version35 /n:*,FooService.Proxy /out:%2

现在,右键单击代理项目,然后单击“卸载项目”,如果出现提示,则进行保存。这将使我们能够进入和修改项目文件。右键单击现在变灰的代理项目名称,然后选择“编辑”。
在结束的 </project>标记之前添加以下内容。请注意,您可能需要更改
路径 SDKPath取决于您 svcutil的位置。还要确保将 FooService_proxy.cs命名为您命名代理文件的名称。
<PropertyGroup>
<!-- These properties are used by the svcutil batch file task in the BeforeBuild Target to regen the proxy code -->

<SDKPath Condition="'$(SDKPath)'==''">C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin</SDKPath>
<WSDLPath Condition="'$(WSDLPath)'=='' and '$(Configuration)' == 'Debug'">http://[Path to TEST Server Service]</WSDLPath>
<WSDLPath Condition="'$(WSDLPath)'=='' and '$(Configuration)' == 'Staging'">http://[Path to STAGING server Service]</WSDLPath>
<WSDLPath Condition="'$(WSDLPath)'=='' and '$(Configuration)' == 'Release'">http://[Path to LIVE Server Service]</WSDLPath>
<SkipProxyRegen Condition="'$(SkipProxyRegen)'==''">false</SkipProxyRegen>
</PropertyGroup>
<Target Name="BeforeBuild">
<Message Importance="normal" Text="Rebuilding the proxy code from batch file '$(ProjectDir)CreateProxy.bat'" Condition="'$(SkipProxyRegen)'=='false'" />
<Exec Command="$(ProjectDir)CreateProxy.bat $(WSDLPath) $(ProjectDir)FooService_proxy.cs" WorkingDirectory="$(SDKPath)" Condition="'$(SkipProxyRegen)'=='false'" />
</Target>

保存更改,然后右键单击灰色项目名称,然后选择“重新加载项目”。
右键单击该项目,然后选择“ build”,确保现在已填充您的代理文件。
设置每个代理项目,以使其始终仅构建在其 \bin目录中,例如而不是 bin\debug等。右键单击代理项目,然后选择“属性”。选择“构建”选项卡,然后将“配置”下拉列表更改为“所有配置”。将“输出路径”设置为 bin\
5将代理参考和端点添加到您的网站
右键单击“参考>添加参考”,然后转到“项目”选项卡,将对每个代理项目的参考添加到Webstie中。
现在,打开您的web.config文件并添加绑定,使用之前的web.config作为指南。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="fooServiceEndpoint" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="8192" maxNameTableCharCount="2147483647" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
<!-- Insert other binding as required -->
</basicHttpBinding>
</bindings>
<client>
<!-- Test Server Endpoints - Used for day-to-day development -->
<endpoint address="http:[Path to TEST Server service]"
binding="basicHttpBinding" bindingConfiguration="fooServiceEndpoint"
contract="FooService.Proxy.IFooService" name="fooServiceEndpoint" />
<!-- Add Other endpoints as required -->

<!-- Staging Server End Points - Used Occasionaly
<endpoint address="http:[Path to STAGING Server service]"
binding="basicHttpBinding" bindingConfiguration="fooServiceEndpoint"
contract="FooService.Proxy.IFooService" name="fooServiceEndpoint" />
<other end points here too />
-->

<!-- LIVEServer End Points - Used Rarely and with CAUTION
<endpoint address="http:[Path to LIVE Server service]"
binding="basicHttpBinding" bindingConfiguration="fooServiceEndpoint"
contract="FooService.Proxy.IFooService" name="fooServiceEndpoint" />
<other end points here too />
-->
</client>
</system.serviceModel>

现在,您可以简单地用注释修改Web配置,这取决于您要在哪个服务器上进行调试
6设置web.config转换以进行部署
在解决方案资源管理器中展开web.config节点。
打开 web.staging.config文件并添加以下内容:
<system.serviceModel>
<client>
<endpoint address="http:[Path to STAGING server Service]"
binding="basicHttpBinding" bindingConfiguration="fooServiceEndpoint"
contract="FooService.Proxy.IFooService" name="fooServiceEndpoint" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
</client>
<!-- Repeat for additional end points -->
</system.serviceModel>

现在,将其添加到 Web.Release.Config,将路径更改为LIVE服务器路径。现在,使用VisualStudio publish命令发布时,它将使用适当的端点。
例如。如果要部署网站的STAGING版本,请从“构建配置”下拉列表中选择“暂存”。右键单击解决方案展开器中的WebSite项目,然后选择“发布”。选择您希望的发布方式,然后单击“发布”按钮。然后将重新构建整个解决方案,从登台服务器生成代理,并使用登台设置发布web.config文件。
就是这样,您完成了
现在,您将具有将基于您的构建配置生成的代理,一个位置,该位置可通过注释(用于调试目的)更改路径,以及在发布时自动进行web.config更新。
更新资料
OP的Gaui创建了一个小exe,可简化此操作。在 GitHub上可用

关于asp.net - 在.NET中管理多个服务引用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23330435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com