c#——WCF和HTTP文件传输实验

news2024/11/19 22:37:29

(1)掌握HTTP协议下WCF服务应用程序构建方法。
(2)掌握WCF客户端和服务端的消息交换模式。
(3)掌握协定的设计及实现方法。
(4)熟悉WCF和HTTP的相关绑定设置。
(5)掌握流的读写操作方法。

在同一个解决方案中,分别编写服务端程序和客户端程序,利用HTTP和流传输实现文件下载功能。客户端程序运行效果如图A-4所示。

 具体要求
(1)基本功能:文件下载(必做)。
(2)功能扩展:文件上传(选做)。

重点:掌握HTTP协议下WCF服务应用程序构建方法;掌握WCF客户端和服务端的消息交换模式;掌握协定的设计及实现方法;熟悉WCF和HTTP的相关绑定设置。
难点:掌握协定的设计及实现方法;


MainWindow.xaml

Window x:Class="shiyan4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:shiyan4"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <GroupBox Grid.Row="0" Header="请选择可下载的文件">
            <ListBox x:Name="lb1"/>
        </GroupBox>
        <Border Grid.Row="1" Background="Beige" Padding="0 5 0 5">
            <Button x:Name="btnDownload" Content="开始下载" Width="100" Height="19" VerticalAlignment="Top" Click="btnDownload_Click"/>
        </Border>
        <GroupBox Grid.Row="2" Header="下载信息">
            <ScrollViewer>
                <StackPanel TextBlock.LineHeight="20">
                    <TextBlock x:Name="tb1" TextWrapping="Wrap" Margin="0 10 0 0"/>
                </StackPanel>
            </ScrollViewer>
        </GroupBox>
    </Grid>
</Window>

 MainWindow.xaml.cs

using ServiceReference1;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace shiyan4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
        }

        String[] info;

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Service1Client client=new Service1Client();
            info = client.getFilesInfo();
            foreach (String file in info)
            {
                String[] s = file.Split(",");
                Label label = new Label();
                label.Content = String.Format("文件名:{0},文件长度:{1}字节", s[0], s[1]) ;
                lb1.Items.Add(label) ;
            }
            client.Close();
            if(lb1.Items.Count > 0)
            {
                lb1.SelectedIndex = 0;
                btnDownload.IsEnabled = true;
            }
            else 
            {
                btnDownload.IsEnabled = false;
                addInfo("找不到可以下载的文件!");
            }

        }



        private void addInfo(String info)
        {
            tb1.Text += info;
            tb1.Text += Environment.NewLine;
        }

        private void btnDownload_Click(object sender, RoutedEventArgs e)
        {
            tb1 .Text = "";
            String[] a = info[lb1.SelectedIndex].Split(",");
            addInfo(String.Format("正在下载{0}", a[0]));
            ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
            Stream stream = client.DownloadStream(a[0]);
            String path=System.IO.Path.Combine(Environment.CurrentDirectory, a[0]);
            streamToFile(stream, path);
        }

        private void streamToFile(Stream stream,String path)
        {
            const int BUFSIZE = 4096;
            byte[] buffer = new byte[BUFSIZE];
            FileStream fileStream = File.Open(path, FileMode.Create, FileAccess.Write);
            int count=0;
            int all = 0;
            while ((count = stream.Read(buffer, 0, BUFSIZE)) > 0)
            {
                fileStream.Write(buffer, 0, count);
                all += count;
            }
            stream.Close();
            fileStream.Close();
            addInfo(String.Format("下载完成,共下载{0}字节,文件保存到{1}", all, path));
        }  
    }
}

IService1.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService1
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        List<String> getFilesInfo();
        [OperationContract]
        Stream DownloadStream(string fileName);
        // TODO: 在此添加您的服务操作
    }
}

Service1.svc

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService1
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。
    // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。
    public class Service1 : IService1
    {
        public static List<String> filesInfo;
        public static String path;

        public Stream DownloadStream(string fileName)
        {
            String filePath=Path.Combine(path, fileName);
            FileStream fileStream=File.OpenRead(filePath);
            return fileStream;
        }

        public List<string> getFilesInfo()
        {
            if (filesInfo == null)
            {
                filesInfo = new List<String>();
                path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DownloadFiles");
                DirectoryInfo directoryInfo = new DirectoryInfo(path);
                var f = directoryInfo.EnumerateFiles();
                foreach ( var f2 in f)
                {
                    //格式:文件名,以字节为单位的文件长度
                    filesInfo.Add(String.Format("{0},{1}",f2.Name,f2.Length));
                }
            }
            return filesInfo;
        }
    }
}

Web.config(这里是添加的配置文件)

<bindings>
		  <basicHttpBinding>
			  <binding name="b1" transferMode="Buffered" textEncoding="utf-8" messageEncoding="Text">
				  <security mode="None"/>
			  </binding>
		  </basicHttpBinding>
	  </bindings>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
	  <services>
		  <service name="WcfService1.Service1">
			  <endpoint binding="basicHttpBinding" bindingConfiguration="b1" contract="WcfService1.IService1"/>
		  </service>
	  </services>

写一下午了,累翻了,想死。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)

文章目录 1、CentOS安装OpenSSL1.1.1&#xff08;前置环境&#xff09;2、CentOS安装 Python 3.103、创建虚拟环境4、运行Django项目 1、CentOS安装OpenSSL1.1.1&#xff08;前置环境&#xff09; 编译安装Python3.10时需要openssl1.1.1 查看当前版本 & 删除openssl1.0 …

Java高并发核心编程—JUC显示锁原理

注&#xff1a;本笔记是阅读《Java高并发核心编程卷2》整理的笔记&#xff01; 显示锁 使用Java内置锁时&#xff0c;不需要通过Java代码显式地对同步对象的监视器进行抢占和释放&#xff0c;这些工作由JVM底层完成&#xff0c;而且任何一个Java对象都能作为一个内置锁使用&a…

Apache Kafka - ConsumerInterceptor 实战 (1)

文章目录 概述使用场景实战配置文件配置类自定义ConSumerInterceptor使用 概述 ConsumerInterceptor是Kafka中的一个重要组件&#xff0c;它允许开发人员在Kafka消费者端拦截和修改消息的处理过程。ConsumerInterceptor可以用于实现各种功能&#xff0c;从消息监控到数据转换和…

【Python开发】FastAPI 01:hello world

FastAPI 是一个轻量级的后端框架&#xff0c;对于定制化不高或者功能简单的业务完全可以拿他作为后台。 FastAPI 一个比较重要的特性就是异步&#xff0c;简单来说就是相比 django 和 flask 快&#xff0c;FastAPI 和 flask 的语法类似。本篇文章介绍 FastAPI 运用的简单实例&a…

从索引结点出发探索软、硬链接

索引结点的初步认识 对于整个计算机系统的资源管理&#xff0c;我们可以认为&#xff0c;OS先将这些资源的数据信息&#xff0c;给描述起来构成一个部分&#xff0c;然后再将它们组织起来&#xff0c;就能够实现由OS集中管理。举一个最经典的例子&#xff0c;进程的引入是为了…

Cos上传(腾讯云):图片存储方案

Cos上传(腾讯云) 01.图片存储方案介绍 目标 了解主流的图片存储方案 两种常见方案 方案一&#xff1a;存到自己公司购买的服务器上 优点&#xff1a;好控制 缺点&#xff1a;成本高由于图片都存放到自己的服务器上&#xff0c;占据空间很大 方案二&#xff1a;存到三方…

总结SpringBoot常用读取配置文件的3种方法

文章目录 1、使用 Value 读取配置文件2、 使用 ConfigurationProperties 读取配置文件3、读取配置文件中的List 1、使用 Value 读取配置文件 注&#xff1a;这种方法适用于对象的参数比较少的情况 使用方法&#xff1a; 在类上添加configuration注解&#xff0c;将这个配置对…

Hotbit交易平台停运,百万用户待清退,币圈危机再度蔓延

“币圈”的危机似乎还没有走到尽头。5月22日&#xff0c;加密货币交易平台Hotbit发文宣布&#xff0c;决定从世界标准时间当日4:00停止所有CEX&#xff08;中心化交易所&#xff09;操作&#xff0c;希望所有用户在6月21日4:00之前提取剩余资产。据悉&#xff0c;该平台在其任期…

微前端乾坤

1. 乾坤 简介 qiankun 是一个基于 single-spa 的微前端实现库&#xff0c;旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统 官网&#xff1a;https://qiankun.umijs.org/zh/guide 2.使用 背景&#xff1a; vue2.0 , vue-cli 5.0 主应用&#xff1a; 安装乾坤…

基于上下文折扣的多模态医学图像分割证据融合

文章目录 Evidence Fusion with Contextual Discounting for Multi-modality Medical Image Segmentation摘要本文方法Evidential SegmentationMulti-modality Evidence FusionDiscounted Dice Loss 实验结果 Evidence Fusion with Contextual Discounting for Multi-modality …

利用PaddleOCR识别增值税发票平台验证码(开箱即用)

前言:全国增值税发票查验平台验证码没什么好说的,根据指定的颜色识别验证码中的文字,图片如下 下面直接讲解利用paddleocr识别的思路,为什么使用paddleocr,因为paddle中集成了较好的ocr文字识别模型,开箱即用即可,废话不多说,剑指主题,识别思路步骤如下 步骤如下 1、…

BI技巧丨度量值的动态格式字符串

2023年4月版本新增了度量值的动态格式字符串功能。从字面上看可能小伙伴们不是很理解这个功能的用途&#xff0c;这里白茶给大家解释一下。 通俗一点来说&#xff0c;就是可以在数值中加入文本&#xff0c;将其转化为字符串&#xff0c;而不改变其原有的数据类型。 看到这里&…

Java调用第三方库JNA(C/C++)

GitHub - java-native-access/jna: Java Native Access 源代码 在Java 中使用C语言库的传统做法是使用JNI编程。但是现在有更好的替代方案&#xff0c;即JNA(Java Native Access)&#xff1b;JNA是一个开源的Java框架,是SUN公司推出的调用本地库方法的技术&#xff0c;是建立在…

传染病学模型 | Matlab实现SEIRS传染病学模型 (SEIRS Epidemic Model)

文章目录 效果一览基本描述模型介绍程序设计参考资料效果一览 基本描述 传染病学模型 | Matlab实现SEIRS传染病学模型 (SEIRS Epidemic Model) 模型介绍 SEIRS是一种基于计算机模拟的传染病学模型,用于研究人群中传染病的传播和控制。与其他传染病学模型不同,SEIRS模型考虑了…

第二章.­ Learning to Answer Yes­_No

第二章. Learning to Answer Yes_No 2.1 Perceptron Hypothesis Set 1.机器学习流程图&#xff1a; 在机器学习的整个流程中&#xff0c;模型的选择(Hypothesis Set)是非常重要的&#xff0c;它决定了机器学习的最终效果。 2.常用的机器学习模型——感知机&#xff08;Percep…

L2-001 紧急救援(dijkstra算法练习)

作为一个城市的应急救援队伍的负责人&#xff0c;你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候&#xff0c;你的任务是带领你的…

Android 12系统源码_窗口管理(二)WindowManager对窗口的管理过程

前言 上一篇我们具体分析了窗口管理者WindowManagerService的启动流程&#xff0c;对于WindowManagerService有了一个初步的认识。在此基础上&#xff0c;我本打算应该进一步分析WindowManagerService是如何管理系统中的各种窗口的&#xff0c;然而由于Android系统的架构设计&…

如何搭建远程服务器-(cpolar)

文章目录 前言一、安装注册下载安装包认证开通指定端口监听开机自启动设置 二、使用步骤电脑端远程手机端远程 三、卸载软件安装说明&#xff1a; 总结 前言 之前已经有写到一篇文章《如何用树莓派搭建远程服务器 (zerotier)》&#xff0c;对此已经使用了很长一段时间。 优点…

MySQL 事务(w字)

目录 事务 首先我们来看一个简单的问题 什么是事务 为什么会出现事务 事务的版本支持 事务提交方式 事务常见操作方式 设置隔离级别 事物操作 事物结论 事务隔离级别 理解隔离性 隔离级别 查看与设置隔离性 注意可重复读【Repeatable Read】的可能问题&#xff…

AI数字人盛行,如何选择合适的AI数字人制作平台?

2023万象大会已然开启了直播&#xff0c;当AI照进生活、照亮你我&#xff0c;为我们的想象力插上翅膀&#xff0c;世界变得更加便捷、更加智能。可以说近年来&#xff0c;AI帮助人们解决了各种问题&#xff0c;在提高生产效率、改善生活质量等方面做出来很大的贡献&#xff0c;…