Maison > base de données > tutoriel mysql > Silverlight通过httpBinding访问IIS宿主WCF

Silverlight通过httpBinding访问IIS宿主WCF

WBOY
Libérer: 2016-06-07 15:11:03
original
1232 Les gens l'ont consulté

silverlight和wcf通信是大家开发中用得相对较多的东西,我以Silverlight 通过 httpBinding 访问 IIS 宿主 WCF 来简单介绍一下。 Silverlight 通过 httpBiding方式 访问 IIS 宿主 WCF是我们在Silverlight与WCF通信中最为常见的,也是用的最多的,我们用个很简

silverlight和wcf通信是大家开发中用得相对较多的东西,我以Silverlight通过httpBinding访问IIS宿主WCF 来简单介绍一下。

Silverlight通过httpBiding方式访问IIS宿主WCF是我们在Silverlight与WCF通信中最为常见的,也是用的最多的,我们用个很简单的例子进行演示。

项目结构:

项目目结构简单说明:

程序集名称 需添加的引用 简要说明
LxContracts System.Runtime.Serialization System.ServiceModel 用于存放操作契约与数据契约
LxServices LxContracts[项目] 服务,操作契约的实现
WcfHost.web LxContracts[项目] 和LxServices[项目] 利用Svc文件发布服务的站点
SilverlightDemo   Silverlight程序,调用WCF服务

 

注意:建立Silverlight程序的时候,不需要承载网站,建立一个单一的Silverlight程序即可,这样做的原因是,把Silverlight和WCF服务不放到同一个站点下面,是为了演示跨域的问题。

代码实现:

类库LxContracts:(包括数据契约Student.cs和操作契约IStudent.cs)

Student.cs 代码

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
 代码如下 复制代码
using<span> System;
</span>using<span> System.Collections.Generic;
</span>using<span> System.Linq;
</span>using<span> System.Text;
</span>using<span> System.ServiceModel;
</span>using<span> System.Runtime.Serialization;

</span>namespace<span> LxContracts
{
    [DataContract]
    </span>public class<span> Student
    {
        </span>/// <summary>
        ///<span> 学生编号
        </span>/// </summary>
<span>        [DataMember]
        </span>public int StuId { get; set<span>; }

        </span>/// <summary>
        ///<span> 学生姓名
        </span>/// </summary>
<span>        [DataMember]
        </span>public string StuName { get; set<span>; }

        </span>/// <summary>
        ///<span> 所在班级
        </span>/// </summary>
<span>        [DataMember]
        </span>public string ClassName { get; set<span>; }

        </span>/// <summary>
        ///<span> 联系电话
        </span>/// </summary>
<span>        [DataMember]
        </span>public string TelPhoneNum { get; set<span>; }
    }
}</span>
Copier après la connexion
Student.cs 代码

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
 代码如下 复制代码
using<span> System;
</span>using<span> System.Collections.Generic;
</span>using<span> System.Linq;
</span>using<span> System.Text;
</span>using<span> System.Runtime.Serialization;
</span>using<span> System.ServiceModel;

</span>namespace<span> LxContracts
{
    [ServiceContract]
    </span>public interface<span> IStudent
    {
        [OperationContract]
        List</span><student><span> GetStudent();
    }
}</span></student>
Copier après la connexion
类库LxServices:( 改类库包括一个模仿获取数据库集合类StudentList.cs和服务类StudentService.cs)

StudentList.cs

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
 代码如下 复制代码
using<span> System;
</span>using<span> System.Collections.Generic;
</span>using<span> System.Linq;
</span>using<span> System.Text;
</span>using<span> LxContracts;

</span>namespace<span> LxServices
{
    </span>public class StudentList:List<student><span>
    {
        </span>public<span> StudentList()
        {
            </span>this.Add(new Student() { StuId = 1, StuName = "小明", ClassName = "计算机一班", TelPhoneNum = "123456"<span> });
            </span>this.Add(new Student() { StuId = 2, StuName = "小红", ClassName = "计算机二班", TelPhoneNum = "234567"<span> });
            </span>this.Add(new Student() { StuId = 2, StuName = "小兰", ClassName = "计算机三班", TelPhoneNum = "890123"<span> });
        }
    }
}</span></student>
Copier après la connexion
StudentService 代码

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
 代码如下 复制代码
using<span> System;
</span>using<span> System.Collections.Generic;
</span>using<span> System.Linq;
</span>using<span> System.Text;

</span>using<span> LxContracts;

</span>namespace<span> LxServices
{
    </span>public class<span> StudentService:IStudent
    {
        </span>public List<student><span> GetStudent()
        {
            </span>//<span>实际情况应该为从数据库读取
            </span>//本例手动生成一个StudentList
            StudentList ListStuent = new<span> StudentList();
            </span>return<span> ListStuent;
        }
    }
}</span></student>
Copier après la connexion
站点WcfHost.web

站点WcfHost.web,这是一个Asp.net 空web应用程序。

1、右击” WcfHost.web”—“添加”—“新建项”—“wcf服务”,命名为”StudentSrv.svc” 。如图:

在项目中删除”StudentSrv.svc.cs”文件和”IStudentSrv.cs”文件。右击”StudentSrv.svc”文件,选择”查看标记”,将代码修改为:

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

 2、修改webconfig 文件,代码如下:

WebConfig

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
 代码如下 复制代码
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetframework="4.0"></compilation>
  </system.web>
  <system.servicemodel>
    <behaviors>
      <servicebehaviors>
        <behavior name="LxBehavior">
          <servicemetadata httpgetenabled="true"></servicemetadata>
          <servicedebug includeexceptiondetailinfaults="false"></servicedebug>
        </behavior>
      </servicebehaviors>
    </behaviors>
    <services>
      <service name="LxServices.StudentService" behaviorconfiguration="LxBehavior">
        <endpoint address="" binding="basicHttpBinding" contract="LxContracts.IStudent"></endpoint>
      </service>
    </services>
    <!--关闭 ASP.NET 兼容性模式-->
    <servicehostingenvironment aspnetcompatibilityenabled="false"></servicehostingenvironment>
  </system.servicemodel>
</configuration>
Copier après la connexion
注意:endpoint中的address 为空:因为svc文件的地址就是元数据发布的地址。

3、右击”StudentSrv.svc”文件,在”浏览器中查看”,显示如下图,说明服务已经部署好了,我用的端口是 9090:

在Silverlight中进行调用:

Silverlight调用wcf很简单,直接在”SilverlightDemo”中添加”服务引用即可”,Silverlight项目中会自动生成” ServiceReferences.ClientConfig”配置文件,当然也可以利用代码的方式调用,但是我比较懒 :)。

1、为Silverlight程序添加WCF:

   “右击”—“SiverlightDemo”—“添加服务引用”—“输入服务地址”(我的是http://localhost:9090/WCF/StudentSrv.svc)--点击“前往”,就会找到服务,命名为“WCF.StudentSrv”后,点击“确定”

2、在Silverlight中调用WCF:

MainPage.xaml中添加”DataGrid”控件,xaml代码如下:

MainPage.xaml 代码

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
 代码如下 复制代码
<datagrid x:name="dgStudnet" grid.row="0" autogeneratecolumns="False">
            <datagrid.columns>
                <datagridtextcolumn header="学生编号" width="80" binding="{Binding StuId}"></datagridtextcolumn>
                <datagridtextcolumn header="学生姓名" width="100" binding="{Binding StuName}"></datagridtextcolumn>
                <datagridtextcolumn header="所在班级" width="120" binding="{Binding ClassName}"></datagridtextcolumn>
                <datagridtextcolumn header="电话号码" width="100" binding="{Binding TelPhoneNum}"></datagridtextcolumn>
            </datagrid.columns>
        </datagrid>
Copier après la connexion
MainPage.cs 代码

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
 代码如下 复制代码

public partial class<span> MainPage : UserControl
    {
        ObservableCollection</span><student><span> listStudent;
        </span>public<span> MainPage()
        {
            InitializeComponent();
            listStudent </span>= new ObservableCollection<student><span>();
            </span>this.Loaded += new<span> RoutedEventHandler(MainPage_Loaded);
        }

        </span>void MainPage_Loaded(object<span> sender, RoutedEventArgs e)
        {
            StudentClient proxyClient </span>= new<span> StudentClient();
            proxyClient.GetStudentAsync();
            proxyClient.GetStudentCompleted </span>+= new EventHandler<getstudentcompletedeventargs><span>(proxyClient_GetStudentCompleted);
        }

        </span>void proxyClient_GetStudentCompleted(object<span> sender, GetStudentCompletedEventArgs e)
        {
            </span>if (e.Error == null<span>)
            {
                listStudent </span>=<span> e.Result;
                </span>this.dgStudnet.ItemsSource =<span> listStudent;
            }
        }
    }</span></getstudentcompletedeventargs></student></student>
Copier après la connexion

 

运行结果:

将” SilverlightDemo”设置为启动项目,运行,会产生下面的异常:

这就是因为当时建立项目的时候没有把Silverlight程序和WCF服务放到同一个站点的缘故,因此需要在发布WCF的网站根目录放置一个跨域文件:clientaccesspolicy.xml

clientaccesspolicy.xml

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

再次运行,结果如下图所示:

至此,Silverlight通过httbBingding方式访问IIS宿主的WCF的演示我们就进行到这里

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal