WCF越来越流行,俺也在用,这是废话。项目中遇到需要图片上传,但是wcf上传会遇到一些异常,调试了N久,找了好多个解决方案才最终解决。代码直接贴上了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 |
/// <summary> /// 笔记图片上传 /// </summary> /// <param name="image"></param> /// <returns></returns> [OperationContract] [WebInvoke(RequestFormat = WebMessageFormat.Json, Method = "POST" , ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] public
Stream NoteUpFile(Stream image) { dynamic dy = null ; FileStream pFileStream = null ; try { byte [] bytes = ReadFully(image); //Stream转byte[] string
fileName = string .Format( @"Upload/Note/{0}.jpg" , Utilitys.GetGuid);<br> string
dirPath=System.AppDomain.CurrentDomain.BaseDirectory; if
(!Directory.Exists(dirPath + @"Upload/Note/" )) //如果不存在就创建file文件夹 { Directory.CreateDirectory(dirPath + @"Upload/Note/" ); //创建该文件夹 } string
path = dirPath + fileName; pFileStream = new
FileStream(path, FileMode.OpenOrCreate); pFileStream.Write(bytes, 0, bytes.Length); dy = new
{ code = "1" , msg = "上传成功!" , path = fileName }; } catch
(Exception ex) { throw
ex; } finally { if
(pFileStream != null ) pFileStream.Close(); } return
Comm.GetStream(dy); //这个方法是将对象json序列化之后转换为Stream utf8模式,至于为什么要这样做只能说wcf太操蛋了 返回的json会多带一个 d:"" 酱紫的:{"d":"Hello World!"},完全正常!(这里的d:是微软自动为我们的数据加的一层壳) } |
我们将json转为流模式 就不会出现多一个D的问题了
/// <summary> /// 返回输出的字符 /// </summary> /// <param name="dy">json的数据集合</param> /// <returns></returns> public static Stream GetStream(dynamic dy) { string jsonString = GkXsn.Com.Utility.JsonHelper.Serializer(dy); return new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); }
WCF并不支持Stream对象Length属性的序列化,也就是说,在客户端我们不能使用服务操作返回的Stream对象的Length属性。诸如stream.Length的调用会抛出NotSupportedException异常。采用此函数可解决上述问题
/// <summary>/// Stream转byte[]/// </summary> /// <param name="stream"></param> /// <returns></returns> private byte[] ReadFully(Stream stream) { // 初始化一个32k的缓存 byte[] buffer = new byte[32768]; using (MemoryStream ms = new MemoryStream()) { //返回结果后会自动回收调用该对象的Dispose方法释放内存 // 不停的读取 while (true) { int read = stream.Read(buffer, 0, buffer.Length); // 直到读取完最后的3M数据就可以返回结果了 if (read <= 0) return ms.ToArray(); ms.Write(buffer, 0, read); } } }
原文:http://www.cnblogs.com/xushaonian/p/3568229.html