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 一个用 ...
随机推荐
- Elasticsearch client node 启动时出现警告:exception caught on transport layer 及java.net.NoRouteToHostException: No route to host
发现该问题源自发现kibana不能打开sense,并且看见elasticsearch插件处于服务不可用状态,但是在client node上curl localhost:9200发现能够返回ES基本信息 ...
- springboot 2.0 自动装配原理 以redis为例
当面试管问你springboot 和 普通spring 有什么区别? 您还在回答: 简化了配置 ,内置tomcat 等等 吗 ? 那只是皮毛, 最重要的还是自动化配置.一起来了解一下 第一步: 第二步 ...
- leetcode205
public class Solution { public bool IsIsomorphic(string s, string t) { if (s.Length != t.Length) { r ...
- 用VB实现COM+组件配置
在Windwos2000的管理工具里有一个“组件服务”工具,可以实现对COM+组件的应用的安装.启动.删除和对组件的安装.删除.这在安装一个有 COM+组件的应用系统时时非常有用的,我们可以通过程序控 ...
- Spring Boot 异步调用
添加一个类ThreadPoolConfig.java package com.cjcx.inter.framework.config; import org.springframework.conte ...
- 行为型-命令模式(Command)
装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇.在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯.排气扇并无直接关系,一 ...
- 程序的跟踪debug
- C 文件操作库函数总结
目录: 1. fopen(打开文件)2. fprintf3. fscanf4. clearerr(清除文件流的错误旗标)5. fclose(关闭文件)6. fdopen(将文件描述词转为文件指针)7. ...
- Shrio04 自定义Realm
1 说明 1.1 Realm的作用 Realm和认证和授权时的数据交互有关,相当于DAO层. 1.2 AuthorizingRealm >层次关系图 >作用继承AuthorizingRea ...
- SQLServer性能优化之---水平分库扩展
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 第一次引入文件组的概念:http://www.cnblogs.com/dunitia ...