在构建应用程序时,它通常部署在不同的环境(测试,开发,生产)中,因此端点地址在变化。由于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>之前,将Transformation规则添加到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>

它的作用是根据您的配置在相应的servicereferences文件中查找,并使用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>

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

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

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

10-17 01:04