精华内容
下载资源
问答
  • C# WCF通信
    2020-12-15 21:56:04

    一、概述
      WCF的通信模式有三种:请求/响应模式、单向模式和双工通信。

    二、请求/响应模式
      请求/响应模式就是WCF的默认模式,前面几篇随笔中的示例都是这种模式,当客户端发送请求后(非异步状态下),即使返回的是void客户端会一直等待服务端的响应后才继续下面的操作。

    优点:可以及时的向客户端返回错误信息。

    缺点:面对服务端需要长时间处理的情况下,降低客户端的响应速度和性能。

    这个大家都好理解,就不再复述。

    三、单向模式
      单向模式和请求/响应模式相反,单向模式就是客户端发送请求后直接进行接下来的操作,不会等待服务端的响应,并且服务端也不会发送响应。所以单向模式的方法不得声明输出参数、返回值和引用参数。

    单向模式的需要在OpertaionContract中设置IsOneWay=true ,如下所示:

    [OperationContract(IsOneWay = true)]
    void ShowDay(string day);
    

    优点:客户端反应速度快、性能强,当然排除需要超大量传输参数的情况。

    缺点:不能及时获取服务端是否操作结果。
      四、双工通信
      双工通信就是实现客户端和服务端方法可以相互调用。一般情况下都是客户端调用服务端的方法,但是双工通信可以让服务端调用客户端的方法。双工通信时建立在上述两种方式之上的,并不是相互冲突的。

    1.服务端

    定义服务契约和回调契约,服务契约必须通过特性[ServiceContract(CallbackContract = typeof(ICustomCallback))]来关联回调契约,回调契约不必声明ServiceContract特性,但是方法必须声明OperationContract否则在客户端引用服务后无法使用该方法,这里我们用单向模式。

    namespace WcfServiceLibrary
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IDay”。
        [ServiceContract(CallbackContract = typeof(ICustomCallback))]
        public interface IDay
        {
            [OperationContract]
            string ShowDay(int day);
        }
        public interface ICustomCallback
        {
            [OperationContract(IsOneWay=true)]
            void UserCustomMethod(string str);
        }
    }
    

    在配置文件中binding指定WSDualHttpBinding,支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding,我这里用第一种。

    <endpoint address="" binding="wsDualHttpBinding" contract="WcfServiceLibrary.IDay">
    

    实现服务契约接口,不需要实现回调契约的接口,因为回调是使用客户端的方法所以在客户端实现。OperationContext是WCF中非常重要的对象,它表示操作执行的上下文,通过OperationContext的方法GetCallbackChannel()来获取回调对象后使用回调方法。

    namespace WcfServiceLibrary
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Day”。
        public class Day : IDay
        {
            ICustomCallback customCallback = null;
            public Day()
            {
                customCallback = OperationContext.Current.GetCallbackChannel<ICustomCallback>();
            }
            public string ShowDay(int day)
            {
                customCallback.UserCustomMethod("哈哈哈哈");//使用回调方法
                return string.Format("WCF服务返回Day是:{0}", day);
            }
        }
    }
    

    2.客户端

    客户端引用WCF服务后会在Service References文件加下生成一个服务类,里面定义了回调接口IDayCallback如下:

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
        public interface IDayCallback {
            
            [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/IDay/UserCustomMethod")]
            void UserCustomMethod(string str);
        }
    

    实现回调方法,并调用WCF服务:

    class Program
        {
            static void Main(string[] args)
            {
                InstanceContext instanceContext = new InstanceContext(new CustomCallback());
                DayClient client = new DayClient(instanceContext);
                Console.WriteLine(client.ShowDay(666));
                Console.ReadLine();
            }
        }
        public class CustomCallback : IDayCallback
        {
            public void UserCustomMethod(string str) 
            {
                Console.WriteLine("这是客户端方法:{0}",str);
            }
        }
    

    调试可以看到,在服务端成功调用了客户端的方法UserCustomMethod(string str):
    在这里插入图片描述
    五、回调死锁
      由于双工通信下客户端和服务端可以互相调用对方的方法,所以会出现双方都等待对方响应的情况,而造成死锁而报错。上面的例子没有造成死锁是因为使用了单向模式,不需要等待响应。那么如果需要使用带有返回值的回调方法那该怎么办呢?

    我们将上述服务端回调契约定义的回调方法改为string UserCustomMethod(string str)并去掉IsOneWay = true,然后在服务端进行以下改造:

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Day”。
        public class Day : IDay
        {
            ICustomCallback customCallback = null;
            public Day()
            {
                customCallback = OperationContext.Current.GetCallbackChannel<ICustomCallback>();
            }
            public string ShowDay(int day)
            {
                string str = customCallback.UserCustomMethod("哈哈哈哈");
                return string.Format("WCF服务返回Day是:{0}。{1}", day, str);
            }
        }
    

    之后在客户端更新服务,运行报以下错误:在这里插入图片描述
     很明显服务不支持并发,由于等待响应而产生了死锁。可以修改ServiceBehavior特性中的ConcurrencyMode就可以了。那么我们修改下代码如下,ServiceBehavior只能声明类:

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
        public class Day : IDay
        {
            ICustomCallback customCallback = null;
            public Day()
            {
                customCallback = OperationContext.Current.GetCallbackChannel<ICustomCallback>();
            }
            public string ShowDay(int day)
            {
                string str = customCallback.UserCustomMethod("哈哈哈哈");
                return string.Format("WCF服务返回Day是:{0}。{1}", day, str);
            }
        }
    

    再次运行客户端就成功啦:
    在这里插入图片描述

    更多相关内容
  • C# WCF示例demo

    热门讨论 2013-11-06 09:34:09
    wcf示例demo,适合初学者或者新手了解wcf的工作原理和使用技术
  • C# WCF项目示例

    2018-02-23 15:54:44
    WCF示例项目,c#...................................................................................................................................
  • 基于TCP协议的WCF通信主要包含了以下三部分,分别为服务契约、宿主程序、客户端程序。本示例为基于TCP的WCF通信实现。
  • C#调用WCFService示例

    2018-11-07 10:47:21
    C#调用WCFService实例----C#----示例源码----Visual Studio
  • C# WCF示例和PPT

    2010-03-31 22:14:40
    一个简单的WCF程序,附带PPT,可直接在本机运行.
  • 由于之前开发没有用过wcf的开发模式,但是新的公司用到了,所以有幸学习了一下,自己先做个实例很有必要 特别适合没有接触过WCF开发模式的新人,手把手操作,十几分钟搞定,可以跟着试一下,特别详细 创建一个...

    由于之前开发没有用过wcf的开发模式,但是新的公司用到了,所以有幸学习了一下,自己先做个实例很有必要

    特别适合没有接触过WCF开发模式的新人,手把手操作,十几分钟搞定,可以跟着试一下,特别详细

     

     

    创建一个新的项目

    创建后会默认生成 Service1.svc文件与Service.cs文件。可将其删除 ,项目右键,添加

     有个默认DoWork方法,为了测试返回一个字符串

            public string DoWork()
            {
                return "那女孩对我说,说我守护她的梦";
            }

    IService2.cs , void 改为 string,如下:

        [ServiceContract]
        public interface IService2
        {
            [OperationContract]
            string DoWork(); 
        }

     

    将当前项目设为启动项

     

    在 Service2.svc 文件右键,选择在浏览器中查看

    复制网址 

    创建一个用来调用的实例,我这里创建了一个mvc:

     在引用,右键,高级

    添加web引用

     

    将刚刚复制的1、网址添加,2点击,3、web引用名起个名字(将作为调用的条件)默认为localhost ,4、添加引用

     

     就会生成:

     现在WEB端完成了对wcf的引用了。

    在mvc中写一个方法,来调用wcf的方法

    控制器:

    看上面添加引用的名字为localhost,就用这个名字来引用。

    视图:

    运行效果就是:

    成功的调取了wcf里的方法展示到了前台

    展开全文
  • `以管理员运行VS` 创建WCF服务端项目2. 覆盖IService1.cs3. 覆盖Service1.cs4.修改app.config5. 在当前解决方案中新建控制台应用6. 添加刚刚wcf服务库的引用7. 创建成功,打开对应网页8. `.net framework`创建...

    1. 以管理员运行VS 创建WCF服务端项目

    在这里插入图片描述

    2. 覆盖IService1.cs

    using System;
    using System.ServiceModel;
    
    namespace GettingStartedLib
    {
            [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
            public interface ICalculator
            {
                [OperationContract]
                double Add(double n1, double n2);
                [OperationContract]
                double Subtract(double n1, double n2);
                [OperationContract]
                double Multiply(double n1, double n2);
                [OperationContract]
                double Divide(double n1, double n2);
            }
    }
    

    3. 覆盖Service1.cs

    using System;
    using System.ServiceModel;
    
    namespace GettingStartedLib
    {
        public class CalculatorService : ICalculator
        {
            public double Add(double n1, double n2)
            {
                double result = n1 + n2;
                Console.WriteLine("Received Add({0},{1})", n1, n2);
                // Code added to write output to the console window.
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Subtract(double n1, double n2)
            {
                double result = n1 - n2;
                Console.WriteLine("Received Subtract({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Multiply(double n1, double n2)
            {
                double result = n1 * n2;
                Console.WriteLine("Received Multiply({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Divide(double n1, double n2)
            {
                double result = n1 / n2;
                Console.WriteLine("Received Divide({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
        }
    }
    

    4.修改app.config

    将第 14 行更改为
    <servicename=“GettingStartedLib.CalculatorService”>
    将第 17 行更改为
    < add baseAddress =“http://localhost:8000/GettingStarted/CalculatorService” />
    将第 22 行更改为
    < endpoint address="" binding=“wsHttpBinding” contract=“GettingStartedLib.ICalculator”/>

    5. 在当前解决方案中新建控制台应用

    在这里插入图片描述

    在这里插入图片描述

    6. 添加刚刚wcf服务库的引用

    在这里插入图片描述

    7. 创建成功,打开对应网页

    在这里插入图片描述
    在这里插入图片描述

    8. .net framework创建客户端

    
    using ConsoleApp4.ServiceReference1;
    using System;
    using System.ServiceModel;
    
    namespace GettingStartedClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Step 1: Create an instance of the WCF proxy.
                EndpointAddress epAddress = new EndpointAddress("http://localhost:8000/GettingStarted/CalculatorService");
                CalculatorClient client = new CalculatorClient(new WSHttpBinding(), epAddress);
    
                //CalculatorClient client = new CalculatorClient();
    
                // Step 2: Call the service operations.
                // Call the Add service operation.
                double value1 = 100.00D;
                double value2 = 15.99D;
                double result = client.Add(value1, value2);
                //Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
                // Call the Subtract service operation.
                value1 = 145.00D;
                value2 = 76.54D;
                result = client.Subtract(value1, value2);
                Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
    
                // Call the Multiply service operation.
                value1 = 9.00D;
                value2 = 81.25D;
                result = client.Multiply(value1, value2);
                Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
    
                // Call the Divide service operation.
                value1 = 22.00D;
                value2 = 7.00D;
                result = client.Divide(value1, value2);
                Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
    
                // Step 3: Close the client to gracefully close the connection and clean up resources.
                Console.WriteLine("\nPress <Enter> to terminate the client.");
                Console.ReadLine();
                client.Close();
            }
        }
    }
    

    9. 要先运行之前的GettingStarted项目!添加服务引用

    右键添加里面有,服务引用

    在这里插入图片描述

    10. 运行成功

    在这里插入图片描述

    展开全文
  • 最近项目需要,需要实现C++客户端和WCF服务器双工通信。...经过一番折腾,想出了个通过COM与C#WCF客户端通信的方法。拿出来分享一下。 有不明白的请看博客:http://blog.csdn.net/wuding1104/article/details/9394305
  • C# WCF入门

    2020-12-15 21:44:52
    目录标题一、什么是WCF二、第一个WCF程序三、WCF服务的使用 一、什么是WCF WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。它使得开发者能够建立一个跨平台的、安全、可信赖、事务性的...

    一、什么是WCF

    WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。它使得开发者能够建立一个跨平台的、安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。WCF是微软分布 式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,例如.Net Remoting、ASMX、WSE和MSMQ(消息队列)。以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于 Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML, Kerberos,X509,用户/密码,自定义等多种标准与模式。也就是说,在WCF框架下,开发基于SOA的分布式系统变得容易了,微软将所有与此相 关的技术要素都包含在内,掌握了WCF,就相当于掌握了叩开SOA大门的钥匙。

    最终目标是通过进程或不同的系统、通过本地网络或是通过Internet收发客户和服务之间的消息。

    二、第一个WCF程序

    1.我们先新建一个项目,选择WCF中的WCF服务应用程序新建:

    在这里插入图片描述
    2.系统生成了两个默认文件:IService1.cs和Service1.svc,其中IService1.cs是定义接口的,Service1.svc用来实现该接口。在这两个文件中可以看到如下的代码:

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
        [ServiceContract]
        public interface IService1
        {
    
            [OperationContract]
            string GetData(int value);
    
            [OperationContract]
            CompositeType GetDataUsingDataContract(CompositeType composite);
    
            // TODO: 在此添加您的服务操作
        }
    
    
        // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
        [DataContract]
        public class CompositeType
        {
            bool boolValue = true;
            string stringValue = "Hello ";
    
            [DataMember]
            public bool BoolValue
            {
                get { return boolValue; }
                set { boolValue = value; }
            }
    
            [DataMember]
            public string StringValue
            {
                get { return stringValue; }
                set { stringValue = value; }
            }
        }
    
    public string GetData(int value)
            {
                return string.Format("You entered: {0}", value);
            }
    
            public CompositeType GetDataUsingDataContract(CompositeType composite)
            {
                if (composite == null)
                {
                    throw new ArgumentNullException("composite");
                }
                if (composite.BoolValue)
                {
                    composite.StringValue += "Suffix";
                }
                return composite;
            }
    

    可以看到接口文件IService1.cs里有几个特性分别是:[ServiceContract]、[OperationContract]、[DataContract]、[DataMember],大致的用途如下:

    [ServiceContract]:指明该接口是一个WCF的服务契约,可以被外部的调用,不加则无法被外部调用。

    [OperationContract]:指明该方法是一个WCF的方法契约,可以被外部的调用,不加则无法被外部调用。

    [DataContract]:数据契约,指明该类是可供服务端和客户端相互传递自定义数据的类型,声明后该类型就可以被序列化在服务端和客户端之间传送。

    [DataMember]:数据成员,声明后的属性可以参与到客户端和服务器端的类的属性的序列化,没有声明的不参与序列化。

    在Service1.svc中已经实现了接口中的方法,将Service1.svc设置为启动项,后调试会如下所示,这是vs自带的服务测试的工具,不过无法测试异步的服务。
      在这里插入图片描述
    双击左侧树状图中的方法GetData(),在上方输入值后点击调用可以下方看到方法返回值,则说明我们的接口成功了。在这里插入图片描述

    三、WCF服务的使用

    1.接下来对我们的WCF程序进行发布到本地文件,发布的过程和WEB的项目发布类似,发布后我们部署到IIS上面。右键浏览Service1.svc出现如下的页面后表明发布成功。http://192.168.3.30:7358/Service1.svc?wsdl就是我们需要引用的服务地址。在这里插入图片描述
     注意如果无法发布成功,可能是部分的Windows功能没有开启,如下所示。在这里插入图片描述
    2.新建一个新的控制台应用程序,右键引用->添加服务引用->将WCF服务引用地址输入点击确认即可引用成功。在这里插入图片描述
    引用成功后在Service References文件夹下出现了一个ServiceReference1服务,在控制台程序中引用WCF服务的命名空间using ConsoleApplication2.ServiceReference1;使用如下代码即可访问服务接口。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    //添加WCF的服务命名空间
    using ConsoleApplication2.ServiceReference1;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Service1Client是在添加服务引用后服务器端的Service1在客户端的代理类,一般的格式都是"*Client"这种格式的
                Service1Client sercive = new Service1Client();
                string str = sercive.GetData(666);
                Console.WriteLine("WCF服务返回值为:" + str);
                Console.ReadKey();
            }
        }
    }
    

    返回结果如下:
    在这里插入图片描述

    展开全文
  • WcfServiceLibrary1--- wcf服务:生成dll文件给宿主引用 WinFormsWcfService--- 宿主 WcfClient---调用wcf服务客户端
  • WCF简单实例

    2018-01-22 14:31:55
    WCF(全称)是由微软发展的一组数据通信的应用程序开发接口。WCF通过进程或不同的系统、通过本地网络或是通过Internet收发客户和服务之间的消息。
  • 在这个例子中我们将使用VS2010创建一个WCF服务...这两个类文件是两个WCF示例文件,对我们开发没有什么用处,现在我们删掉这两个文件。 然后添加Student类 创建服务接口,声明对外发布的类和方法。 实现我们上面声明
  • Wcf ajax c#例子

    2014-12-03 09:52:02
    通过ajax访问WCF服务程序,成功返回接送对象
  • C# WCF服务(二)

    2020-05-24 14:26:44
    WCF服务应用程序与WCF服务库 概述 案例 IIS宿主 Winform应用程序宿主 Winform依赖配置文件 WAS宿主 WCF学习 WCF概念 在基于.NET的应用程序开发中,我们由客户机的浏览器访问应用程序服务器,然后通过应用...
  • C# WCF配置

    2020-12-15 21:48:19
     首先我们需要了解WCF的一个概念就是终结点Endpoint,WCF服务通过定义一个或者多个终结点,当服务端和客户端的终结点相互匹配的时候才可以完成通信。终结点Endpoint由三部分组成Address、Binding和Contract。 ...
  • wcf,c#调用wcf 服务

    2012-05-05 14:10:53
    wcf,c#调用wcf 服务,包括 服务器端,客服端 简单示例供参考
  • java 访问 wcf 示例(使用的HttpClient)

    热门讨论 2013-03-08 17:20:48
    java 访问 wcf 示例(使用的HttpClient)
  • @ ServiceHost Language=”C#” Debug=”true” Service=”ajaxSample.HelloWorld” CodeBehind=”HelloWorld.svc.cs” Factory=”System.ServiceModel.Activation.WebServiceHostFactory” %> 注:如果不添加F
  • WCF示例-第三章-回应

    2021-04-07 07:36:40
    WCF服务响应消息模式
  • WCF示例-第一章-基线

    2021-04-03 23:05:26
    模型,存储库和服务的初稿。
  • 服务器端资源的全局和请求上下文模式
  • 介绍RepositoryLocator模式。
  • 工作单元和存储库RavenDB实现示例
  • 使用存储库的NHibernate上的工作单元模式。
  • WPF INotifyPropertyChanged实现。
  • WCF示例代码(C#.net)

    热门讨论 2010-01-15 14:49:06
    •Contracts:一个类库项目,定义服务契约(Service Contract),引用System.ServiceMode程序集(WCF框架的绝大部分实现和API定义在该程序集中); •Services:一个类库项目,提供对WCF服务的实现。定义在该项目中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,363
精华内容 1,745
关键字:

c# wcf 示例

c# 订阅