由于我以前写的有关地图服务以及WCF、WebService的访问都是手工配置的,这样部署的时候麻烦,以后维护的时候也很复杂。
1 .Silverlight读取Web.config
以前所做的有关配置都是读取web.config 文件的,可是silverlight不能直接读取Web.config文件,对于这个问题我找过相关的例子,根据例子参考尝试了几次还是不对。还有一种思路就是在wcf中读取Web.Config文件,然后silverlight调用wcf服务,可是关键问题是wcf服务也得动态访问啊,如果这样是可以,可是感觉还是琐碎,给人一种乱七八糟的感觉,有时候我感觉都很乱。之后看了相关的资料,在首页Default.aspx页面中用Literal控件,代码是 <asp:Literal ID="InitParams" runat="server"></asp:Literal>。(Literal 最常用于向页面中动态添加内容。)Default.aspx.cs中写这样一个方法 private void InitDefaultSettings(Literal defaultLit)
{
NameValueCollection appSettings = ConfigurationManager.AppSettings;
StringBuilder SB = new StringBuilder();
SB.Append("<param name=/"InitParams/" value=/"");
int SettingCount = appSettings.Count;
for (int Idex = 0; Idex < SettingCount; Idex++)
{
SB.Append(appSettings.GetKey(Idex));
SB.Append("=");
SB.Append(appSettings[Idex]);
SB.Append(",");
}
SB.Remove(SB.Length - 1, 1);
SB.Append("/" />");
InitParams.Text = SB.ToString();
}读取相关参数的值。然后在 App.xaml.cs中定义属性 public IDictionary<string, string> DefaultSetting;
在
private void Application_Startup(object sender, StartupEventArgs e)
{
DefaultSetting = e.InitParams;//添加的代码
this.RootVisual = new MainPage();
}
之后新建一个ConfigManager类,去读取相应的配置。读取的方式
private ConfigManager()
{
App currentApp = (App)Application.Current;
/**-------------wyp-------------**/
if (currentApp.DefaultSetting.ContainsKey("BaseLayer"))//GIS地图服务的url
{
string BaseLayer = currentApp.DefaultSetting["BaseLayer"];
}
}之后便可以获取其值。
2.Silverlight动态访问Wcf服务
以前对有关WCF的调用都是在vs中直接引用的,就会自动生成配置文件ServiceReferences.ClientConfig。可是这样部署的时候就很麻烦的。之后就想到动态调用WCF。刚开始我所理解的动态调用就不用去引用了,直接配置就行了,所以看到好多例子就是有些犯糊涂,不是动态的调用吗?怎么都是这样的啊。之后别人也给过类似的代码,我才发现自己的理解有差错,动态调用的话是不用ServiceReferences.ClientConfig这个文件,可以直接删掉,但是还是必须引用服务。具体的思路就是在Silverlight中新建一个类,写一个方法去读取配置文件中的相关配置,测试了改我机器的ip值,访问也没有问题。
核心的代码/// <summary>
/// 动态创建WCF客户端
/// </summary>
/// <returns></returns>
public static GIS.WCFServiceRef.WCFServiceClient GetWCFDynamicClient()
{
try
{
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
httpTransport.MaxReceivedMessageSize = 2147483647;
httpTransport.MaxBufferSize = 2147483647;
BinaryMessageEncodingBindingElement binaryEle = new BinaryMessageEncodingBindingElement();
CustomBinding binding = new CustomBinding(binaryEle, httpTransport);
binding.Name = "CustomBinding_WCFService";
//--测试用WCF地址
Uri testuri = new Uri(ConfigManager.Instance.WcfUrl);//wcf的地址
GIS.WCFServiceRef.WCFServiceClient client=new GIS.WCFServiceRef.WCFServiceClient(binding, new EndpointAddress(testuri));
return client;
}
catch
{
MessageBox.Show("生成WCF服务时出错,请联系管理员修复此问题!","消息提示",MessageBoxButton.OK);
return null;
}
}
呵呵 这两个问题终于搞定了,这两个问题很典型,估计好多做部署的时候都会遇到这样的问题。开始做我其他的工作啦!