Asp.NET 简易通用WebServices 附件服务
[toc]
总述:
用了很久的附件分离服务, .NET 2.0平台开始使用. 配置好服务后, 由调用端定义并管理目录级次. 调用端存储目录即可.
附件服务:
相应配置节点放入 web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<httpRuntime maxRequestLength="409600" executionTimeout="60000" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true"/>
<compilation debug="true"/>
</system.web>
<appSettings>
<add key="path" value="D:\XXX\FileAttachments\"/>
<add key="pathSignature" value="D:\XXX\Signature\"/>
</appSettings>
</configuration>
代码部分;
- 采用较早的.NET 2.0 部分, 所以写法较旧, 写入时委托异步先写临时文件, 完毕再写入真实文件. 减少一定的资源占用.
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.IO;
using System.Configuration;
using System.Text;
using System.Threading;
namespace SY_FileService
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class FileService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public bool upload(byte[] f, string path,string fileName)
{
try
{
var path1 = ConfigurationManager.AppSettings["path"] + path;
if (!Directory.Exists(Path.GetDirectoryName(path1)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path1));
}
if (!File.Exists(path1))
{
new Thread(delegate()
{
var tmppath = ConfigurationManager.AppSettings["path"] +"文件映射/"+ DateTime.Now.ToString("yyyyMMdd") + ".txt";
if (!Directory.Exists(Path.GetDirectoryName(tmppath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(tmppath));
}
using (FileStream fs = new FileStream(tmppath, FileMode.Append, FileAccess.Write, FileShare.Write))
{
using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
{
sw.Write(path + " * " + fileName + "\r\n");
}
}
}) { IsBackground=true}.Start();
File.Create(path1).Close();
}
File.WriteAllBytes(path1, f);
return true;
}
catch (Exception)
{
return false;
}
}
[WebMethod]
public bool Delete(string path)
{
try
{
var path1 = ConfigurationManager.AppSettings["path"] + path;
if (!Directory.Exists(Path.GetDirectoryName(path1)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path1));
}
if (File.Exists(path1))
{
File.Delete(path1);
}
return true;
}
catch (Exception ex)
{
return false;
}
}
[WebMethod]
public byte[] Download(string path)
{
try
{
var path1 = ConfigurationManager.AppSettings["path"] + path;
if (!Directory.Exists(Path.GetDirectoryName(path1)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path1));
}
if (File.Exists(path1))
{
return File.ReadAllBytes(path1);
}
return new byte[] { };
}
catch (Exception)
{
return new byte[] { };
}
}
[WebMethod]
public bool uploadSignature(byte[] f, string path, string fileName)
{
try
{
var path1 = ConfigurationManager.AppSettings["pathSignature"] + path;
if (!Directory.Exists(Path.GetDirectoryName(path1)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path1));
}
if (!File.Exists(path1))
{
new Thread(delegate()
{
var tmppath = ConfigurationManager.AppSettings["path"] + "文件映射/" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
if (!Directory.Exists(Path.GetDirectoryName(tmppath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(tmppath));
}
using (FileStream fs = new FileStream(tmppath, FileMode.Append, FileAccess.Write, FileShare.Write))
{
using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
{
sw.Write(path + " * " + fileName + "\r\n");
}
}
}) { IsBackground = true }.Start();
File.Create(path1).Close();
}
File.WriteAllBytes(path1, f);
return true;
}
catch (Exception)
{
return false;
}
}
[WebMethod]
public byte[] DownloadSignature(string path)
{
try
{
var path1 = ConfigurationManager.AppSettings["pathSignature"] + path;
if (!Directory.Exists(Path.GetDirectoryName(path1)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path1));
}
if (File.Exists(path1))
{
return File.ReadAllBytes(path1);
}
return new byte[] { };
}
catch (Exception ex)
{
return new byte[] { };
}
}
}
}
如下以签名为例, 表示的调用代码;
HttpResult HttpUploadFile(string url, byte[] fileBuffer, string fileName)
{
// 设置参数
var request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = new CookieContainer();
request.AllowAutoRedirect = true;
request.Method = "POST";
string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
var itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
var endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
//请求头部信息
var headerBuilder = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
var headerBytes = Encoding.UTF8.GetBytes(headerBuilder.ToString());
var requestStream = request.GetRequestStream();
requestStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
requestStream.Write(headerBytes, 0, headerBytes.Length);
requestStream.Write(fileBuffer, 0, fileBuffer.Length);
requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
requestStream.Close();
//发送请求并获取相应回应数据
var response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
var responseStream = response.GetResponseStream();
var streamReader = new StreamReader(responseStream, Encoding.UTF8);
//返回结果
string content = streamReader.ReadToEnd();
var result = JsonConvert.DeserializeObject<HttpResult>(content);
return result;
}
public byte[] DownloadSignature(string path) {
BMPFileService.DownloadSignatureRequest inValue = new BMPFileService.DownloadSignatureRequest();
inValue.Body = new BMPFileService.DownloadSignatureRequestBody();
inValue.Body.path = path;
BMPFileService.DownloadSignatureResponse retVal = ((BMPFileService.FileServiceSoap)(this)).DownloadSignature(inValue);
return retVal.Body.DownloadSignatureResult;
}
//使用调用:
appr.Signature = a["签名"] == DBNull.Value ? "" : Convert.ToBase64String(fs.DownloadSignature(HttpUtility.UrlDecode(a["签名"].ToString(), Encoding.UTF8)));
同理, 相应的上传配置文件, 需要自定义目录, 下载时取得端口, 需要自定义配置:
<add key="FileApiHost" value="localhost:9992" />
<add key="SignPath" value="XXX\Content\Signatures\" />
<add key="ProjectAttachmentPath" value="XXX/Content/ProjectAttachmentFiles/" />
<add key="FileServer" value="/XXXFiles" />
Asp.NET 简易通用WebServices 附件服务的更多相关文章
- ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器
ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器一:闲谈一下:1.现在任务跟踪管理系统已经开发快要结束了,抽一点时间来写一下,想一想自己就有成就感啊!! ...
- (16)ASP.NET Core 通用主机(HostBuilder)
1.前言 ASP.NET Core应用程序可以配置和启动主机(Host).主机负责应用程序启动和生命周期管理.通用主机用于无法处理HTTP请求的应用程序.通用主机的用途是将HTTP管道从Web主机AP ...
- ASP.NET MVC传送参数至服务端
ASP.NET MVC传送参数至服务端,前端与服务端的写法,你可以参考与采用适合你的需求的.当你只传递一两个参数也许觉得没有什么,如果一个方法中带的参数多的话,可以考虑model,前端可以考虑对象进行 ...
- GPRS GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可用的一种移动数据业务,属于第二代移动通信中的数据传输技术
GPRS 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可 ...
- MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务
ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...
- ADs系列之通用数据解析服务GAS(即将开源)
面对成百上千的生产系统用户操作数据接入落地,你是否厌倦了每次机械编写打包解包的代码?对一次性接入多个数据的时候,还要对不同人联调,费时费力,你是否还会手忙脚乱,忙中不断出错?是否当数据出问题了,用的时 ...
- 在 ASP.NET Core 中执行租户服务
在 ASP.NET Core 中执行租户服务 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunna ...
- ASP.NET Core 2.0 : 五.服务是如何加载并运行的, Kestrel、配置与环境
"跨平台"后的ASP.Net Core是如何接收并处理请求的呢? 它的运行和处理机制和之前有什么不同? 本章从"宏观"到"微观"地看一下它的 ...
- ASP.NET WebAPI构建API接口服务实战演练
一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...
随机推荐
- phpexcel 使用说明
下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...
- 在PL/SQL中调用Oracle存储过程
存储过程 1 什么是存储过程? 用于在数据库中完成特定的操作或者任务.是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用. 2 存储过程的参数模式 存储过程的参数特性: IN类型的参数 ...
- Microsoft宣布为Power BI提供AI模型构建器,关键驱动程序分析和Azure机器学习集成
微软的Power BI现在是一种正在大量结合人工智能(AI)的商业分析服务,它使用户无需编码经验或深厚的技术专长就能够创建报告,仪表板等.近日西雅图公司宣布推出几款新的AI功能,包括图像识别和文本分析 ...
- ansible 自动化运维
Ansible 自动化运维 ansible安装epel #yum list all *ansible*#yum install *ansible*#yum info ansible#rpm -ql a ...
- AS 400 常用命令
转自:http://blog.chinaunix.net/uid-22375044-id-3049793.html 一.命令技巧 命令构成: CRT* (Creat) 创建 WRK* (Work Wi ...
- Linux 添加DNS配置
Centos7.5 系统,保存退出后自动生效 vi /etc/resolv.conf #阿里云DNS nameserver 223.5.5.5nameserver 223.6.6.6 #百度DNSna ...
- 谈一谈socket与java
用java中socket实现socket聊天 1, 什么是socket Socket 是指网络套接字,什么是套接字呢? 这是网络上一种端对端的网络协议,端口就是进程号,socket在网 ...
- spring boot 的参数配置。
https://blog.csdn.net/baidu_24237655/article/details/72772402
- C++ 状态机接口
最近的状态极差,甚至代码也写不下去了.给自己手臂上的两刀没有任何的作用,看来早已经是麻痹了. 一直想弄一个勉强能用的状态机,用于在各种涉及到状态转换的时候用到,然而脑子并不是太清醒. 先放在这里一个接 ...
- linux系统如何发送邮件
安装应用yum install mailx sendmail -y接着修改/etc/mail.rc文件,添加一下参数#末尾添加 zabbix 发送告警信息邮箱(按照自己的情况修改)set from= ...