WCF配置文件与文件下载之坎坷路

题外话:本以为我会WCF了,精通WCF了,毕竟刚做过一个WCF的项目,不就是写写契约接口,然后实现接口,改下配置。最后用控制台或者服务发布一下,不就能用了。不就是简单ABC吗?不是So Easy吗?做第二个项目的时候我悲剧了,被碰的头破血流!忽然发现什么什么都不会(第一个项目比照网上教程一步一步弄的),连写一个简单hello world都写不出来。我之前还以为自己很懂了……

一、WCF文件配置

      为了不重蹈覆辙,这次争取把他整懂整透(当然这才是入门而已)。WCF很强大,它的强大跟它的配置有很大的关系,所以我首先要先把它的配置搞懂。

     WCF的配置文件共分为两部分:服务端配置与客户端配置。两者由于功能的不同,在配置文件的使用上也略有不同。

WCF的服务端配置

服务端的配置文件主要包括endpoint、binding、behavior的配置。一个标准的服务端配置文件所包含的主要xml配置节如下所示:

 

<system.ServiceModel>

   <services>
      <service>
         <endpoint/>
      </service>
   </services>

   <bindings>
   <!—定义一个或多个系统提供的binding元素,例如<basicHttpBinding> --> 
   <!—也可以是自定义的binding元素,如<customBinding>. -->
      <binding>
      <!—例如<BasicHttpBinding>元素. -->
      </binding>
   </bindings>

   <behaviors>
   <!—一个或多个系统提供的behavior元素. -->
      <behavior>
      <!—例如<throttling>元素. -->
      </behavior>
   </behaviors>

</system.ServiceModel>

1.1 <services>配置节
在<services>配置节中可以定义多个服务,每一个服务都被放到<service>配置节中,WCF的宿主程序可以通过配置文件找到这些定义的服务并发布这些服务。
<service>配置节包含name和behaviorConfiguration属性。其中,name配置了实现Service Contract的类型名。类型名必须是完整地包含了命名空间和类型名。而behaviorConfiguration的配置值则与其后的<behaviors>配置节的内容有关。<endpoint>是<service>配置节的主体,其中,<endpoint>配置节包含了endpoint的三个组成部分:Address、Binding和Contract。由于具体的binding配置是在<bindings>配置节中完成,因而,在<endpoint>中配置了bindingConfiguration属性,指向具体的binding配置。如下所示:

<services> 
  <service name="MyService.Service1" behaviorConfiguration="MyBehavior"> 
    <endpoint address="" 
             binding="netTcpBinding" 
             bindingConfiguration="DuplexBinding" 
             contract="MyService.IHello" /> 
  </service> 
</services> 

我们也可以定义多个endpoint,例如:

<services> 
  <service 
      name="Microsoft.ServiceModel.Samples.CalculatorService" 
      behaviorConfiguration="CalculatorServiceBehavior"> 
    <endpoint address="" 
             binding="wsHttpBinding" 
             contract="Microsoft.ServiceModel.Samples.ICalculator" /> 
    <endpoint address="mex" 
             binding="mexHttpBinding" 
             contract=" Microsoft.ServiceModel.Samples.IMetadataExchange" /> 
  </service> 
</services> 

      如果address值为空,那么endpoint的地址就是默认的基地址(Base Address)。例如ICalculator服务的地址就是http://localhost/servicemodelsamples/service.svc,而IMetadataExchange服务的地址则为http://localhost/servicemodelsamples/service.svc/mex。这里所谓的基地址可以在

<service>中通过配置<host>来定义:

<service 
      name="Microsoft.ServiceModel.Samples.CalculatorService" 
      behaviorConfiguration="CalculatorServiceBehavior"> 
<host> 
    <baseAddresses> 
        <add baseAddress="http://127.0.0.1/ServiceModelSamples”/> 
    </baseAddresses> 
</host> 
<endpoint … /> 
</service> 

1.2 <behaviors>配置节
    当我们在定义一个实现了Service Contract的类时, binding和address信息是客户端必须知道的,否则无法调用该服务。然而,如果需要指定服务在执行方面的相关特性时,就必须定义服务的behavior。在WCF中,定义behavior就可以设置服务的运行时属性,甚至于通过自定义behavior插入一些自定义类型。例如通过指定ServiceMetadataBehavior,可以使WCF服务对外公布Metadata。配置如下:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="metadataSupport"> 
      <serviceMetadata httpGetEnabled="true" httpGetUrl=""/> 
    </behavior> 
    <serviceBehaviors> 
<behaviors> 

在WCF中,behavior被定义为Attribute,其中,System.ServiceModel.ServiceBehaviorAttribute和System.ServiceModel.OperationBehaviorAttribute是最常用的behavior。虽然,behavior作为Attribute可以通过编程的方式直接施加到服务上,但出于灵活性的考虑,将behavior定义到配置文件中才是最好的设计方式。
利用ServiceBehavior与OperationBehavior可以控制服务的如下属性:
1、 对象实例的生命周期;
2、 并发与异步处理;
3、 配置行为;
4、 事务行为;
5、 序列化行为;
6、 元数据转换;
7、 会话的生命周期;
8、 地址过滤以及消息头的处理;
9、 模拟(Impersonation);
例如,通过ServiceBehavior设置对象实例的生命周期:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="metadataSupport"> 
      <instanceContextMode httpGetEnabled="true" httpGetUrl=""/> 
    </behavior> 
    <serviceBehaviors> 
<behaviors>

这是通过使用配置文件指定的地址

另外我们还可以通过代码的方式指定地址:代码如下

   private static void Main(string[] args)
        {
            using (ServiceHost serviceHost = new ServiceHost(typeof (Service1)))
            {
                serviceHost.AddServiceEndpoint(typeof (IService1), new WSHttpBinding(),
                    "http://127.0.0.1:9999/Service1");
                serviceHost.AddServiceEndpoint(typeof (IService1), new NetTcpBinding()
                    , "net.tcp://127.0.0.1:8888/Service1");
                serviceHost.Opened += (s, e) => Console.WriteLine("服务已打开!");
                serviceHost.Open();
                Console.Read();
            }
        }

这里调用了ServiceHost 类的AddServiceEndpoint方法:它的抽象方法为

public ServiceEndPoint AddServiceEndpoint(Type implementedContract,Binding binding,string  address);

当然你还可以使用ServiceHost 继承自ServiceHostBase的方法AddServiceEndpoint:它的方法签名为:

public ServiceEndPoint AddServiceEndpoint(string implementedContract,Binding binding,string  address);

这里只是将implementedContract以字符串的形式表示服务契约类型的有效名称。

上面添加终结地就变成了

serviceHost.AddServiceEndpoint(“命名空间.IService1”,new WSHttpBinding(),http://127.0.0.1:9999/Service1);

基地址与相对地址

     除了向上面那样以绝对路径的方式指定服务的终结点地址外,还可以通过“基地址+相对地址”的方式进行设置。对于一个服务来说,可以指定一个或多个基地址,但是对于一种传输方式协议类型,只能具有一个唯一的基地址。服务的基地址与终结点相对地址可以通过编码的方式,在创建ServiceHost对象时在构造函数中指定。具体实现代码如下:

    internal class Program
    {
        private static void Main(string[] args)
        {
            Uri[] baseAddress = 
            {
              new Uri("http://127.0.0.1:8888/myservices"),
              new Uri("net.tcp://127.0.0.1/:8888")
            };

            using (ServiceHost serviceHost = new ServiceHost(typeof (Service1),baseAddress))
            {
                serviceHost.AddServiceEndpoint(
                    typeof (IService1), 
                    new BasicHttpBinding(),
                    "Service1");
                serviceHost.AddServiceEndpoint(
                    typeof (IService1), 
                    new NetTcpBinding(),
                     "Service1");
                serviceHost.Opened += (s, e) => Console.WriteLine("服务已打开!");
                serviceHost.Open();
                Console.Read();
            }
        }
    }

          上面的代码中,在寄宿Service1服务的时候,添加了两个基地址,一个是基于HTTP的,另外一个是基于net.tcp的。然后为Service1添加了两个终结地,基于HTTP的BasicHttpBinding和基于TCP的NetTcpBinding。添加的两个终结点均采用相对地址Service1。

          由于AddServiceEndpoint指定的是相对地址,所以WCF会根据绑定采用的传输协议在ServiceHost的基地址列表中寻找与之匹配的基地址,相对地址与基地址组合确定终结点的绝对地址。(完整地址为:http://127.0.0.1:9999/myservices/Service1).

         由于基地址与相对地址的匹配关系是根据绑定对象采用的传输协议确定的,所以对于一个确定的传输协议,最多只能有一个基地址。如果在上面的基地址中再加一个HTTP的基地址,那程序就会抛出异常。

如果采用上面配置文件的方式:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- 部署服务库项目时,必须将配置文件的内容添加到 
  主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
  <system.serviceModel>
    <services>
      <service name="ConsoleApplication1.Service1">
        <host>
          <baseAddresses>
            <add baseAddress = "http://127.0.0.1:9999/myservice" />
              <add baseAddress="net.tcp://127.0.0.1:9999/myservice"/>
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
        <endpoint address ="Service1" 
                  binding="basicHttpBinding" 
                  contract="ConsoleApplication1.IService1"
                  bindingConfiguration="HttpStreaming">            
        </endpoint>
          <endpoint address="Service1"
                    binding="netTcpBinding"
                    contract="ConsoleApplication1.IService1"
                    bindingConfiguration="netTcpBindingConfiguration"/>    
        <!-- Metadata Endpoints -->
        <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 --> 
        <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,
          请在部署前将以下值设置为 false 并删除上面的元数据终结点  -->
          <serviceMetadata httpGetEnabled="false"/>
          <!-- 要接收故障异常详细信息以进行调试,
          请将以下值设置为 true。在部署前设置为 false 
            以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="False" />
            <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
      <bindings>
          <basicHttpBinding>
              <binding name="HttpStreaming" maxReceivedMessageSize="67108864" transferMode="Streamed"/>
          </basicHttpBinding>
          <netTcpBinding>
              <binding name="netTcpBindingConfiguration"
                       closeTimeout="00:01:00"
                       openTimeout="00:01:00"
                       receiveTimeout="00:10:00"
                       sendTimeout="00:10:00"
                       transactionFlow="false"
                       transferMode="Buffered"
                       transactionProtocol="OleTransactions"
                       hostNameComparisonMode="StrongWildcard"
                       listenBacklog="10"
                       maxBufferPoolSize="2147483647 "
                       maxBufferSize="2147483647 "
                       maxConnections="10"
                       maxReceivedMessageSize="2147483647 ">
                  <readerQuotas maxDepth="64" maxStringContentLength="2147483647 " maxArrayLength="2147483647 " maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                  <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
                  <security mode="Transport">
                      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                  </security>
              </binding>
          </netTcpBinding>
      </bindings>
  </system.serviceModel>

</configuration>

 

注:如果采用代码和配置的方式,两者都会生效,所以必须确保两者的设置的内容不会相互冲突。

这是服务端的配置,真的搞明白了,确实还挺有意思的。不过在调试过程中出现了错误

在服务“Service1”实现的协定列表中找不到协定名称,这个问题费我半天时间,

出错的原因有两个:

1. 看契约是否写对, 这个一般不会写错

2.看配置文件:service name="命名空间名+服务名称"    endpoint contract="命名空间名+契约名称"

(这里有个小细节要注意, ""中不能出现空格,否则依然报错)

     我出的问题原因是第二种,命名空间名前多了空格。费了半天劲原来是自己的粗心大意,唉,真想把自己杀了……

    在编写配置中当然还出现了各种各样无法八门的问题,都是因为配置没有写对的原因,这也给我一个教训,编写代码一定不能粗心大意,不然都是血的代价……

    下面是本文的重点了,文件的下载。

二、WCF文件的下载

  其实WCF下载也没有什么可说的,就是写个返回Steam的接口就行了,关键就是写好配置文件就行了

(待续……)

 

转载于:https://www.cnblogs.com/smiler/p/3486841.html

处理WCF文件及解决方案后端 在创建项目后,将自动生成一个默认的服务契约(IService.cs)和一个默认的服务实现类(Service.cs)。WCF(Windows Communication Foundation)是一种用于构建分布式应用程序的技术,它提供了一种基于服务的架构,允许不同的应用程序之间进行通信。处理WCF文件及解决方案的后端涉及创建WCF服务、定义服务契约、实现服务、配置服务和部署服务等步骤。在处理WCF文件和解决方案的后端时,我们需要考虑以下几个方面:创建WCF服务、定义服务契约、实现服务、配置服务和部署服务。 阅读详情

相关推荐

WCF实现文件的上传和下载.zip

wcf实现,客户端将文件、视频等传到服务端,并存于根目录下,希望有会优化的可以存到服务端其他盘符,然后客户端可以去下载服务端的资源

WCF配置报错 在 ServiceModel 客户端配置部分中,找不到名称 和协定

<?xml version="1.0" encoding="utf-8" ?><configuration> <system.serviceModel> <client> <endpoint address="net.tcp://192.168.6.101:8000/DataAccessService" bindin...

weixin_30794499的博客 554

WCF上传下载文件以及测试完整实例

WCF文件下载上传源码以及测试服务源码,已更改WCF服务配额

【WCF】利用WCF实现上传下载文件服务

【WCF】利用WCF实现上传下载文件服务 引言 前段时间,用WCF做了一个小项目,其中涉及到文件的上传下载。出于复习巩固的目的,今天简单梳理了一下,整理出来,下面展示如何一步步实现一个上传下载的WCF服务。 服务端 1.首先新建一个名为FileService的WCF服务库项目,如下图: 2.将Service,IService重命名为Fil...

cxu123321的博客 868

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 320

Virtuoso ADE Explorer实战技巧:从基础操作到高级仿真

本文深入解析了Virtuoso ADE Explorer在模拟电路仿真中的核心价值与实战技巧。作为Cadence平台的专业工具,它专为高效、系统化的设计空间探索而生,能大幅提升PVT验证、参数扫描和蒙特卡洛分析的效率。文章从基础界面操作、并行仿真管理,到高级的参数扫描、数据报告生成及蒙特卡洛结果深度剖析,提供了全面的避坑指南与工作流优化建议,帮助工程师从重复劳动中解放,专注于电路设计与性能优化。

ios99的博客 898

在 ServiceModel 客户端配置部分中,找不到名称“$”和协定“$”的终结点元素。

访问wcf服务时报错: 在 ServiceModel 客户端配置部分中,找不到名称“$”和协定“$”的终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此名称匹配的终结点元素。 这种情况一般都是粗心惹的祸: 1.检查客户端的配置文件是不是App.config; 2.检查是否有相关的终结点; 3.检查客户端终结点名称是否和宿主程序配置的名称一致; 4

tigertianx的专栏 3564

基于多智能体深度强化学习的空地协同通信系统轨迹设计与访问控制

所属子方向: UAV assisted communication 名词注释 coordinated:协调、协同 base stations 基站,公用移动通信基站,是移动设备接入互联网的接口设备,是指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间进行信息传递的无线电收发信电台。 UAV-BS:无人机基站 cooperative-competitive game:合作竞争博弈 throughput :吞吐量,每秒比特数 bps,bits per second Determinis

skysys的研究小屋 4969

第六章 维护服务协定和数据协定

【摘要】 在第一章WCF简介中,你已经了解SOA的基本原则--服务之间共享数据架构和协定,而并非类或者类型。当你定义服务时,你通过定义服务协定以指定操作。服务协定描述该服务的操作、操作所使用的参数类型及其操作返回值的类型。WCF服务对外公布服务协定的定义,服务开发人员使用这些定义去构建相应的客户端。开发人员可以通过Visual Sutdio自带的添加服务向导或者svcutil实用工具为根据服

上善若水 的专栏 1387

Avellaneda & Stoikov’s market-making strategy 工程化处理

前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。这个里面有一些重要参数:很直观,可以直接取值的有:s = current market mid price (中间价,也就是【最佳卖价+最佳买价】/2)q = quantity of assets in inventory of base asset (也就是买入多少价值的股票数量)

weixin_42480337的博客 7068

Research Proposal:自动驾驶 行人运动预测

Research Proposal about Pedestrian/Cyclist Motion Prediction for Self-Driving Vehicles   If I can be provided with the opportunity to conduct PhD research in pedestrian/cyclist motion prediction for...

Poetry Wanderer的博客 3087

WCF Error: 客户端配置部分中,找不到引用协定{0}的默认终结点元素……

今天想验证一下System.ServiceModel.FaultException<T>,于是想通过一个Web页面调用WCF服务来弄一下。 可是了不幸的是Web层调用WCF的Client对象时报:“客户端配置部分中,找不到引用协定 的默认终结点元素……”,后来找了一下资料也算是解决了。 1. 服务端的配置(可以手写,也可用“WCF服务配置编辑器”) 1 &l...

ZYL300450的博客 406

el-table通过上下左右键移动光标

在Element Plus的el-table中包含el-input和el-select组件,要实现上下左右键控制光标位置,需要通过focus和blur跟踪判断当前是哪个el-input或el-select有焦点,当按键按下时,通过监听,计算下一个获取焦点元素的索引,通过focus方法将焦点切换至改元素。

秋思的博客 1350

在 ServiceModel 客户端配置部分中,找不到名称

今天在测试WCF 服务是时候,在客户端访问服务,使用ChannelFactory&lt;T&gt; 创建契约代理。通过在客户端添加引用生成的config 配置文件, 然后调用测试,结果提示: 在 ServiceModel 客户端配置部分中,找不到名称“WSHttpBinding_ICalculator-sss”和协定“Contracts.ICalculator”的终结点元素。这可能是因为未找...

www.v5qq.com的技术博客 1206

uni-app开发-第3篇:uni-app 页面与路由

本文详细介绍了 uni-app 中的页面开发与路由管理。首先,页面是应用的基础单元,创建页面时需在pages目录下新建文件夹和.vue文件,页面结构由<template>、<script>和<style>三部分组成。uni-app 页面生命周期函数包括onShow、onReady、onHide和onUnload,分别用于处理页面显示、渲染完成、隐藏和卸载时的逻辑。其次,路由管理通过pages.json文件配置页面路径和样式,并提供uni.navigateTo等方法进行路由

无 415

基于OpenCV和Dlib的头部姿态估计详细教程

本文详细介绍了基于OpenCV和Dlib的头部姿态估计方法。通过分析2D人脸特征点与3D头部模型的对应关系,利用PnP(Perspective-n-Point)算法求解头部在三维空间中的姿态。文章首先阐述了坐标系统转换原理,包括世界坐标系、相机坐标系和图像坐标系的转换关系,随后深入讲解了PnP问题的数学表述及求解步骤,并提供了使用Dlib检测68个面部特征点的代码示例。最后介绍了3D通用头部模型的构建方法,包括6点和14点模型的选择,为计算机视觉中的头部姿态估计提供了完整的技术实现方案。

FJN110的博客 335

WCF - NetCtP 双工错误列表

1. 在服务 Transfer 实现的协定列表中找不到协定名称 "IMetadataExchange" 将 ServiceMetadataBehavior 添加到配置文件或直接添加到 ServiceHost,以启用对该协定的支持 <?xml version="1.0" encoding="utf-8"?> <configuration> <startu...

weixin_30278311的博客 219

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【WCF】找不到引用协定的默认终端节点

最近在番茄项目中摸爬滚打,每天也是被bug虐千百遍啊! 涉及到将本地数据更新到服务器中,但是为了减少对数据库的连接,降低数据库的压力!我们需要把更新服务写到WCF中,这个时候,如果需要更新的时候只需要在D层中调用一下发布的接口,就可以进行更新操作了!   错误 就在D层引用服务的时候,发生了这个错误:   原因 虽然你是D层需要引用接口,但是最终使用的还是WPF界面(U层),然而...

凉快 635

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

WCF教程--使用流Stream进行文件的上传下载

为什么80%的码农都做不了架构师?>>> ...

weixin_34279246的博客 488

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

动态库中访问WCF服务端下载文件 ——异常处理

在使用WCF实现文件的上传与下载的过程中,客户端使用Windows窗体应用程序或Web应用程序,使用.config文件配置客户端可以正常运行, 而如果客户端是动态库文件形式,则运行异常: 动态库形式的客户端不能用App.config来配置服务环境,需要用代码来实现配置,根据服务端来实现客户端的绑定配置: 下面是是用配置文件和代码方式配置客户端的对比: 配置文件方式 <?xml version="1.0" encoding="utf-8" ?> 对应的代码配置: IFamilyFi

qq_43026206的博客 291

使用简单的wcf文件实现上传,下载文件到服务器

wcf是微软开发出的用户数据通信的app接口,在.net framework3.0中与wpf,wf一同集成,是.net框架的一部分。 具体请参见点击打开链接。    本文主要讲述了使用wcf服务契约来进行文件或者数据的服务器上传或者下载工作,使用的工具为vs2012(使用过程中发现了不少bug)。WCF是以契约来规定通信双方的沟通协议。双方必须定义相同的协议绑定才能实现沟通。本文使用基本的ht

1万+

利用WCF上传,下载,删除服务器文件

1.首先利用vs创建WCF服务程序。 2.添加接口文件和服务文件 IServiceFile.cs using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization; using Syst

♥鈺♡鉝♡錡♥ 1543

利用WCF实现上传下载文件服务

利用WCF实现上传下载文件服务 https://www.cnblogs.com/caizl/p/4326016.html 使用简单的wcf文件实现上传,线程下载文件到服务器,带进度条 https://blog.youkuaiyun.com/duanzi_peng/article/details/19037777 WCF 支持流式传输文件---大文件的上传下载实例+源码 https://www.jia...

qq_18932003的博客 273
上一篇: 使用Visual Studio 2010打造C语言编译器
下一篇: CodeBlocks "no such file or directory" 错误解决方案(创建类找不到头文件)
dddp75921
博客等级 码龄12年 9粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值