宿主iis部署wcf
本文将部署一个wcf+silverlight简单实例,以下是详细步骤:
(环境:服务端win2003,iis6.0,asp.net4.0;客户端winXP,iis5.1,vs2010,silverlight4.0)
1.新建一个解决方案,方案中新建一个网站(选择wcf服务)

再新建一个wcf服务库

此时解决方案结构如下:

2.删除WCFService.App_code自带的IService.cs,Service.cs,然后添加引用我们自定义的wcf服务库WcfServiceLibrary1

打开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配置工具,方便我们的设置

打开设置工具,首先新建一个服务

找到我们添加引用过来的wcf服务(宿主网站引用的服务.dll一般在Bin文件夹下,如果你添加后没有看到它,试着重新生成以下解决方案)

选择我们的模式,由于本例后面将用silverlight程序和wcf通信,宿主也将选择iis,所以选择基于http的模式

终结点可以选择不填

最终获得配置如下:

保存设置,我们将会得到自定生成后的Web.config
当然,为了部署在我们iis之上,必须设置固定一下宿主网站的端口号,并且修改我们的虚拟路径

查看我们是否创建服务成功,可以选择在浏览器中查看

创建成功,我们将得到一个返回页面(记下这个服务的路径,它将在本例后面添加服务时使用到,本例中的路径:http://localhost:9090/Service.svc)

3.由于我们独立出了wcf服务,将会遇到跨域问题,所以要添加一个跨域文件clientaccesspolicy.xml在宿主网站的根目录下(由于我们将用silverlight程序来通信,所以只需要添加一个clientaccesspolicy.xml跨域文件)

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程序

由于本例中,我们将分开独立的发布部署wcf服务和silverlight演示网站,所以注意选择新建的silverlight时,要新建一个Web项目安置,而不要选择安置在wcf服务的寄宿网站中(无需启用WCF RIA服务)

此时得到解决方案结构如下:

6.然后我们来完善我们的silverlight程序来完成和wcf服务的通信吧
首先在silverlight程序添加服务引用

这里的地址我们填写前面测试wcf服务布置成功与否时,返回成功页面上的地址,本例如下:

确定添加后,得到解决方案结构如下:

vs2010为我们自动生成了服务引用ServiceReference1,和配置文件ServiceReferences.ClientConfig(如果你足够仔细,一定发现了我们在地址中使用了localhost的本机地址,本机的地址满足我们在本机开发环境下正常调试即可,而我们将会在稍后部署到服务端服务器的iis上时,再做修改)
简单的设置一下本例的展示界面吧:

一个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运行一下,看看效果吧:

仔细的你一定会发现,同时起来的还有一个WCF服务主机的窗口,如果WCF服务通信有问题的话,你可以在这里查看异常

7.OK,开心的看着我们的wcf+silverlight的程序已经调试成功了,觉得这还是挺简单的,但是别忘了,我们的项目还没有部署呢,离最后的上线还有一个重要的步骤,那就是在服务器上的部署
首先把我们的解决方案中的两个Web项目发布一下(一个wcf服务宿主Web,一个silverlight寄宿Web),因为winXP环境下,只能安装iis5.1(iis5.1 只能发布一个网站),所以我们每次只能发布一个,step by step吧


每次发布生成的文件(本例采用文件系统发布在本机的D:\www下),我们分别保存下来,然后放置到服务器上
ok,来看一下我们的服务端的iis配置吧

ServiceTest:安置我们的wcf服务宿主网站,注意端口选择我们之前约定好固定的

asp.net版本4.0

SilverlightTest:安置我们的Silverlight寄宿网站,同样的设置asp.net版本4.0(iis6.0中,需设置端口,本例的Silverlight寄宿网站端口设8080,服务端ip为192.168.1.131,局域网内访问)
ok,在客户端访问一下我们的成果吧
首先输入wcf服务的地址,查看返回结果

You have created a service!看来我们的wcf服务布置成功了,接着我们访问一下演示用的silverlight吧

如果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没关吧

问题出在silverlight调用wcf时,使用的服务地址当时我们用的是localhost,之前由于是在本机调试,服务端客户端在同一台主机,他们的地址都是localhost,所以问题没有出现,但是silverlight程序是需要客户端下载到本地去执行的,当我们试图访问放置在真正服务端上的服务时,当然只能去找本机端口的wcf服务,而我们真正的想法是让它去找服务器端口下的wcf服务
知道了问题所在,开始修改一下我们的silverlight程序吧
首先修改一下我们的silverlight程序引用的wcf服务的地址吧:

这次我们使用服务端的ip地址(本例中服务器ip为192.168.1.131)

同时修改一下我们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寄宿网站放到服务器上,再次访问一下,问题解决,结果如下:

宿主iis部署wcf的更多相关文章
- IIS部署WCF
IIS部署WCF [转载自——http://www.cnblogs.com/starksoft/p/4992059.html] 1 部署IIS 1.1 安装WAS IIS原本是不支持非HTTP协议的服 ...
- IIS 部署WCF服务注意事项
IIS部署WCF服务的时候经常会出现如下错误: System.ServiceModel.EndpointNotFoundException”类型的未经处理的异常在 WinformWcfHost.exe ...
- IIS 部署WCF时遇到这么个错:
转(http://blog.csdn.net/vic0228/article/details/48806405) 部署WCF时遇到这么个错: "The service cannot be a ...
- IIS 部署WCF 4.0
上一章节讲解如何新建WCF服务,此文讲解如何在IIS上发布,并能正常访问 本地部署IIS 首先在本机安装IIS,IIS如何勾选,哪些是必须的?不太清楚,有清楚的大牛请指正!目前我的基本配置如下: 配置 ...
- IIS部署WCF报 无法读取配置节“protocolMapping”,因为它缺少节声明
今天写了个wcf的测试程序放在客户的服务器上供他们测试调用,部署到IIS后浏览报错了,根据错误的提示看出似乎是识别不了这个节点名,偶然的去看了下进程池中该站点的进程池名字的高级设置,看到使用的.net ...
- IIS部署WCF详细教程
前言: 前段时间接手了公司一个十几年前的老项目,该项目对外提供的服务使用的是WCF进行通信的.因为需要其他项目需要频繁的使用该WCF服务,所以我决定把这个WCF部署到IIS中避免每次调试运行查看效果. ...
- IIS部署WCF网站服务步骤
一开始在“管理工具”下找不到IIS的快捷方式,是因为系统默认未打开IIS功能,所以首先打开IIS功能: 为避免出现未知的麻烦,建议将IIS下的所有项都勾上: 创建IIS桌面快捷方式: 添加网站托管: ...
- iis部署wcf服务过程
一.在iis网站中添加wcf服务,一直添加到web.config目录即可 二.点击基本设置-->连接为-->特定用户.填写登入电脑的用户名和密码. 三.点击身份验证 四.控制面板,设置防火 ...
- IIS部署WCF疑难
1.其他信息: 无法激活请求的服务. 可能原因:1. 服务的命名空间和接口的命名空间不一致.2. 传递的参数类型没有打上[DataContract], [DataMember]标签. 2.记得这样: ...
随机推荐
- log4j2的配置及使用
log4j2与log4j1的不同点(不完整): 前者配置文件格式多样性.log4j2的配置文件可以是xml,也可以是json. 在不修改web.xml的前提下,前者配置文件的命名可以为log4j2.x ...
- Web开发中B/S架构和C/S架构的区别
在web开发中有两种基本架构,即C/S架构和B/S架构那么这两种架构有什么区别呢?那么就一起来看看吧. C/S架构图: B/S架构图: C/S架构是 浏览/服务器端的交互,是早期的一种分布式架构,在该 ...
- MongoDB 创建索引及其他
索引 以提升查询速度 测试:插入十万条数据到数据库中 for(i=0;i<100000;i++){db.t255.insert({name:'test'+i,age:i})} db.t1.fin ...
- 为什么不能用drop function add 去删除函数? 因为不能使用 mysql中的保留字!
mysql中有很多的 保留字, 也叫关键字, 你在使用 数据库中的任何东西, 都最好是 避开这些关键字/保留字, 包括 数据库名, 表名, 字段名, 函数名, 存储过程名. 这些关键字包括: mysq ...
- luogu P2713 罗马游戏
思路 模拟就好 左偏树合并 并查集寻找 代码 #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<=b;++i) us ...
- Win32汇编学习(1):基本概念
背景知识 Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是说它们都拥有 4GB 的物理地址空间,而 ...
- C# DateTime判断时间
两种情况: 1 DateTime? dtTemp = null; if(dtTime != null) { //wawawa } 刚刚学会的,可空值类型,可判断是否赋值 2 DateTime dtTe ...
- SQL中的字母的大小写转换
http://blog.csdn.net/dxb601/article/details/52086830 update 表名 set 字段名a= Lower(字段a) 2.将小写字母转化成大写字母 ...
- 论文笔记:Capsules for Object Segmentation
Capsules for Object Segmentation 2018-04-16 21:49:14 Introduction: ----
- js实例分析JavaScript中的事件委托和事件绑定
我们在学习JavaScript中,难免都会去网上查一些资料.也许偶尔就会遇到“事件委托”(也有的称我“事件代理”,这里不评论谁是谁非.以下全部称为“事件委托”),尤其是在查JavaScript的事件处 ...