文章前奏
1.MSMQ已经安装成功,并且创建了myqueu
2.vs以管理员身份运行
正文:
主要分为三个部分,第一部分:服务于契约定义与配置,第二部分:IIS宿主部分编写与配置,第三部分web网站使用WCF接口,和MSMQ
一.第一部分先写服务于契约,也就是接口。
接口定义
using System.ServiceModel;
namespace WCFLibrary.StateCheck
{
[ServiceContract]
public interface IBaseInfo
{
[OperationContract(IsOneWay = true)]
void GetInfo(string code);
}
}
接口实现:
public class BaseInfo : IBaseInfo
{
public void GetInfo(string code)
{
Console.WriteLine("接收到了消息:" + code);
File.WriteAllText(@"D:\test.txt", code, Encoding.Default);
//执行调用hong命令
}
}
配置文件:
<system.serviceModel>
<services>
<service name="WCFLibrary.StateCheck.BaseInfo">
<host>
<baseAddresses>
这个路径:可以通过WCF客户端来测试是否成功!
<add baseAddress="http://localhost:8733/Design_Time_Addresses/WCFLibrary/Service/"/>
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
<endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.StateCheck.IBaseInfo">
<!--
部署时,应删除或替换下列标识元素,以反映
用来运行所部署服务的标识。删除之后,WCF 将
自动推断相应标识。
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 -->
<!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
二.第二部分:IIS宿主
IIS宿主的作用主要就是:使刚才写的接口可以寄宿在IIS进程上,这样子的话,WCF接口就一直处于侦听状态。
比如我在localhost/index.aspx中启动侦听
我的index.cs编码
ServiceHost host;
protected void Page_Load(object sender, EventArgs e)
{
host = new ServiceHost(typeof(BaseInfo));
//打开宿主
host.Open();
this.lbContent.Text = "WCF中的HTTP监听已启动....";
}
配置文件:主要是为了将消息队列和接口通信
<system.serviceModel>
<services>
<service name="WCFLibrary.StateCheck.BaseInfo">
<endpoint address="net.msmq://211.81.251.80/private/myqueue" bindingConfiguration="NoneSecurity" binding="netMsmqBinding" contract="WCFLibrary.StateCheck.IBaseInfo">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mexBehaviour">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netMsmqBinding>
<binding name="NoneSecurity" exactlyOnce="false" queueTransferProtocol="Native">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
</system.serviceModel>
三。web项目中通过MSMQ与接口通信
protected void btn_Click(object sender, EventArgs e)
{
try
{ using (ChannelFactory<IBaseInfo> channelFactory = new ChannelFactory<IBaseInfo>("msmqService"))
{
IBaseInfo proxyeService = channelFactory.CreateChannel();
for (int i = 0; i < 1000; i++) {
调用服务端接口
proxyeService.GetInfo("Hello World"+i);
Console.WriteLine("调用服务端"+i);
}
Response.Write("调用服务成功");
}
}
catch (Exception)
{
}
}
}
配置文件:
<system.serviceModel>
<client>
<endpoint address="net.msmq://211.81.251.80/private/myqueue"
binding="netMsmqBinding" bindingConfiguration="NoneSecurity"
contract="WCFLibrary.StateCheck.IBaseInfo" name="msmqService" />
</client>
<bindings>
<netMsmqBinding>
<binding name="NoneSecurity" exactlyOnce="false" queueTransferProtocol="Native">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
</system.serviceModel>