【问题标题】:c#: how to include filename when sending files to an asmx servicec#:如何在将文件发送到 asmx 服务时包含文件名
【发布时间】:2015-03-17 08:48:24
【问题描述】:

我有一个 asmx 方法,它接受如下文件列表:

[WebMethod]
public void UploadFiles(List<byte[]> files)
{

}

Windows 元数据不包含在字节数组中。我尝试使用Dictionary&lt;filename, byte[]&gt;,但实现IDictionary 的类不可序列化。我也尝试使用KeyValuePair&lt;string, byte[]&gt;[],但 IMO 它看起来很脏。 还有其他方法可以包含文件名吗?

【问题讨论】:

  • 具有循环引用的字典和多个类是最普遍的不可序列化对象。还有很多其他方法可以发送它,包括只创建一个包含NamePayloadMyFile 类(或者你想怎么称呼它)。除了建议一个简单的数据结构之外,不确定您要问什么。
  • 不确定我是否理解,但您是否只是想将您的文件放入 byte[] 列表中?
  • @Flater 好吧,是的。我想数据结构是一种不错的方法。谢谢
  • @sr28 不,它是文件列表,1 个文件 = 1 个字节数组

标签: c# web-services asmx


【解决方案1】:

如 cmets 中所述,这可以通过制作自定义数据类轻松解决。

很遗憾,字典不可序列化,但这是 XML 序列化过程的固有缺陷。具有循环引用的数据类也是如此,它只是不起作用。
然而,WCF 已经设法解决了这些问题。但是您使用的是 .asmx (SOAP),因此您遇到了不幸的不兼容问题。

我只是创建一个自定义类:

[Serializable]
public class File
{
    public string FileName {get;set;}
    public byte[] Payload {get;set;}
}

然后将您的网络方法更改为:

[WebMethod]
public void UploadFiles(List<File> files)
{
    //...
}

简单但有效:)

【讨论】:

  • 我已经完成了这项工作,现在我得到了一个非常大的数组。你能推荐一些关于如何在传递给 Web 服务时分块或流式传输这个数组的链接吗?
  • 这完全是一个不同的问题。我会考虑根据文件的大小拆分您发送的 List (例如,一次只发送 X 个文件,以便您发送的 X 个文件的总大小不超过 1MB)。如果您需要这方面的帮助,最好创建一个新问题 :)
猜你喜欢
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2016-01-18
  • 2021-12-05
相关资源
最近更新 更多