心海巨澜

天行键,君子以自强不息;地势坤,君子以厚德载物!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

      WAS托管:Windows激活服务(WAS)是一个系统服务,是IIS7的一部分,也可以独立的安装与配置。IIS与WAS的主要区别在于WAS并不局限使用HTTP,它支持所有可用的WCF传输协议、端口与队列,支持的协议包括:HTTP、TCP、IPC、MSMQ。

      WAS提供了大量基于自托管的强大功能,包括应用程序池、回收机制、空闲时间管理(Idle Time Mannagement)、身份管理(Identity Management) 以及隔离(Isolation);宿主进程可以根据情况选择使用这些功能。

      下面我们通过一个DEMO来介绍WAS托管(net.tcp绑定)。

      开发环境:Visual Studio 2010 + Net Framework 4.0

      运行环境:Windows Server 2008 R2 + IIS7 + WAS

      1、创建一个WCf Service Library,主要代码如下:

//接口代码
[ServiceContract(Namespace = "http://schemas.xinhaijulan.com/demos/WASHost")]
public interface IWASHostService
{
[OperationContract]
string HelloWCF(string str);
}

//实现类代码
public class WASHostService : IWASHostService
{
public string HelloWCF(string str)
{
return string.Format("Get message from client is : {0}", str);
}
}

      2、创建一个ASP.NET空白网站,添加Service Library引用,并添加服务文件文件[WASHostService.svc],代码如下:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceLibrary.WASHostService" %>

      3、添加Web.config文件如下:

<?xml version="1.0"?>

<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>

<system.serviceModel>
<services>
<service name="ServiceLibrary.WASHostService" behaviorConfiguration="MetaDataBehavior">
<endpoint address="" binding="netTcpBinding" contract="ServiceLibrary.IWASHostService"
bindingConfiguration
="myNetTcp" />
<endpoint address="mex" binding="netTcpBinding" contract="IMetadataExchange"
bindingConfiguration="mexTcp" />

</service>
</services>
<bindings>
<netTcpBinding>
<binding name="myNetTcp" portSharingEnabled="true">
</binding>
<binding name="mexTcp" portSharingEnabled="true">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>

<behaviors>
<serviceBehaviors>
<behavior name="MetaDataBehavior">
<serviceMetadata httpGetEnabled="true" />

<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>

      4、编译网站,success,然后在命令行输入:inetmgr,打开IIS管理器,在Default Web Site中添加应用程序:WASHostService,目录指刚才创建的WebSite,并且指定应用程序池,至此,网站配置基本结束,然而我们尚未配置WAS。

      5、安装WAS与WCF激活【HTTP激活和非HTTP激活】:打开服务管理器->添加功能->选择.NET FrameWork 3.5.1和Windows 进程激活服务,如下图:

然后点击下一步,然后安装。因我已经安装,所以您看到的界面是已经安装的界面,所以下一步和安装按钮不可用。

      6、在安装完成后,我们可以在服务里面看到NetTcpActivator、NetPipeActivator、NetTcpPortSharing和WAS服务已经启动,如下图:

      7、至此,WAS与WCF激活【HTTP激活和非HTTP激活】安装完毕并且成功,下面我们将看到在Default Web Site中会自动绑定多个协议,命令行输入inetmgr,打开IIS管理器,右键点击Drfaul Web Site,点击绑定,如下图:

如果点击绑定后没有看到net.tcp等非http协议,则可以通过点击右面的添加来添加非http协议绑定,如下图:

以上为添加非http绑定,除此还需要进行启动net.tcp绑定:点击WASHostService->管理应用程序->高级设置,启动net.tcp绑定,如下图:

除了通过IIS管理器添加非http绑定,还可以通过命令行的方式添加非http绑定。

      8、命令行添加绑定:在命令行输入cmd 进入到:C:\Windows\System32\inetsrv>目录,然后输入appcmd,系统会给出appcmd的帮助信息,然后输入appcmd list site。

      8.1、设置端点tcp绑定,输入:appcmd set site "Default Web Site" -+bindings.[protocol='net.tcp',bindingInformation='808:*']。

      8.2、启用tcp绑定,输入appcmd list app,根据列出的应用程序,再输入:appcmd set app "Default Web Site/WASHostService" /enabledProtocols:http,net.tcp。

      命令行添加绑定过程如下:

Microsoft Windows [版本 6.1.7600]
版权所有 (c)
2009 Microsoft Corporation。保留所有权利。

C:\Users\Administrator
>cd\

C:\
>cd windows

C:\Windows
>cd system32

C:\Windows\System32
>cd inetsrv

C:\Windows\System32\inetsrv
>appcmd
通用 IIS 命令行管理工具。

APPCMD (命令) (对象类型)
<标识符> </参数1:值1 ...>

支持的对象类型:

SITE 虚拟站点的管理
APP 管理应用程序
VDIR 管理虚拟目录
APPPOOL 管理应用程序池
CONFIG 管理常规配置节
WP 管理工作进程
REQUEST 管理 HTTP 请求
MODULE 管理服务器模块
BACKUP 管理服务器配置备份
TRACE 使用失败请求跟踪日志

(要列出每个对象支持的命令,请使用
/?,例如“appcmd.exe site /?”)

常用参数:

/? 显示上下文相关帮助消息。

/text<:value> 以文本格式(默认)生成输出。
/text:* 在详细信息视图中显示所有对象属性。
/text:<attribute> 显示每个对象的
指定特性的值。
/xml 以 XML 格式生成输出。
使用此参数生成的输出可发送至
/in 模式运行的其他命令。
/in or - 自标准输入读取和操作 XML 输入。
使用此参数可操作运行于
/xml 模式的
其他命令生成的输入。
/config<:*> 显示所显示对象的配置。
/config:* 还包括继承的配置。
/metadata 在显示配置时显示配置元数据。

/commit 设置用于保存配置更改的配置路径。
可以指定具体的配置路径、“site”、
“app”、“parent”或“url”以保存到该命令正在编辑的
路径的适当部分,也可以设置为对应的配置级别
的“apphost”、“webroot”或“machine”。
/debug 显示命令执行的调试信息。

-使用“!”以转义与常用参数同名的参数,
例如“
/!debug:value”设置一个名为“debug”的配置属性。

C:\Windows\System32\inetsrv
>appcmd list site
SITE
"demo" (id:2,bindings:http/*:80:www.demo.com,state:Started)
SITE "HelloWCF" (id:3,bindings:http/*:80:www.hellowcf.com,state:Started)
SITE "Default Web Site" (id:1,bindings:http/*:80:www.washost.com,net.tcp/808:*,n
et.pipe/*,net.msmq/localhost,msmq.formatname/localhost,state:Started)

C:\Windows\System32\inetsrv>appcmd list app
APP "demo/" (applicationPool:Demo)
APP "HelloWCF/" (applicationPool:HelloWCF)
APP "Default Web Site/" (applicationPool:Default Web Site)
APP "Default Web Site/MSMQ" (applicationPool:Default Web Site)
APP "Default Web Site/WASHostService" (applicationPool:Default Web Site)

      9、至此WAS托管服务端设置完毕,我们通过在浏览器中打开.svc文件测试元数据是否可见,输入:http://www.washost.com/WASHostService/WASHostService.svc

(www.washost .com 在host文件中添加项:127.0.0.1 www.washost.com)可以看到如下信息:

此元数据只所以可见,是因为我在配置文件中设置了【<serviceMetadata httpGetEnabled="true" />】和【<endpoint address="mex" binding="netTcpBinding" contract="IMetadataExchange" bindingConfiguration="mexTcp" />】,请参考第三步的配置文件。

      10、创建Client项目,添加Service引用,如下图:

完成后,在Program类中添加代码,主要代码如下:

class Program
{
static void Main(string[] args)
{
using (Server.WASHostServiceClient client = new Server.WASHostServiceClient())
{
Console.WriteLine(
"--------WAS NET.TCP BEGIN--------");

Console.WriteLine(client.HelloWCF(
"Hello WCF"));

Console.WriteLine(
"--------WAS NET.TCP END--------");

Console.ReadLine();
}
Console.ReadLine();
}
}

此时,我们可以看到Client项目中,系统自动生成了一个app.config文件,主要代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IWASHostService" closeTimeout="00:01:00"
openTimeout
="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow
="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode
="StrongWildcard" listenBacklog="10"
maxBufferPoolSize
="524288" maxBufferSize="65536" maxConnections="10"
maxReceivedMessageSize
="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead
="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled
="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://cs/WASHostService/WASHostService.svc"
binding
="netTcpBinding" bindingConfiguration="NetTcpBinding_IWASHostService"
contract
="Server.IWASHostService" name="NetTcpBinding_IWASHostService">
<identity>
<servicePrincipalName value="host/CS" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>

      11、运行客户端,输入如下图:

      12、如果在调用服务的过程中出现Error:

An unhandled exception of type 'System.ServiceModel.EndpointNotFoundException' occurred in mscorlib.dll

Additional information: The message could not be dispatched because the service at the endpoint address
'net.tcp://cs/WASHostService/WASHostService.svc' is unavailable for the protocol of the address.

则请通过重新安装ServiceModel解决:【C:\Windows\Microsoft.NET\Framework64\v4.0.30319>ServiceModelReg.exe -r】,个人理解是ServiceModel安装的版本的问题,如下:

C:\Users\Administrator>cd\

C:\
>cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319

C:\Windows\Microsoft.NET\Framework64\v4.
0.30319>ServiceModelReg -r
Microsoft (R) WCF
/WF registration tool version 4.0.0.0
Copyright (c) Microsoft Corporation. All rights reserved.

Administration utility that manages the installation and uninstallation of
WCF and WF components on a single machine.

[SC] ChangeServiceConfig2 成功
[SC] ChangeServiceConfig2 成功
[SC] ChangeServiceConfig2 成功
[SC] ChangeServiceConfig2 成功
[SC] ChangeServiceConfig2 成功
[SC] ChangeServiceConfig2 成功
[SC] ChangeServiceConfig2 成功
[SC] ChangeServiceConfig2 成功
[Warning]The HTTP
namespace reservation already exists.

如有其它问题,则请通过【telnet ip 端口号】看服务端是否开启此端口。

 

      至此,托管(Hosting)-WAS托管(net.tcp)介绍完毕。

      点击下载DEMO

作者:心海巨澜
出处:http://xinhaijulan.cnblogs.com
版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

posted on 2010-12-05 23:33  心海巨澜  阅读(4988)  评论(5编辑  收藏  举报