设为首页 收藏本站
查看: 830|回复: 0

[经验分享] WCF学习笔记(4)——宿主iis部署wcf

[复制链接]

尚未签到

发表于 2015-8-12 11:26:30 | 显示全部楼层 |阅读模式
本文将部署一个wcf+silverlight简单实例,以下是详细步骤:
  (环境:服务端win2003,iis6.0,asp.net4.0;客户端winXP,iis5.1,vs2010,silverlight4.0)

  
  1.新建一个解决方案,方案中新建一个网站(选择wcf服务)
DSC0000.jpg
  再新建一个wcf服务库
DSC0001.jpg
  此时解决方案结构如下:
DSC0002.jpg

  2.删除WCFService.App_code自带的IService.cs,Service.cs,然后添加引用我们自定义的wcf服务库WcfServiceLibrary1
DSC0003.jpg
  打开WCFService宿主网站的Service.svc文件,内容如下:



<%@ ServiceHost Language="C#" Debug="true" Service="Service" CodeBehind="~/App_Code/Service.cs" %>
  由于我们删除了vs自动生成的文件,改用我们自定义的wcf服务库文件,所以将以上代码修改为:(删除掉CodeBehind,修改Service为我们自定义的wcf服务库中,默认生成的Service1服务契约



<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary1.Service1" %>
  接下来设置一下我们的WCFService宿主的配置文件Web.config,可以使用编辑WCF配置工具,方便我们的设置
DSC0004.jpg
  打开设置工具,首先新建一个服务
DSC0005.jpg
  找到我们添加引用过来的wcf服务(宿主网站引用的服务.dll一般在Bin文件夹下,如果你添加后没有看到它,试着重新生成以下解决方案
DSC0006.jpg
  选择我们的模式,由于本例后面将用silverlight程序和wcf通信,宿主也将选择iis,所以选择基于http的模式
DSC0007.jpg
  终结点可以选择不填
DSC0008.jpg
  最终获得配置如下:
DSC0009.jpg
  保存设置,我们将会得到自定生成后的Web.config
  当然,为了部署在我们iis之上,必须设置固定一下宿主网站的端口号,并且修改我们的虚拟路径
DSC00010.jpg
  查看我们是否创建服务成功,可以选择在浏览器中查看
DSC00011.jpg
  创建成功,我们将得到一个返回页面(记下这个服务的路径,它将在本例后面添加服务时使用到,本例中的路径:http://localhost:9090/Service.svc
DSC00012.jpg
  

  3.由于我们独立出了wcf服务,将会遇到跨域问题,所以要添加一个跨域文件clientaccesspolicy.xml在宿主网站的根目录下由于我们将用silverlight程序来通信,所以只需要添加一个clientaccesspolicy.xml跨域文件
DSC00013.jpg
  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>
  4.在我们自定义的wcf服务库中,简单写一个wcf服务契约来完成我们的例子吧
  IService1.cs:



namespace WcfServiceLibrary1
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract]
public interface IService1
{
[OperationContract]
string SayHello();
// TODO: 在此添加您的服务操作
    }
}
  Service1.cs:



namespace WcfServiceLibrary1
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
public class Service1 : IService1
{
#region IService1 成员
public string SayHello()
{
return "Hello WCF";
}
#endregion
}
}
  5.接下来我们新建一个silverlight程序,用来和wcf服务通信吧
  在解决方案中,新建一个silverlight程序
DSC00014.jpg
  由于本例中,我们将分开独立的发布部署wcf服务和silverlight演示网站,所以注意选择新建的silverlight时,要新建一个Web项目安置,而不要选择安置在wcf服务的寄宿网站中(无需启用WCF RIA服务)
DSC00015.jpg
  此时得到解决方案结构如下:
DSC00016.jpg

  6.然后我们来完善我们的silverlight程序来完成和wcf服务的通信吧
  首先在silverlight程序添加服务引用
DSC00017.jpg
  这里的地址我们填写前面测试wcf服务布置成功与否时,返回成功页面上的地址,本例如下:
DSC00018.jpg
  确定添加后,得到解决方案结构如下:
DSC00019.jpg
  vs2010为我们自动生成了服务引用ServiceReference1,和配置文件ServiceReferences.ClientConfig(如果你足够仔细,一定发现了我们在地址中使用了localhost的本机地址,本机的地址满足我们在本机开发环境下正常调试即可,而我们将会在稍后部署到服务端服务器的iis上时,再做修改
  简单的设置一下本例的展示界面吧:
DSC00020.jpg
  一个button,一个textblock,简约却也清楚不是嘛,在button1的点击事件中,添加代码如下:



        private void button1_Click(object sender, RoutedEventArgs e)
{
//绑定模式为基本http模式
Binding binding = new BasicHttpBinding();
//终结点地址
EndpointAddress endPoint = new EndpointAddress("http://localhost:9090/Service.svc");
//设置终结点,包括模式和地址
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(binding, endPoint);
//设置调用异步调用完成返回成功的执行方法
client.SayHelloCompleted += new EventHandler<ServiceReference1.SayHelloCompletedEventArgs>(client_SayHelloCompleted);
//异步调用
            client.SayHelloAsync();
}
void client_SayHelloCompleted(object sender, ServiceReference1.SayHelloCompletedEventArgs e)
{
this.textBlock1.Text = e.Result;
}
  点击button1,我们将发出和wcf服务的通信,等待wcf服务返回的结果,演示在textblock1上,重新生成一下解决方案,F5运行一下,看看效果吧:
DSC00021.jpg
  仔细的你一定会发现,同时起来的还有一个WCF服务主机的窗口,如果WCF服务通信有问题的话,你可以在这里查看异常
DSC00022.jpg

  
  7.OK,开心的看着我们的wcf+silverlight的程序已经调试成功了,觉得这还是挺简单的,但是别忘了,我们的项目还没有部署呢,离最后的上线还有一个重要的步骤,那就是在服务器上的部署
  首先把我们的解决方案中的两个Web项目发布一下(一个wcf服务宿主Web,一个silverlight寄宿Web,因为winXP环境下,只能安装iis5.1(iis5.1 只能发布一个网站)所以我们每次只能发布一个,step by step吧
DSC00023.jpg
DSC00024.jpg
  每次发布生成的文件(本例采用文件系统发布在本机的D:\www下),我们分别保存下来,然后放置到服务器上
  ok,来看一下我们的服务端的iis配置吧
DSC00025.jpg
  ServiceTest:安置我们的wcf服务宿主网站,注意端口选择我们之前约定好固定的9090
DSC00026.jpg
  asp.net版本4.0
DSC00027.jpg
  SilverlightTest:安置我们的Silverlight寄宿网站,同样的设置asp.net版本4.0iis6.0中,需设置端口,本例的Silverlight寄宿网站端口设8080,服务端ip为192.168.1.131,局域网内访问
  ok,在客户端访问一下我们的成果吧
  首先输入wcf服务的地址,查看返回结果
   DSC00028.jpg
  
  You have created a service!看来我们的wcf服务布置成功了,接着我们访问一下演示用的silverlight吧
DSC00029.jpg
  如果rp不走运的话,会发现有返回的异常,内容如下:



消息: Unhandled Error in Silverlight Application 操作过程中出现异常,结果无效。有关异常的详细信息,请查看 InnerException。   位于 System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
位于 SilverlightApplication1.ServiceReference1.SayHelloCompletedEventArgs.get_Result()
位于 SilverlightApplication1.MainPage.client_SayHelloCompleted(Object sender, SayHelloCompletedEventArgs e)
位于 SilverlightApplication1.ServiceReference1.Service1Client.OnSayHelloCompleted(Object state)
  分析一下说明,问题出在silverlight调用wcf服务时出错但是你如果返回正常,那一定是因为你本机的9090端口wcf没关吧
DSC00030.jpg
  问题出在silverlight调用wcf时,使用的服务地址当时我们用的是localhost,之前由于是在本机调试,服务端客户端在同一台主机,他们的地址都是localhost,所以问题没有出现,但是silverlight程序是需要客户端下载到本地去执行的,当我们试图访问放置在真正服务端上的服务时,当然只能去找本机端口的wcf服务,而我们真正的想法是让它去找服务器端口下的wcf服务
  知道了问题所在,开始修改一下我们的silverlight程序吧
  首先修改一下我们的silverlight程序引用的wcf服务的地址吧:
   DSC00031.jpg
  
  这次我们使用服务端的ip地址(本例中服务器ip为192.168.1.131)
DSC00032.jpg
  同时修改一下我们button1按键事件:



        private void button1_Click(object sender, RoutedEventArgs e)
{
//绑定模式为基本http模式
Binding binding = new BasicHttpBinding();
//终结点地址
//EndpointAddress endPoint = new EndpointAddress("http://localhost:9090/Service.svc");
EndpointAddress endPoint = new EndpointAddress("http://192.168.1.131:9090/Service.svc");
//设置终结点,包括模式和地址
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(binding, endPoint);
//设置调用异步调用完成返回成功的执行方法
client.SayHelloCompleted += new EventHandler<ServiceReference1.SayHelloCompletedEventArgs>(client_SayHelloCompleted);
//异步调用
            client.SayHelloAsync();
}
  这样silverlight程序在调用wcf服务时,就会去真正的服务端查找了(可以先把localhost地址注释掉,因为我们本机客户端的ip地址是不可以和服务端的ip相同的,我们还是会用到localhost来调试程序的
  ok,重新生成一下我们的解决方案,将修改过后的silverlight寄宿网站放到服务器上,再次访问一下,问题解决,结果如下:
DSC00033.jpg

  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-97877-1-1.html 上篇帖子: IIS 内部运行机制 下篇帖子: 如何制作一个 https 网站?IIS配置HTTPS服务的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表