Silverlight: как настроить ServiceReferences.ClientConfig, если он помещен внутри xap

Я использую службу wcf с моим приложением silverlight. Местоположение службы wcf указывается в файле ServiceReferences.ClientConfig и должно быть изменено на место, где установлено приложение.

Однако этот файл включен в файл xap и не может быть легко изменен при развертывании приложения. Есть ли другой способ сделать ссылку на службу wcf из приложения silverlight? Или как вы меняете ServiceReferences.ClientConfig в файле xap?

Ответы

Ответ 1

Могут быть лучшие способы, которые я открыт для использования, но это работает для меня и гибко.

В своем веб-приложении Web.config добавьте переменную в AppSettings и сохраните базовый URL-адрес, обратите внимание, что я не сохраняю местоположение SVC файла, добавлю это позже. Это потому, что у меня есть несколько SVC, на которые я обычно указываю. Вы можете сделать это по-другому.

 <appSettings>
    <add key="ServiceURI" value="http://localhost:64457/"/>
 </appSettings>

В моей веб-странице веб-приложения добавьте параметр под названием InitParms, это позволит вам добавить список ключей, значений пар (разделенных запятой, которая будет считана файлом XAP)

<div id="silverlightControlHost">
    <object data="data:application/x-silverlight," type="application/x-silverlight-2"
        width="100%" height="100%" ID="Xaml1" >
        <param name="InitParams" value="ServiceURI=<%= ConfigurationManager.AppSettings("ServiceURI") %>" />

В Silverlight App.xaml.vb загрузите все InitParm в ресурс или где захотите

    Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
    If e.InitParams IsNot Nothing Then
        For Each k As Generic.KeyValuePair(Of String, String) In e.InitParams
            Me.Resources.Add(k.Key, k.Value)
        Next
    End If

Затем в любом из моих файлов XAML я могу инициализировать службу с помощью настроенного URI, у меня есть такой метод

Private Sub InitializeService()
    Dim uri As String = App.Current.Resources("ServiceURI")
    If uri Is Nothing OrElse uri = String.Empty Then
        'if there is no value added in the web.config, I can fallback to default values
        _client = New ServiceClient
    Else
        'Notice I hardcoded the location of the SVC files in the client and append there here, you may choose not to do this
        Dim uri_withservice As String = uri & "svc/secure/Service.svc"
        _client = New ServiceClient("CustomBinding_Service", New EndpointAddress(uri_withservice))
    End If
End Sub

Ответ 2

Отлично, с этими предложениями мне удалось получить данные WCF ServiceReferences.ClientConfig, которые будут динамически изменяться при запуске приложения, при этом URI службы читается из web.config. Это возможно с помощью преобразований "web.config" в VS2010.

Вот пример web.config.debug, показывающий, как ServiceURI заменяется, когда я выбираю "публиковать" для своего веб-сайта.

<?xml version="1.0"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
     <...>
  </connectionStrings>

  <appSettings>
    <add key="ServiceURI" value="http://my.location.com/myService.svc"
         xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
  </appSettings>
</configuration>

В моей базе web.config у меня есть тот же ключ/значение, указывающий на локальную службу. Не нужно забывать менять ServiceURI каждый раз, когда я развертываю для тестирования/производства. Отлично, я искал это какое-то время.

Ответ 4

Решения, представленные здесь, все непрактичны в том смысле, что вы модифицируете приложение для адаптации к вашим настройкам конфигурации. Эта запись в блоге прибила ее.