跟着Artech学习WCF(1)

本文记录了作者在实现双向通信过程中遇到的问题及解决方案,包括端口绑定、代理创建与关闭等难点,并分享了最终成功的项目结构及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

折腾了老半天双向通信,不是端口绑定不上 就是创建代理失败要摸是 代理没有及时关闭Artech的代码看了半天无论是照抄还是改良都是不行,无奈到处看看test最后终于解决了

绑定协议现在只试了http还没有事tcp的

项目结构图如下

2

 

目前感觉客户端的调用部分代码很多不 来自博客园地址忘了呵呵

 

 

代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace Contracts
{
    [ServiceContract(Namespace="http://www.artech.com/",CallbackContract=typeof(ICallback))]
   public interface ICalculator
    {
        [OperationContract(IsOneWay = true)]
        void add(double x, double y);

        [OperationContract(IsOneWay = true)]
        void Subtract(double x, double y);


    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace Contracts
{
   public interface ICallback
    {
       [OperationContract(IsOneWay=true)]
       void DisplayResult(double x, double y, double result);
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Contracts;
using System.ServiceModel;

namespace Services
{
   public class CalculatorService:ICalculator
    {

        void ICalculator.add(double x, double y)
        {
            double result = x + y;
            ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            callback.DisplayResult(x, y, result);
        
        }

        void ICalculator.Subtract(double x, double y)
        {
            double result = x - y;
            ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            callback.DisplayResult(x, y, result);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Services;
using Contracts;

namespace Hosting
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
            {
                try
                {

                    host.Opened += delegate
                    {
                        Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                    };
                    host.Open();
                    Console.Read();
                }
                catch (Exception ex)
                {

                }



            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ServiceModel;
using Contracts;


namespace Client
{
    public partial class Form1 : Form, ICallback
    {
        public Form1()
        {
            InitializeComponent();
            IniProxy();
        }

        MyDataClient client = null;

        public void IniProxy()
        {
            client = new MyDataClient(new InstanceContext(this), "WSDualHttpBinding_ICalculator");
        }

        void ICallback.DisplayResult(double x, double y, double result)
        {
            this.label1.Text = x.ToString() + "||"+y.ToString()+"||" + result.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            client.add(1, 2);

            // ServiceReference2
            #region MyRegion
            
           
            //InstanceContext instanceContext = new InstanceContext(this);
            //using (DuplexChannelFactory<ICalculator> channelFactory = new DuplexChannelFactory<ICalculator>(instanceContext, "WSDualHttpBinding_ICalculator"))
            //{
            //    ICalculator proxy = channelFactory.CreateChannel();

            //    using (proxy as IDisposable)
            //    {
            //            proxy.add(1, 2);
            //            Console.Read();
            //    }

            //}
            #endregion


        }
    }


    class MyDataClient : ClientBase<ICalculator>, ICalculator
    {
        internal MyDataClient(InstanceContext callback, string configendpoint)
            : base(callback, configendpoint)
        {


        }

        public void add(double x, double y)
        {
            this.Channel.add(x, y);
        }

        public void Subtract(double x, double y)
        {
            this.Channel.Subtract(x, y);
        }
    }




    //class CalculateCallback : ICallback
    //{

    //    void ICallback.DisplayResult(double x, double y, double result)
    //    {
          
    //    }
    //}
}

 

服务器端的配置

  <system.serviceModel>

    <!--<behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true"  httpGetUrl="http://localhost:9999/calculatorservice/metadata"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>-->

    <!--<services>
      <service name="Services.CalculatorService">
        <endpoint
          address="http://localhost:9999/calculatorservice"
          binding=""
     
          contract="Contracts.ICalculator" />


      </service>


    </services>-->


    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true"  httpGetUrl="http://localhost:9999/CalculatorService/metadata"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
 
    <services>
      <service name="Services.CalculatorService" behaviorConfiguration="metadataBehavior">
        <endpoint address="http://localhost:9999/CalculatorService" binding="wsDualHttpBinding"
          contract="Contracts.ICalculator" />
      </service>
    </services>
  </system.serviceModel>

 

 

客户端的配置

<system.serviceModel>
        <bindings>
            <wsDualHttpBinding>
                <binding name="WSDualHttpBinding_ICalculator" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00" />
                    <security mode="Message">
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" />
                    </security>
                </binding>
            </wsDualHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:9999/CalculatorService" binding="wsDualHttpBinding"
                bindingConfiguration="WSDualHttpBinding_ICalculator" contract="Contracts.ICalculator"
                name="WSDualHttpBinding_ICalculator">
                <identity>
                    <userPrincipalName value="zhangc-PC\Administrator" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>

转载于:https://www.cnblogs.com/qqloving/archive/2011/08/18/2145116.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值