Silverlightで自身のURLを取得するには?

その手があったかー!!
How does my Silverlight app finds it’s web services? « IgorShare Thoughts and Ideas

Uri docUri = HtmlPage.Document.DocumentUri;
Uri svcUri = new Uri(docUri, "ServiceAdress.svc");

どういうことかというと

SilverlightクライアントがWebサイトにアクセスする場合、それが自分と同じドメインであっても以下のように完全なURLで指定する必要がある。

var webClient = new WebClient();
webClient.DownloadStringAsync(new Uri("http://localhost/hoge.aspx"));

でもこれをハードコーディングしちゃうと配置場所を変える度にこの部分を変更する必要があるので、今までこの値をSiverlightにInitParamsとして渡していた。

SiverlightコントロールをホストするWebフォーム
<asp:Silverlight ID="Silverlight1" runat="server" Version="2.0"
    Height="100%" Width="100%" Source="~/ClientBin/Todo.xap"
    InitParameters="appBase=http://localhost:1100/"
/>

SilverlightページにAppBaseというプロパティを定義しておく。

Page.xaml.cs
public partial class Page : UserControl {
    public string AppBase {
        get;
        set;
    }
}

そしてAppクラスのApplication_StartupイベントハンドラでPageクラスを初期化する時にStartupEventArgs引数のInitParamsプロパティから値を取得して渡す。

App.xaml.cs
private void Application_Startup(object sender, StartupEventArgs e) {
    this.RootVisual = new Page {
        AppBase = e.InitParams["appBase"]
    };
}

でもこれからは「HtmlPage.Document.DocumentUri」でSilverlightコントロールをホストしているHTMLのURLを知ることができるので、こんなことをやる必要がないというお話。