WCF快速上手(二)
服务端是CS程序,客户端(调用者)是BS程序
一、代码结构:
二、服务接口Contract和实体类Domain
INoticeService:
using Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks; namespace Contract
{
/// <summary>
/// 通知公告
/// </summary>
[ServiceContract]
public interface INoticeService
{
/// <summary>
/// 获取一条公告信息
/// </summary>
[OperationContract]
Notice GetNotice();
}
}
Notice:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Domain
{
/// <summary>
/// 通知公告
/// </summary>
public class Notice
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 数据
/// </summary>
public byte[] Data { get; set; }
}
}
三、服务WcfService和宿主WcfHost
NoticeService:
using Contract;
using Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace WcfService
{
/// <summary>
/// 通知公告服务
/// </summary>
public class NoticeService : INoticeService
{
/// <summary>
/// 获取一条公告信息
/// </summary>
public Notice GetNotice()
{
Notice notice = new Notice();
notice.Title = "测试标题";
notice.Content = "测试内容";
notice.Data = new byte[];
for (int i = ; i < ; i++)
{
notice.Data[i] = (byte);
}
return notice;
}
}
}
Program:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using WcfService; namespace WcfServer
{
class Program
{
static void Main(string[] args)
{
string path = AppDomain.CurrentDomain.BaseDirectory + "Service";
string[] fileArr = Directory.GetFiles(path);
int port = int.Parse(ConfigurationManager.AppSettings["ServerPort"]); foreach (string fileName in fileArr)
{
string url = string.Format("http://localhost:{0}/Service/{1}", port, Path.GetFileName(fileName));
Uri[] uri = new Uri[] { new Uri(url) }; ServiceHost host = new ServiceHost(typeof(NoticeService), uri);
host.Open();
} Console.WriteLine("服务成功启动");
Console.Read();
}
}
}
服务端App.config配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="ServerPort" value="8998"/>
</appSettings>
<system.serviceModel>
<services>
<service name="WcfService.NoticeService" behaviorConfiguration="ServiceBehavior" >
<endpoint contract="Contract.INoticeService" address="" binding="basicHttpBinding" bindingConfiguration="ServiceBinding">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="ServiceBinding" sendTimeout="00:00:20" maxReceivedMessageSize="2147483646">
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
四、客户端
NoticeProxy:
using Contract;
using Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks; namespace WcfClient
{
/// <summary>
/// 通知公告
/// </summary>
public class NoticeProxy : INoticeService
{
private ChannelFactory<INoticeService> channelFactory;
private INoticeService server; public NoticeProxy()
{
channelFactory = new ChannelFactory<INoticeService>("NoticeService");
server = channelFactory.CreateChannel();
} /// <summary>
/// 获取一条公告信息
/// </summary>
public Notice GetNotice()
{
return server.GetNotice();
}
}
}
客户端调用服务:
using Domain;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WcfClient; namespace WinformClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btnTest_Click(object sender, EventArgs e)
{
try
{
NoticeProxy proxy = new NoticeProxy();
Notice notice = proxy.GetNotice();
MessageBox.Show(notice.Data.Length.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
客户端App.config配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="ServiceBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="ServiceBinding" maxReceivedMessageSize="2147483646">
<readerQuotas maxArrayLength="65242880" maxStringContentLength="65242880"/>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint name="NoticeService" contract="Contract.INoticeService" address="http://localhost:8998/Service/NoticeService.svc" behaviorConfiguration="ServiceBehavior" binding="basicHttpBinding" bindingConfiguration="ServiceBinding" />
</client>
</system.serviceModel>
</configuration>
WCF快速上手(二)的更多相关文章
- WCF快速上手
需求:在同一台机子上,有一个B/S程序,和一个C/S程序(不要问为什么,事实就是这样),B/S程序需要主动和C/S程序通信(C/S程序主动与B/S程序通信的情况这里暂不讨论). 下面以最快的速度写一个 ...
- react快速上手二(使用JSX语法)
前提: 下载依赖,配置 cnpm i babel-preset-react -D JSX语法的本质: 还是以 React.createElement 的形式来实现的,并没有直接把 用户写的 HTML代 ...
- Netron开发快速上手(二):Netron序列化
Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用 ...
- UnityShader快速上手指南(二)
简介 前一篇介绍了如果编写最基本的shader,接下来本文将会简单的深入一下,我们先来看下效果吧 呃,gif效果不好,实际效果是很平滑的动态过渡 实现思路 1.首先我们要实现一个彩色方块 2.让色彩动 ...
- socket网络编程快速上手(二)——细节问题(5)(完结篇)
6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢?如果EINTR前,三次握手已经发起,我们当然希望链路就此已经建 ...
- socket网络编程快速上手(二)——细节问题(4)
5.慢系统调用及EINTR 还记得前面readn和writen函数么?里面有个EINTR,现在就来谈谈这个,这个很重要. Linux世界有个叫信号的东西,感觉他就像一位隐士,很少遇到他,而他又无处不在 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- 快速上手Unity原生Json库
现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...
- Netron开发快速上手(一):GraphControl,Shape,Connector和Connection
版权所有,引用请注明出处:<<http://www.cnblogs.com/dragon/p/5203663.html >> 本文所用示例下载FlowChart.zip 一个用 ...
随机推荐
- ganglia-Monitor
- cmd变量,参数,for循环,
@echo offrem *****************************************************rem Create By Q_rui CopryRight@_ ...
- centos7.3给搭建SVN服务器
centos7.3给搭建SVN服务器 1 安装svnserver yum install subversion 2 查看版本 svnserve --version 3 创建版本库 3.1 运行以下命令 ...
- mysql java.sql.SQLException: Can't call commit when autocommit=true
java.sql.SQLException: Can't call commit when autocommit=true at com.mysql.jdbc.SQLError.createSQLEx ...
- Socket.IO for Unity 简要介绍
在项目中使用到了Socket.IO for unity这个Asset Store上免费的库,这里将简要的介绍一下它的结构,已经使用中的注意事项. 目录结构 上面为包的目录结构,简单的介绍一下具体的内容 ...
- AFNetworking 不支持 text/plain,unacceptable content-type: text/plain
1. 用AFNetworkingPOST传递参数(获取微博的accessToken)的时候,具体代码如下: AFHTTPSessionManager *session = [AFHTTPSession ...
- jQuery的event事件
1.冒泡和默认行为 <div class="aa"> <div class="bb"> <div class="cc&q ...
- nSum “已知target再求和”类型题目总结:n-2重循环+left/right
Sum类的题目一般这样: input: nums[], target output: satisfied arrays/ lists/ number 拿到题目,首先分析: 1. 是几个数的sum 2. ...
- Spring boot 、mybatis 和 swagger 整合
文件路径 添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- 23-吝啬的国度(vector+深搜)
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...