微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Silverlight中动态获取Web Service地址

Silverlight中动态获取Web Service地址

发布:dxy 字体:[增加 减小] 类型:转载

开发过Silverlight应用的朋友们相信都会遇到这样一个问题
在使用WCF或者WS进行数据库操作的时候都需要有一个明确的服务地址,如果是WCF就是svc文件地址。初学者通常会直接使用VS的Add Service Reference来添加引用。这的确是十分方便的手段,但是这样会带来什么样的麻烦呢?

  第一,在开发的阶段一旦改变了WS文件的目录结构就必须改变SL工程中的WS地址,而且这种改变并不是单纯的Update Service Reference这么简单,因为地址已经改变了,你必须删掉旧的Reference来添加新的Reference,这是其一。

  第二, 当项目开发完成要部署上去服务器时大问题就来了。如果在开发的时候是用VS的Add Service Reference来添加引用的话,系统会自动生成一个ServiceReferences.ClientConfig配置文件,里面记录着WS的地址和缓存、连接时长之类的信息,要命的是这个配置文件是连同SL工程一并打包进xap文件里面的,也就是说一旦项目部署到了服务器上之后就不能再改WS的地址了。这对项目的迁移,服务器IP地址的变动都带来十分不利的影响。

这里介绍一种动态获取WS地址的方法,这种方法不依赖于 ServiceReferences.ClientConfig文件。虽然说不依赖于配置文件,但是开发者仍然需要使用VS的Add Service Reference来添加一次引用,用于生成SL端的操作代码。好了,进入正题,下面是用于生成WSClient的类

复制代码 代码如下:
public class ServiceUtil
{
public static string SVCPath { set; get; }

/// <summary>
/// Get Data Service path
/// </summary>
/// <returns>path</returns>
public static WorkflowServiceClient GetDynamicclient()
{
if (SVCPath == null)
throw new Exception("Wrong SVC Path!");

BasicHttpBinding binding = new BasicHttpBinding(Application.Current.Host.source.Scheme.Equals("https",StringComparison.InvariantCultureIgnoreCase) ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
binding.MaxReceivedMessageSize = int.MaxValue;
binding.MaxBufferSize = int.MaxValue;

return new WorkflowServiceClient(binding,new EndpointAddress(new Uri(Application.Current.Host.source,SVCPath)));
}
}


上面ServiceUtil类中有一个静态的字符串变量,用来保存WS文件路径;然后下面的GetDynamicclient方法就是把SL应用的宿主网站uri与WS文件路径组合起来形成完整的WS引用URL。这里这个静态变量SVCPath通常是在使用WS操作前赋值,而具体的值可以通过网站Web.config文件的appsetting中字段中传过来,至于怎么在SL工程中获取aspx页面的参数的问题,我在上一篇随笔中有写到,大家可以参考一下。
详细出处参考:http://www.jb51.net/article/21038.htm

//--------------------------------------------------------------
技巧:Silverlight应用程序中如何获取ASP.NET页面参数

概述

  在开发Silverlight应用程序时,我们经常会遇到这样一种情况,需要在Silverlight应用程序的UserControl中获取ASP.NET页面参数,这个参数不一定来自于当前Silverlight应用程序的宿主页面,而有可能来自于其它的ASP.NET页面

  需求

  如下面的项目结构,我们会在Default.aspx页面中需要传递两个值到SilverlightTestPage.aspx页面,并且需要在SilverlightTestPage.aspx页面所宿主的Silverlight应用程序中获取显示

 

  其中Default.aspx页面看起来如下图所示:

 

  在单击Submit按钮时,转向SilverlightTestPage.aspx页面,并传递两个参数,如下代码所示:

protected void btnSubmit_Click(object sender,EventArgs e)
{
  Response.Redirect(String.Format(SilverlightTestPage.aspx?username={0}email={1},
    this.txtUserName.Text,
    this.txtEmail.Text));
}使用InitParams

  第一种方法,我们自然会使用InitParams属性,在Silverlight宿主页面加载时,我们在ASPX页面获取参数,并作为初始化参数传递给Silverlight应用程序,如下代码所示:

protected void Page_Load(object sender,EventArgs e)
{
  this.Xaml1.InitParameters = String.Format(username={0},email={1},
    Request.QueryString[username],
    Request.QueryString[email]);
}

  然后在Silverlight应用程序的UserControl中设置两个属性,如下代码所示:

public String UserName
{
  set {
    this.lblUserName.Text = value;
  }
}
public String Email
{
  set {
    this.lblEmail.Text = value;
  }
}

  这样就可以在Application_Startup事件中获取初始化参数,并传递给UserControl,如下代码所示:

private void Application_Startup(object sender,StartupEventArgs e)
{
  Page page = new Page();
  page.UserName = e.InitParams[username];
  page.Email = e.InitParams[email];
  this.RootVisual = page;
}

  这样我们就通过InitParams来在Silverlight应用程序中获取到了ASP.NET页面的参数,运行后效果如下图所示:

 

  使用HtmlDocument

  其实上面的方法获取ASP.NET页面中参数有些麻烦,我们可以直接使用HtmlDocument,在HtmlDocument中定义了QueryString属性,如下代码所示:

 

  这样我们可以在Silverlight直接使用HtmlDocument对象来获取当前Silverlight应用程序宿主页面中的参数,如下代码所示:

void Page_Loaded(object sender,RoutedEventArgs e)
{
  IDictionaryString,String paras = HtmlPage.Document.QueryString;
  this.lblUserName.Text = paras[username];
  this.lblEmail.Text = paras[email];
}

  运行后可以看到与上面的效果一致:

 

  总结

  本文的内容非常简单,介绍了如何在Silverlight应用程序中获取ASP.NET页面参数,希望对大家有所帮助。

 

 

//------------------------------------------------------------------
asp.net Silverlight应用程序中获取载体aspx页面参数
详细出处参考:http://www.jb51.net/article/21039.htm

有时候SL应用中需要使用由aspx页面中传递过来的参数值,此时通常有两种方法获取

1. 使用InitParameters属性,动态设置传递参数 。
2. 在SL工程中使用HtmlPage类来直接获取页面参数。
下面是利用HtmlPage类来获取参数的代码
复制代码 代码如下:
void Page_Loaded(object sender,RoutedEventArgs e){
IDictionary<String,String> paras = HtmlPage.Document.QueryString;
this.lblUserName.Text = paras["username"];
this.lblEmail.Text = paras["email"];}

详细出处参考:http://www.jb51.net/article/21039.htm

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐