gpt4 book ai didi

c# - ServiceReferences.ClientConfig 中的动态端点

转载 作者:可可西里 更新时间:2023-11-01 03:05:10 25 4
gpt4 key购买 nike

在构建应用程序时,它通常会部署在不同的环境(测试、开发、生产)中,因此端点地址会发生变化。由于 ServiceReferences.ClientConfig 是作为 Silverlight 的 .xap 文件的一部分构建的,因此在构建解决方案后很难更改端点,而 web.config 经常这样做。

我已经搜索了很多,但我无法弄清楚这里的最佳做法是什么,所以我的问题是:

在 silverlight 中动态 wcf 端点地址配置的最佳实践是什么?

澄清一下,根据应用所在的服务器(测试、开发、生产),端点会发生变化:

  <endpoint
name="MyService"
address="http://testserv/MyService.svc"
binding="basicHttpBinding"
bindingConfiguration="MybasicHttpBinding"
contract="MyApp.MyService"
/>

<endpoint
name="MyService"
address="http://prodserv/MyService.svc"
binding="basicHttpBinding"
bindingConfiguration="MybasicHttpBinding"
contract="MyApp.MyService"
/>

在某种程度上,我需要 silverlight 客户端知道要使用哪个,这取决于它所在的服务器/编译的版本。

最佳答案

阅读 sLedgem 的帖子并进行一些谷歌搜索后,我找到了使 ServiceReferences 像 web.config 一样运行的完美解决方案。

首先:手动创建不同的文件;

ServiceReferences.Debug.ClientConfig
ServiceReferences.Release.ClientConfig

如果您在 Visual Studio 中有两个以上的默认配置,您也可以添加自己的配置。

第二个:在Project.csproj文件中添加文件依赖(在文本编辑器中打开项目文件):

  <ItemGroup>
<None Include="Properties\AppManifest.xml" />
<Content Include="ServiceReferences.ClientConfig">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="ServiceReferences.Debug.ClientConfig">
<DependentUpon>ServiceReferences.ClientConfig</DependentUpon>
</Content >
<Content Include="ServiceReferences.Release.ClientConfig">
<DependentUpon>ServiceReferences.ClientConfig</DependentUpon>
</Content >
</ItemGroup>

现在,当您重新加载项目时,您将在解决方案资源管理器中看到 ServiceReferences.Release.ClientConfig 是可展开的,当您展开它时,您将看到 Release 和 Debug 文件。

第三:在关闭之前将转换规则添加到项目文件中</Project>

(同样,在文本编辑器中打开它)

<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Other similar extension points exist, see Microsoft.Common.targets. -->
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="exists('ServiceReferences.$(Configuration).ClientConfig')">
<!-- Generate transformed ServiceReferences config in the intermediate directory -->
<TransformXml Source="ServiceReferences.ClientConfig" Destination="$(IntermediateOutputPath)$(TargetFileName).ClientConfig" Transform="ServiceReferences.$(Configuration).ClientConfig" />
<!-- Force build process to use the transformed configuration file from now on. -->
<ItemGroup>
<ServiceReferencesConfigWithTargetPath Remove="ServiceReferences.ClientConfig" />
<ServiceReferencesConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).ClientConfig">
<TargetPath>$(TargetFileName).ClientConfig</TargetPath>
</ServiceReferencesConfigWithTargetPath>
</ItemGroup>
</Target>

它所做的是根据您的配置查看相应的服务引用文件,并使用 web.config 使用的相同 TransformXML 库复制/替换代码。

例子:

在我的 ServiceReferences.ClientConfig 中有以下代码:

  <endpoint name="ICatalogueService" 
address="address"
binding="basicHttpBinding"
bindingConfiguration="My_basicHttpBinding"
contract="Services.ServiceInterfaces.ICatalogueService"/>

ServiceReferences.Release.ClientConfig:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.serviceModel>
<client>
<endpoint
name="ICatalogueService"
address="http://server/Services/CatalogueService.svc"
binding="basicHttpBinding"
bindingConfiguration="My_basicHttpBinding"
contract="Services.ServiceInterfaces.ICatalogueService"
xdt:Transform="Replace" xdt:Locator="Match(name)" />
</client>
<extensions />
</system.serviceModel>
</configuration>

如您所见,端点将被替换,并在名称属性上完成匹配。

如果您有任何问题,请告诉我:)

关于c# - ServiceReferences.ClientConfig 中的动态端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7360533/

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