WCF对我来说既陌生又熟悉,陌生是因为没怎么接触过,熟悉是听得太多,今天抽出点时间看了一下WCF,并且自己也写了一WCF的小程序以及调用WCF。步骤为:

1.创建一个解决方案WCF,和一个控制台项目WCFTestService(这就就是WCF服务)

2.配置WCF服务的App.Config

3.写WCF服务代码

4.新建项目WCFTestClient(客户端项目,用来测试访问服务)

5.写客户端代码

6.执行访问服务

下面详细说明每步的操作以及代码编写:

1.创建一个解决方案WCF,和一个控制台项目WCFTestService(这就就是WCF服务)

这一步是基础,肯定都会创建,就不在累赘。此处省略一万字··········

2.配置WCF服务的App.Config

首先我先贴上真个App.Config的内容

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" maxReceivedMessageSize="" defaultOutgoingResponseFormat="Json" helpEnabled="true" automaticFormatSelectionEnabled="true">
<readerQuotas maxArrayLength="" />
</standardEndpoint>
</webHttpEndpoint>
</standardEndpoints>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingConfig" sendTimeout="00:10:00" bypassProxyOnLocal="false" maxReceivedMessageSize="">
<readerQuotas maxStringContentLength="" maxArrayLength="" />
</binding>
</webHttpBinding>
</bindings>
<services>
<!-- 注意: 服务名称必须与服务实现的名称相匹配。 -->
<service name="WCFTestService.DbApiInfo" behaviorConfiguration="RestServiceBehavior">
<!-- 注意: 服务必须有一个 http 基址以便添加此终结点。 -->
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888/Service/DbApiInfo" />
</baseAddresses>
</host>
<!-- 添加下列终结点。 -->
<endpoint address="" behaviorConfiguration="RestEndpointBehavior" binding="webHttpBinding" bindingConfiguration="webHttpBindingConfig" contract="WCFTestService.IApiInfo">
<identity>
<dns value="Localhost" />
</identity>
</endpoint>
</service>
<!-- 注意: 服务名称必须与服务实现的名称相匹配。 -->
<service name="WCFTestService.DbUpLoad" behaviorConfiguration="RestServiceBehavior">
<!--注意: 服务必须有一个 http 基址以便添加此终结点。-->
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888/Service/DbUpLoad" />
</baseAddresses>
</host>
<!--添加下列终结点。-->
<endpoint address="" behaviorConfiguration="RestEndpointBehavior" binding="webHttpBinding" bindingConfiguration="webHttpBindingConfig" contract="WCFTestService.IUpLoad">
<identity>
<dns value="Localhost" />
</identity>
</endpoint>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="RestEndpointBehavior">
<webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="RestServiceBehavior">
<!-- 将下列元素添加到服务行为配置中。 -->
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

仔细观察这个代码,大家就会发现,这App.Config的内容就比我们新生成的App.Config多了一个节点<system.serviceModel></system.serviceModel>

以及他里面包含大内容。

<system.serviceModel></system.serviceModel>就是我们的服务配置内容。

最重要的是<system.serviceModel></system.serviceModel>里面的节点<services></services>,这才是服务配置的重点,

在这个节点里我们看到有两个<service></service>节点,每个<service></service>节点就是一个配置服务。

我们拿出一个<service></service>节点来说明:

<!-- 注意: 服务名称必须与服务实现的名称相匹配。 -->
<service name="WCFTestService.DbApiInfo" behaviorConfiguration="RestServiceBehavior">
<!-- 注意: 服务必须有一个 http 基址以便添加此终结点。 -->
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888/Service/DbApiInfo" />
</baseAddresses>
</host>
<!-- 添加下列终结点。 -->
<endpoint address="" behaviorConfiguration="RestEndpointBehavior" binding="webHttpBinding" bindingConfiguration="webHttpBindingConfig" contract="WCFTestService.IApiInfo">
<identity>
<dns value="Localhost" />
</identity>
</endpoint>
</service>

name="WCFTestService.DbApiInfo":顾名思义,就是服务的名称。不同的服务名称肯定不同。WCFTestService是命名空间

<add baseAddress="http://localhost:8888/Service/DbApiInfo" />:这个是服务的访问地址。

contract="WCFTestService.IApiInfo">:是服务的接口。WCFTestService是命名空间

注意:每次要新增一个服务的时候,就新建一个节点<service></service>,并且修改上面三个所有对应的名称,这样配置文件就OK了。

对于没有其他特殊需求的时候,配置文件其他地方是不需要修改的。由于只是一个简单的WCF测试服务,其他的我也就不说了,免得累赘。

3.写WCF服务代码

编写WCF代码,分为三步:

(1)添加一个服务对应的接口:如服务 "WCFTestService.DbApiInfo"对应的接口:IApiInfo(就是上面提到的接口名称要和上面一致)

[ServiceContract]
public interface IApiInfo
{
[OperationContract]
[ServiceKnownType(typeof(string))]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
string CreateApi(Stream name);
}

我们定义了[ServiceContract]标签,此标签代表此接口及实现此接口的类都是对外发布的Service类,在每个需要对外发布的方法上都加上[OperationContract]标签,以使外部可以访问到此方法。两个标签缺一,方法都不能被外部访问。
[ServiceContract]和[OperationContract]这两个标签需要导入using System.ServiceModel命名空间。

(2)添加接口对应的实现类:DbApiInfo.cs

public class DbApiInfo:IApiInfo
{ public string CreateApi(Stream name)
{
//name.Position = 0;
StreamReader reader = new StreamReader(name);
string text = reader.ReadToEnd(); return "你的名字是:" + text;
}
}

(3)启动服务的代码编写

启动服务的方法是

 private static List<ServiceHost> _LsSvcHost = new List<ServiceHost>();
public static void StartSvc()
{
try
{
ServicesSection servicesSection = ConfigurationManager.GetSection("system.serviceModel/services") as ServicesSection;
foreach (ServiceElement service in servicesSection.Services)
{
Type serviceType = Type.GetType(service.Name);
ServiceHost SvcHost = new ServiceHost(serviceType);
string strLog = string.Empty;
SvcHost.Opened += delegate
{
Console.WriteLine(string.Format("服务[{0}]已经启动,公开服务地址有:", service.Name));
};
SvcHost.Open();
foreach (var endpoint in SvcHost.Description.Endpoints)
{
Console.WriteLine(string.Format("Endpoint:{0} ", endpoint.Address.ToString()));
}
//logger.Info(strLog);
_LsSvcHost.Add(SvcHost); }
}
catch (System.Exception ex)
{
Console.WriteLine("启动数据服务异常:", ex);
}
}

然后把方法放到main()函数里调用即可:

static void Main(string[] args)
{
StartSvc();
Console.ReadKey();
foreach (ServiceHost SvcHosts in _LsSvcHost) SvcHosts.Close();
}

启动服务就可以看到服务已启动:

由于配置文件里配置了两个服务,这里也就启动了两个服务(注意:配置服务之后一定要添加对应的接口和接口实现类)。

4.新建项目WCFTestClient(客户端项目,用来测试访问服务)

新建项目这个也简单,也不多说,只把我的的界面贴出来(由于是测试,界面不好看,大家见谅····)

5.写客户端代码

这个主要就是写按钮“获取返回值”的Click事件,先贴代码,在讲解:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } /// <summary>
/// 根据提供的服务地址和传递的参数值,获取返回的值
/// </summary>
/// <param name="strUri">服务地址</param>
/// <param name="strBody">传递参数值</param>
/// <returns></returns>
public string PostHttp(string strUri, string strBody)
{
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(strUri); if (!string.IsNullOrEmpty(string.Empty) && !string.IsNullOrEmpty(string.Empty))
{
myRequest.Credentials = GetCredentialCache(strUri, string.Empty, string.Empty);
myRequest.Headers.Add("Authorization", GetAuthorization(string.Empty, string.Empty));
} //转成网络流
byte[] buf = UnicodeEncoding.UTF8.GetBytes(strBody);
//设置
myRequest.Method = "POST";
myRequest.ContentLength = buf.Length;
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.KeepAlive = false;
myRequest.ProtocolVersion = HttpVersion.Version10;
//发送请求
Stream newStream = myRequest.GetRequestStream();
newStream.Write(buf, , buf.Length);
newStream.Close();
//获得接口返回值
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
string strReturn = HttpUtility.HtmlDecode(reader.ReadToEnd());
reader.Close();
myResponse.Close();
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator evaluator = new MatchEvaluator(ConvertJsonDateToDateString); //对时间进行处理,需要引用System.Text.RegularExpressions;命名空间
Regex reg = new Regex(p);
strReturn = reg.Replace(strReturn, evaluator);
return strReturn;
} private CredentialCache GetCredentialCache(string uri, string username, string password)
{
string authorization = string.Format("{0}:{1}", username, password); CredentialCache credCache = new CredentialCache();
credCache.Add(new Uri(uri), "Basic", new NetworkCredential(username, password)); return credCache;
} private string GetAuthorization(string username, string password)
{
string authorization = string.Format("{0}:{1}", username, password); return "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization));
} private string ConvertJsonDateToDateString(Match m)  //对时间进行序列化处理
{
string result = string.Empty;
DateTime dt = new DateTime(, , );
dt = dt.AddMilliseconds(long.Parse(m.Groups[].Value));
dt = dt.ToLocalTime();
result = dt.ToString("yyyy-MM-dd HH:mm:ss");
return result;
} private void button1_Click(object sender, EventArgs e)
{
string strUri = "http://localhost:8888/Service/DbApiInfo/CreateApi";
string getstr=PostHttp(strUri, "刘德华");
textBox1.Text = getstr;
}
}

这里主要就是一个方法PostHttp,这个方法是通用,可作为公用方法被调用。

Click事件里调用方法。

6.执行访问服务

这个我们只需要把服务运行,在运行客户端,点击按钮,就可以得到服务给我们返回的结果了

至此,一个简单的WCF服务的建立以及调用就完成了······

WCF服务的建立以及调用的更多相关文章

  1. 客户端调用wcf服务,如何提高调用性能

    IO调用服务 1.使用using(每次自动释放) ; i < ; i++) { var watch = new Stopwatch(); watch.Start(); using (var cl ...

  2. 搭建基于asp.net的wcf服务,ios客户端调用的实现记录

    一.写wcf 问题: 1.特定的格式 2.数据绑定 3.加密解密 二.发布到iis 问题: 1.访问权限问题,添加everyone权限 访问网站时:http://localhost/WebbUploa ...

  3. SharePoint 2013 调用WCF服务简单示例

    内容比较简单,主要记录自己使用SharePoint 2013WCF服务遇到的小问题和小经验,分享给大家,希望能够给需要的人有所帮助.好吧,进入正题! 第一部分 SharePoint 2013调用自带W ...

  4. WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理

    原文:WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理 在前面一片文章(服务代理不能得到及时关闭会有什么后果?)中,我们谈到及时关闭服务代理(Service Proxy)在一个高并发环境 ...

  5. 如何让WCF服务更好地支持Web Request和AJAX调用

    WCF的确不错,它大大地简化和统一了服务的开发.但也有不少朋友问过我,说是在非.NET客户程序中,有何很好的方法直接调用服务吗?还有就是在AJAX的代码中(js)如何更好地调用WCF服务呢? 我首先比 ...

  6. WCF 一步一步 发布 WCF服务 到 IIS (图)

    WCF 一步一步 发布 WCF服务 到 IIS (图) 使用VS自带的WCFSVCHost(WCF服务主机)发布WCF服务,时刻开发人员测试使用. 下面我们来看一下如何在IIS中部发布一个WCF服务. ...

  7. 创建寄宿在Windows服务中的WCF服务

    1.创建Windows服务项目 2.Server1改名为你想要的名称,比如WinServer 3.在项目中新建一个WCF文件夹,用于存放wcf服务文件. 注:在WcfServer类的上面还要添加 [S ...

  8. 【Win 10应用开发】手动调用WCF服务

    调用服务最简单的方法就是,直接在VS里面添加服务引用,输入服务的地址即可,无论是普通Web服务,还是WCF服务均可.VS会根据获取到的元数据,自动生成客户端代码. 如果服务的调用量很大,应用广泛,可以 ...

  9. WCF服务开发与调用的完整示例

    WCF服务开发与调用的完整示例 开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IServi ...

随机推荐

  1. 优步UBER司机全国各地奖励政策汇总 (2月29日-3月6日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 北京Uber优步司机奖励政策(12月20日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. productFlavors 差异打包问题

    差异化打包: 1.dependencies compile 是不可以放到差异化的productFlavors里面的. 会报错: Error:(69, 0) Could not find method ...

  4. ORB-SLAM(十)LoopClosing Sim3求解

    主要参考这篇论文 Horn B K P. Closed-form solution of absolute orientation using unit quaternions[J]. JOSA A, ...

  5. spark 执行架构

    术语定义 Application:Spark Application的概念和Hadoop MapReduce中的类似,指的是用户编写的Spark应用程序,包含了一个Driver 功能的代码和分布在集群 ...

  6. ElasticSearch搜索引擎安装配置拼音插件pinyin

    近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...

  7. Windows运行机理——主程序—WinMain

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 在windows 操作系统下,用C 或者C++来编写MS-DOS 应用 ...

  8. Linux命令应用大词典-第45章 服务器配置

    45.1 ssh-agent:存储用于公钥验证的私钥 45.2 ssh-add:添加RSA或DSA身份的认证代理 45.3 ssh-keyscan:收集主机公钥 45.4 sshd:运行sshd守护进 ...

  9. POJ 3256 (简单的DFS)

    //题意是 K N, M; //有K个牛 N个牧场,M条路 ,有向的  //把K个牛放到任意的n个不同牧场中,问所有牛都可以到达的牧场数的总和  //这是一道简单的DFS题 //k 100 //n 1 ...

  10. Android开发-API指南-<uses-permission>

    <uses-permission> 英文原文:http://developer.android.com/guide/topics/manifest/uses-permission-elem ...