65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Silverlight 应用程序中通过 web.config 使 WCF 服务引用可配置

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2012年4月22日

CPOL

2分钟阅读

viewsIcon

393889

downloadIcon

794

如何使 WCF 服务引用对 Silverlight 项目可配置(便于部署在 Dev、QA、UAT 等服务器上)

引言

在这里,我将演示针对常见问题的解决方案,这是大多数开发人员在使用 WCF 服务开发 Silverlight 应用程序时面临的问题。 我搜索了很多论坛,但没有找到任何好的解决方案。 因此,我分享我的解决方案,以使 WCF 服务引用可配置。 这样便于在 Dev、QA、UAT 等服务器上部署,无需修改代码和重新发布。

背景

为了实现此应用程序,我将使用以下技术:

  • 客户端层使用 Silverlight5
  • WCF 服务 - HTTP 绑定
  • WCF RIA 服务 V1.0 SP2

创建 Silverlight 业务应用程序

创建新的 Silverlight 业务应用程序。 将其命名为“BusinessAppMVVM.

WCF 服务

将 WCF 服务添加到解决方案。 将其命名为“BusinessAppMVVM.AppWCFService”。

在“Service1.svc.cs”中编写一个测试方法。

public string GetUserAddress(string value) 
{ 
    return string.Format("You entered: {0}", value); 
} 

为此方法添加合约。

[OperationContract] 
string GetUserAddress(string value); 

要使 Silverlight 控件能够访问另一个域中的服务,该服务必须明确选择允许跨域访问。 我还将 WCF 服务和 Silverlight 应用程序部署在不同的服务器上。

添加“CrossDomainService”服务并将以下代码添加到其中。

public class CrossDomainService : ICrossDomainService 
{ 
    Message ICrossDomainService.ProvidePolicyFile() 
    { 
        FileStream filestream = File.Open(@"ClientAccessPolicy.xml", FileMode.Open); 
        // Either specify ClientAccessPolicy.xml file path properly 
        // or put that in \Bin folder of the console application 
        XmlReader reader = XmlReader.Create(filestream); 
        System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader); 
        return result; 
    } 
}

为此服务创建合约。

[ServiceContract] 
public interface ICrossDomainService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "ClientAccessPolicy.xml")] 
    Message ProvidePolicyFile(); 
} 

添加“ClientAccessPolicy.xml”文件以进行策略描述。

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>

Web 项目

将以下“appsettings”部分添加到“web.comfig”文件。

<appSettings>
<!--QA Server WCF Service URL-->
<!--<add key="WCFServiceURL" value="<a href="http://test-iis-qa:1111/Service1.svc">http://Test-iis-QA:1111/Service1.svc</a />" />-->
<!--Local development WCF Service URL-->
<add key="WCFServiceURL" value="<a href="https://:59761/Service1.svc">https://:59761/Service1.svc</a />" />
</appSettings> 

在此部分中,您可以拥有 WCF 服务部署到的所有服务器的 URL,例如 Dev、QA、UAT 等。只需取消注释要用于 Silverlight 项目中的服务的 URL,而无需修改任何代码。 您无需重新部署。

我将添加 RIA 服务以将此 URL 值传递给 Silverlight 项目。

添加 RIA 服务 Web 项目中的“BusinessAppRIAService”。

将以下方法添加到您的新 RIA 服务中。

[Invoke]
public string GetWCFServiceAddress()
{
    string url = ConfigurationManager.AppSettings.Get("WCFServiceURL");
    return url;
}

Silverlight 客户端

将服务引用添加到 Silverlight 项目。

在“app.xaml.cs”中声明属性。

public string WCFServiceURL { get; set; }

编写以下行以调用 RIA 服务以在“Application_UserLoaded”中获取“WCFServiceURL”值。

//Call RIA Service to get WCF Service URL
var context = new BusinessAppMVVM.Web.Services.BusinessAppRIAContext();
context.GetWCFServiceAddress(GetWCFServiceURLCompleted, null);

将“GetWCFServiceURLCompleted”定义如下。

private void GetWCFServiceURLCompleted(InvokeOperation<string> args)
{
try
{
    WCFServiceURL = args.Value;
}
catch (Exception ex)
{
    //log
}
}


现在您可以编写测试代码来调用 WCF 服务了。 将按钮控件添加到“Home.xaml”。 在按钮单击事件中编写以下代码行。

private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
{
    //Create Instance.
    BusinessAppServiceModel.Service1Client _serviceClient = null;
    if (_serviceClient == null)
    {
        var myBinding = new BasicHttpBinding();
        string url = ((App)Application.Current).WCFServiceURL;
        if (url != null)
        {
        var address = new EndpointAddress(url);
        _serviceClient = new BusinessAppServiceModel.Service1Client(myBinding, address);
        }
        else
        {
        MessageBox.Show("WCF Service URL is not found.");
        }
    }
    //Call Service
    _serviceClient.GetUserAddressCompleted -=
    new EventHandler<GetUserAddressCompletedEventArgs>(OnGetUserAddressCompleted);
    _serviceClient.GetUserAddressCompleted +=
    new EventHandler<GetUserAddressCompletedEventArgs>(OnGetUserAddressCompleted);
    _serviceClient.GetUserAddressAsync("Called from UI");
}
private void OnGetUserAddressCompleted(object sender, GetUserAddressCompletedEventArgs e)
{
    MessageBox.Show(e.Result);
}


部署 Silverlight 和 WCF 服务。 转到 Web.config 以更改服务 URL。 您可以看到您的项目正在运行,无需重新部署。

结尾

您可以下载本文随附的源代码。 希望本文能帮助您在不同的服务器上部署解决方案。

如果您能对文章进行投票,并提出任何意见或疑虑,或如何改进,我将不胜感激。 期待尽快分享我的新发现。

感谢阅读。

© . All rights reserved.