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





5.00/5 (5投票s)
如何使 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。 您可以看到您的项目正在运行,无需重新部署。
结尾
您可以下载本文随附的源代码。 希望本文能帮助您在不同的服务器上部署解决方案。
如果您能对文章进行投票,并提出任何意见或疑虑,或如何改进,我将不胜感激。 期待尽快分享我的新发现。
感谢阅读。